Програмирование pic на СИ.

Поклонники продукции Microchip Technology Inc тусуются тут.
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

Аlex писал(а):Ну, примерно как то так :
Спасибо!
Начало - это текущее значение rtc_timer на момент активации таймера. Что бы знать когда его останавливать.

А теперь про тонкости :)
У каждого таймера могут быть свои функции выполняемые по окончании работы таймера.
Как реализовать массив предопределенных таймеров?
{0,0,10,func1},
{0,0,15,func2},
и т.д.
Будем считать, что все функции заранее предопределены. Запускаются они без параметров.

P.S. а нафига функции, я тут подумал. а не проще ли ставить флаг, что таймер отработал? :) Количество таймеров фиксированно, их задачи заранее ясны. Меняется только время их запуска.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Програмирование pic на СИ.

Сообщение Siarzhuk »

spongebob писал(а): Как реализовать массив предопределенных таймеров?
{0,0,10,func1},
{0,0,15,func2},
так сойдёт?

Код: Выделить всё

void func1(void);
[...]

struct {
   [...]
   void (*tmrFuncPtr)(void);
} a[] = {
  { 0, 0, 10, func1 },
[...]
};

void func1(void)
{
[...]
}
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

Siarzhuk писал(а):так сойдёт?
Ещё как сойдёт :) спасибо!
Пойду экспериментировать.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

spongebob писал(а): У каждого таймера могут быть свои функции выполняемые по окончании работы таймера.
Как реализовать массив предопределенных таймеров?
{0,0,10,func1},
{0,0,15,func2},
Если у Вас есть тип-таймер (как в моём примере - Timer), то массив этих типов создать не проблема :

Код: Выделить всё

Timer   timers[10];
Если нужно сразу с инициализацией, то :

Код: Выделить всё

Timer   timers[]={
  {0,0,0,func1},       //
  {0,0,0,func2},       //
  {0,0,0,0},           // В этом таймере нет пока функции, присваиваться будет потом при запуске таймера.
   ...........
};
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

Alex, Спасибо!
Пробую различные комбинации. Выбираю наиболее удобный вариант.

p.s. а кстати, а как определить функцию потом? это на будущее мне. и можно ли её передать как аргумент другой функции (которая активиурет таймер)?
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Програмирование pic на СИ.

Сообщение Siarzhuk »

spongebob писал(а):p.s. а кстати, а как определить функцию потом? это на будущее мне. и можно ли её передать как аргумент другой функции (которая активиурет таймер)?

Код: Выделить всё

typedef void (*TimerProc)(void);

void SetHandler(TimerProc proc)
{
[...]
}

void Handler(void)
{
[...]
}

int main ([...])
{
[...]
  SetHandler(Handler);
[...]
}
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

Боюсь, что я не понял :(
Допустим у меня есть пяток функций func1() .. func5().
И в зависимости от каких-либо событий мне нужно тому или иному таймеру присвоить данную фунцкию при инициализации.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Код: Выделить всё

typedef struct{
  unsigned          enabled :1;
  unsigned          start :1;
  unsigned long     time;
  void              (*p_func)();
}Timer;

Timer   timer[5];  // Массив таймеров

void func1(void){  // Вызываемая функция

}

............
............

timer[0].p_func = func1;  // Присваиваем первому таймеру функцию func

............
............

timer[0].p_func();    // Вызов функции первого таймера

............
............
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

Снова я со своими структурами
Придумал я "меню" для настройки своего девайса и захотелось мне её улучшить и унифицировать.

Код: Выделить всё

struct _curmenuitem { // текущая позиция
   unsigned char x:4;
   unsigned char y:4;
} curmenuitem;

const struct _menuitem { // пункт меню
   const char *name; // название пункта
   void (*mL)(void);  // действие при нажатии кнопки Влево
   void (*mR)(void); // -- Вправо
   void (*mU)(void); // -- Вверх
   void (*mD)(void); // -- Вниз
} menuitem[10][3] = { тут перечисляются пункты
   {
      {"Var 1",m_prev,m_next,m_null,m_child},
      {"Time 1",m_time_d,m_time_u,m_parent,m_child},
      {"Temp 1",m_temp_d,m_temp_u,m_parent,m_null}
   },
   
и т.д.
функции m_time_d, m_time_u, m_temp_d, m_temp_u занимаются тем, что меняют значения различных переменных в зависимости от пункта меню (по данным curmenuitem.x и curmenuitem.y)
это пришло мне в голову быстро - реализовал (возможно так и оставлю, но на будущее хотелось бы как-то облагородиться)
В структуру добавить указатель на переменную которой нужно управлять (или вообще никакой переменной). Переменные могут быть разных типов (ну или одного, если нет возможности делать разного)
и желательно, что бы можно было в качестве этой переменной использовать элемент массива.
spongebob
Грызет канифоль
Сообщения: 289
Зарегистрирован: Пт мар 20, 2009 12:25:47
Откуда: Ivanovo
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение spongebob »

разобрался с указателями этими... памяти они что-то жрут очень много.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Указатель, как правило, имеет размер в одно маш. слово. Т.б. int.
Пока_без_кота
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Re: Програмирование pic на СИ.

Сообщение Пока_без_кота »

Доброго времени суток. Компилятор HI-TECH Software\PICC\9.71a. Пытаюсь использовать библиотечные функции чтения/записи ЕЕПРОМ.
В функции main есть бесконечный цикл
Спойлер

Код: Выделить всё

	while	(1)
	{
		asm("clrwdt");
		eeprom_read(0);
		eeprom_write(0,1);
	}
Компилятор развернул это в следующее
Спойлер

Код: Выделить всё

27:                	while	(1)
28:                	{
29:                		asm("clrwdt");
   02F    0064     CLRWDT
30:                		eeprom_read(0);
   030    3000     MOVLW 0
   031    2037     CALL 0x37
31:                		eeprom_write(0,1);
   032    018E     CLRF 0xe
// дальше до адреса 038 пустота, куда подевался код функции eeprom_write и возврат я, не знаю....
Добавляю после записи в ЕЕПРОМ один "nop" и получаю
Спойлер

Код: Выделить всё

27:                	while	(1)
28:                	{
29:                		asm("clrwdt");
   02F    0064     CLRWDT
30:                		eeprom_read(0);
   030    3000     MOVLW 0
   031    2038     CALL 0x38
31:                		eeprom_write(0,1);
   032    018E     CLRF 0xe
   033    0A8E     INCF 0xe, F
   034    3000     MOVLW 0
   035    200C     CALL 0xc
32:                		asm("nop");
   036    0000     NOP
//  дальше до адреса 038 пустота
Прощу прощению за такие тупые вопросы, просто в книжке много всяких заумностей, а вот доступного объяснения такого поведения компилятора я не нахожу :dont_know:
Аватара пользователя
Zhuk72
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Zhuk72 »

Аналогичные функции в ХС8 разворачиваются в точную копию рекомендации из ДШ, лично проверял.
Намек очень толстым получился?
:?
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25163
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Програмирование pic на СИ.

Сообщение КРАМ »

Пока_без_кота писал(а): Прощу прощению за такие тупые вопросы, просто в книжке много всяких заумностей, а вот доступного объяснения такого поведения компилятора я не нахожу :dont_know:
Вы смотрите дизасм, причем собственного файла. А библиотечные функции находятся В ДРУГОМ. Поэтому нужно смотреть содержимое Program Memory, либо включить симулятор и по шагам зайти ВНУТРЬ библиотечной функции, тогда среда откроет дизасм искомого участка.
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Програмирование pic на СИ.

Сообщение DarkWolf »

Подскажите как обработать прерывание MCLR Reset? Контроллер PIC16F1503. Не могу разобраться по даташиту..
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Програмирование pic на СИ.

Сообщение Аlex »

Reset - это не прерывание. Это сброс.
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Програмирование pic на СИ.

Сообщение DarkWolf »

А как тогда его отследить? Питание до 0 микроконтроллера не падает, но сброс происходит. Нужно его отследить и выполнить определенное действие..
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Програмирование pic на СИ.

Сообщение uldemir »

А люди посмотрят и скажут: "Собаки летят. Вот и осень."
DarkWolf
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср ноя 05, 2014 19:04:31

Re: Програмирование pic на СИ.

Сообщение DarkWolf »

Спасибо! Почитал и напросился следующий код:
проверяю был ли сброс по питанию, снижению напряжения, или ресет. Но почему то код выполняется один раз.. Правда сброс происходит в очень короткое время примерно раз в пол секунды и вот этого не отслеживается..

Код: Выделить всё

 if ((!PCONbits.nRMCLR)||(!PCONbits.nBOR)||(!PCONbits.nPOR))
        {
            PCONbits.nRMCLR = 1;
            PCONbits.nBOR = 1;
            PCONbits.nPOR = 1;
       }
конфигурация следующая:

#pragma config FOSC = INTOSC // Oscillator Selection Bits (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = ON // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)

// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LPBOR = OFF // Low-Power Brown Out Reset (Low-Power BOR is disabled)
#pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled)

Что я делаю не так?
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Програмирование pic на СИ.

Сообщение uldemir »

#pragma config WDTE = ON // Watchdog Timer Enable (WDT disabled)
Ы?

А по поводу флагов, вы прочитали, какие надо сбрасывать, а какие нет?
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Ответить

Вернуться в «PIC»