Почему мой TIMER0 не использует генератор между XTAL1 и XTAL2 на моем контроллере Atmega644? - PullRequest
0 голосов
/ 17 апреля 2019

Итак, я попытался установить кварцевый генератор 16 МГц между выводами XTAL1 и XTAL2 на моем микроконтроллере Atmega644.Но я не заставляю его работать.

Сначала я определяю

volatile unsigned int input_timer = 150;

ISR (TIMER0_COMPA_vect) {
   if (input_timer>0){
      input_timer--;
   }
 }

Я запустил таймер следующим образом

 TIMSK0 = (1 << OCIE0A); //Compare match enabled
 TCCR0A = (1 << WGM01); //CTC mode
 TCCR0B = ~(1 << CS02) | (1 << CS01) |( 1 << CS00); //DIVIDE 64
 OCR0A = 125; 

Для проверки работоспособности яя делаю следующее

 int p = 0;
 while(1) 
{  
 if (input_timer == 0) {
    lcd_clrscr();
    char c[7]
    itoa(p,c,10);
    lcd_puts(c);
    p++;
 }

Так что в основном я обновляю ЖК-экран один раз каждый раз, когда счетчик отсчитывал от 150 до 0. Если это с осциллографом 16 МГц, это должно происходить каждый раз (16e6 / (150 * 125 * 64) = 13,3 обновления / сек.

Если это сделано с помощью F_CPU, это должно происходить каждые (1e6 / (125 * 150 * 64)) = 0,83 обновления / сек, что и происходит сейчас.

Итак, как мне на самом деле правильно реализовать генератор на выводах XTAL1 и XTAL2. Следует отметить, что я сейчас не использую правильный развязывающий конденсатор, не уверен, что это может иметь значение.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вам также необходимо установить предохранители, чтобы сообщить вашему микро, что вы используете внешние часы.

http://www.ladyada.net/learn/avr/fuses.html

0 голосов
/ 17 апреля 2019

Ваша проблема здесь TCCR0B = ~(1 << CS02) | (1 << CS01) |( 1 << CS00); //DIVIDE 64

~(1<<CS02) устанавливает каждый бит ИСКЛЮЧИТЬ CS02.Таким образом, вместо ввода 00000011 в TCCR0B, вы помещаете 11111011.Это означает, что вы устанавливаете WGM на зарезервированное значение, а не оставляете его в режиме CTC.(Поскольку бит 3 является частью настройки WGM).

Предпочтительный способ указать, что вы хотите поставить ноль в этой битовой позиции, это (0<<CS02).

...