Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

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

Ср фев 01, 2017 13:03:11

Аlex писал(а):Ну, примерно как то так :

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

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

P.S. а нафига функции, я тут подумал. а не проще ли ставить флаг, что таймер отработал? :) Количество таймеров фиксированно, их задачи заранее ясны. Меняется только время их запуска.

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

Ср фев 01, 2017 13:29:26

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


так сойдёт?

Код:
void func1(void);
[...]

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

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

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

Ср фев 01, 2017 13:44:25

Siarzhuk писал(а):так сойдёт?

Ещё как сойдёт :) спасибо!
Пойду экспериментировать.

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

Ср фев 01, 2017 14:48:06

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},           // В этом таймере нет пока функции, присваиваться будет потом при запуске таймера.
   ...........
};

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

Ср фев 01, 2017 15:59:04

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

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

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

Ср фев 01, 2017 16:42:57

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


Код:
typedef void (*TimerProc)(void);

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

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

int main ([...])
{
[...]
  SetHandler(Handler);
[...]
}

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

Чт фев 02, 2017 09:44:53

Боюсь, что я не понял :(
Допустим у меня есть пяток функций func1() .. func5().
И в зависимости от каких-либо событий мне нужно тому или иному таймеру присвоить данную фунцкию при инициализации.

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

Чт фев 02, 2017 13:23:05

Код:
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();    // Вызов функции первого таймера

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

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

Сб фев 11, 2017 21:00:15

Снова я со своими структурами
Придумал я "меню" для настройки своего девайса и захотелось мне её улучшить и унифицировать.
Код:
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)
это пришло мне в голову быстро - реализовал (возможно так и оставлю, но на будущее хотелось бы как-то облагородиться)
В структуру добавить указатель на переменную которой нужно управлять (или вообще никакой переменной). Переменные могут быть разных типов (ну или одного, если нет возможности делать разного)
и желательно, что бы можно было в качестве этой переменной использовать элемент массива.

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

Вт фев 14, 2017 11:25:22

разобрался с указателями этими... памяти они что-то жрут очень много.

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

Вт фев 14, 2017 12:44:00

Указатель, как правило, имеет размер в одно маш. слово. Т.б. int.

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

Вт фев 14, 2017 21:25:36

Доброго времени суток. Компилятор 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:

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

Ср фев 15, 2017 06:39:32

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

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

Ср фев 15, 2017 07:26:58

Пока_без_кота писал(а):Прощу прощению за такие тупые вопросы, просто в книжке много всяких заумностей, а вот доступного объяснения такого поведения компилятора я не нахожу :dont_know:

Вы смотрите дизасм, причем собственного файла. А библиотечные функции находятся В ДРУГОМ. Поэтому нужно смотреть содержимое Program Memory, либо включить симулятор и по шагам зайти ВНУТРЬ библиотечной функции, тогда среда откроет дизасм искомого участка.

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

Пн авг 07, 2017 10:29:57

Подскажите как обработать прерывание MCLR Reset? Контроллер PIC16F1503. Не могу разобраться по даташиту..

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

Пн авг 07, 2017 11:02:42

Reset - это не прерывание. Это сброс.

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

Пн авг 07, 2017 11:29:11

А как тогда его отследить? Питание до 0 микроконтроллера не падает, но сброс происходит. Нужно его отследить и выполнить определенное действие..

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

Пн авг 07, 2017 11:39:33

http://ww1.microchip.com/downloads/en/D ... 01607D.pdf <-- страница 56

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

Пн авг 07, 2017 12:54:51

Спасибо! Почитал и напросился следующий код:
проверяю был ли сброс по питанию, снижению напряжения, или ресет. Но почему то код выполняется один раз.. Правда сброс происходит в очень короткое время примерно раз в пол секунды и вот этого не отслеживается..
Код:
 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)

Что я делаю не так?

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

Пн авг 07, 2017 14:08:47

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

А по поводу флагов, вы прочитали, какие надо сбрасывать, а какие нет?
Ответить