Как указать имя таймера в зависимости от чипа, в который он будет компилироваться?

Мне нужно включить прерывание по таймеру для чипа, а тем временем я тестирую код на Arduino Nano, а не (кормить чип, тестировать чип)++.

Итак, как часть кода я должен TIMSK0 |= (1 << OCIE0A);, который отлично работает на Arduino Nano, но его нужно изменить на TIMSK (без 0) для ATtiny45.

Я планировал сделать что-то вроде

#define NANO//Поместите // перед AtTiny45
#ifdef NANO
  const char in  = A0;
  const char out = 3;
  const char pwr = 10;
  char *timer = &TIMSK0;
#else
  const char in  = 3;
  const char out = 0;
  const char pwr = 1;
  char *timer = &TIMSK;
#endif
//...
*timer  |= (1 << OCIE0A);

Итак, вот мои три вопроса:

  • Занимают ли #эти команды место на чипе?
  • Подходит ли указатель для таких вещей?
  • Правильно ли я делаю?

, 👍1


1 ответ


Лучший ответ:

2

Как дополнение к ответу Delta_G:

  1. Имена TIMSK0, OCIE0A и т. д. уже являются макросами препроцессора. поэтому для согласованности имеет смысл определить собственный препроцессор макросы для них. Я склонен быть ленивым и использовать один из уже определенных имена, например

    #ifdef TIMSK0  // support both ATtiny{25,45,85} and ATmega328P
    # define TIMSK TIMSK0
    #endif
    

    Указатель const для &TIMSK0 подойдет.

  2. Макросы, идентифицирующие MCU, имеют значение 1. Таким образом, вы есть выбор между этими тремя идиомами:

    #ifdef __AVR_ATtiny45__
    ...
    #endif
    
    #if defined(__AVR_ATtiny45__)
    ...
    #endif
    
    #if __AVR_ATtiny45__
    ...
    #endif
    

    Третий вариант удобен, когда вы хотите обратиться к нескольким MCU. модели с одинаковым кодом:

    #if __AVR_ATtiny25__ || __AVR_ATtiny45__ || __AVR_ATtiny85__
    ...
    #endif
    
,