Здравствуйте, гость ( Вход | Регистрация )

Рейтинг 4



Дополнительные ссылки

 | Категория: PIC24
entry 25.3.2010, 11:07
Добавлены макросы для работы с внешними прерываниями и изменениями состояния

Код
  EDGE_INT(Pin1) = 1; - Позволяет установить фронт срабатывания              
    F_INT(Pin1) = 0;       - Позволяет проверить или сбросить флаг            
    P_INT(Pin1,pri);        - установить приоритет обозначенного вывода            
    INTInterrupt(Pin1)     - сделать подстановку в функции обработчика прерывания  
    CH_EN(Pin1) = 1;     - Разрешить контроль изменения состояния              
    CH_PU(Pin1) = 1;     - Включить подтягивающие резисторы


Обновление на 24 марта 2010.

 | Категория: PIC24
entry 2.3.2009, 19:06
В продолжение разговора о макросах для работы с портами начатого здесь
Выкладываю откорректированный файл макросов для работы с портами. Оригинал
Для работы необходимо прочитать статью и скачать необходимый для работы файл bfa.h.
Обновление на 24 марта 2010.
Прикрепленный файл  c30portmacros_1.0.36a_.rar ( 3.94 килобайт ) Кол-во скачиваний: 140

Добавлены макросы для работы с внешними прерываниями и изменениями состояния
Код
Определив вывод для внешнего прерывания  BIT_DATA   A, 14, H
Можно сделать
   EDGE_INT(Pin1) = 1;       - Позволяет установить фронт срабатывания              
   F_INT(Pin1) = 0;          - Позволяет проверить или сбросить флаг            
   P_INT(Pin1,pri);          - установить приоритет обозначенного вывода            
   INTInterrupt(Pin1)        - сделать подстановку в функции обработчика прерывания  
Определив вывод для контроля изменения  BIT_DATA   B, 15, H
   Можно сделать
   CH_EN(Pin1) = 1;          - Разрешить контроль изменения состояния              
   CH_PU(Pin1) = 1;          - Включить подтягивающие резисторы


Обновление на 5 апреля 2009
Прикрепленный файл  c30portmacros.rar ( 1.42 килобайт ) Кол-во скачиваний: 227

Добавил настройку УАРТов выглядит это так
Описываем скорость и номкр порта
Код
#define BRGUART2          9600, 2

До использования задаем частоту генератора
Код
#define FREQ  8000000           // Частота генератора в герцах

Макрос так выглядит.
Код
#define TST_BRGH(uartN)       BFA(BFA_RD, U##uartN##MODE, BRGH)
   #define _setBrg(valBrg,uartN) if(TST_BRGH(uartN))                 \
                                 U##uartN##BRG=(FREQ)/2/4/(valBrg)-1;\
                                 else                                \
                                 U##uartN##BRG=(FREQ)/2/16/(valBrg) -1;
   #define SET_BRGH(x)           _setBrg(x)

Применяем так
Код
SET_BRGH(BRGUART2);

Добавил макрос для инструкции DISI
Код
#define DISI(n) \
     asm volatile ("disi #%0" \
     : /* no outputs */ \
     : "i" (n))


С учетом версии 1.0.24 (от 4 марта 2009) файла bfa.h который надо включить в проект для возможности обоюдного использования макросов.
Прикрепленный файл  c30portmacros1024.rar ( 1.17 килобайт ) Кол-во скачиваний: 423


Исправил по состоянию на 03 03 2009 с учетом атомарной работы.
Прикрепленный файл  c30portmacros.rar ( 1.17 килобайт ) Кол-во скачиваний: 204



Макрос позволяет однажды определив вывод
Код
#define  LED0     A, 10, L
      #define  LED1     A, 7,  L
      #define  LED2     A, 8,  L

производить с ним следующие действия

Код
  
     OFF(LED0); //Погасить светодиод
      OFF(LED1); //Погасить светодиод
      OFF(LED2); //Погасить светодиод
      
      
      if(SIGNAL(KN0)) //проверить кнопку
      {
       .............
      }
      
      OPEND_DRAIN_ON(OUT0);   // Установить режим выхода с открытым сток
      SET_DIR(OUT0,Out);      // Настроить на вывод
      AD1PCFG = ENABLE_ALL_DIG_0_15;
      ANALOG_INPUT_ON(1);     // Подключить аналоговый вход
      ANALOG_INPUT_OFF(1);    // Отключить аналоговый вход
                        
      if (SIGNAL(IMPUT0))     // На входе уровень активный?
      ON(OUT0);               // Установить активный уровень
      OFF(OUT0);              // Сбросить активный уровень
      HIGH(OUT0);             // Установить высокий уровень
      LOW(OUT0);              // Установить низкий уровень
      TOGGLE(OUT0);           // Инвертировать выход
      if (LATCH(OUT0))        // Уровень активный?
      if (DIR_IS_OUT(OUT0))   // Направление на вывод?
      if (DIR_IS_IN(OUT0))    // Направление на вход?
      Tmp = BITNUM(OUT0);     // Возвращает номер бита

Дя работы с аналоговыми входами надо добавить #include "adc.h"


Для работы с TNKernel привязывая системные тики к миллисекундам удобно пользоваться таким макросом
Код
#define FREQ  8000000           // Системная частота в Герцах
          #define OS_TMR_TICK 5000        // Количество тактов процессора в одном системном тике
          /* Количество системных тиков в миллисекундах */
          static inline unsigned OS_MS(unsigned var)
          {
             return FREQ / 2 / 1000 * (var) / OS_TMR_TICK;
          }

И например так ret = tn_task_sleep(OS_MS(100)); используя можно надеяться, что время через которое может быть вызвана задача будет около 100 мСек.

Тоже только для jacOs и PICC18 будет выглядеть так
Код
#define FREQ  8000000           // Системная частота в Герцах
          #define OS_TMR_TICK 5000        // Количество тактов процессора в одном системном тике
          /* Количество системных тиков в миллисекундах */
          static inline unsigned OS_MS(unsigned var)
          {
             return FREQ / 4 / 1000 * (var) / OS_TMR_TICK;
          }