работает на таймере 2, но не работает на таймере 1

Poste
Offline
Зарегистрирован: 12.07.2017

Запустил 16-битный таймер для формирования меандра частотой 500Гц на Atmega328P 16МГц. Аналогичная программа для 8-битного работает, а с 16-битным некорректно.  Помогите пожалуйста найти ошибку.

void startTC1(void);
void startTC2(void);
void setup(void)
  {  
  pinMode(10, OUTPUT); 
  int i; for(i=0; i<10; i++) {digitalWrite(10,HIGH); delay(1); digitalWrite(10,LOW);delay(1);}
  delay(500);
  noInterrupts();
  //startTC2();  // работает
  startTC1();    // работает неправильно
  interrupts();
  } 

void loop(void){} 

void startTC1(void)
  {
    TCCR1B=0;   
    TCNT1=0; 
    TCCR1A=(1<<WGM11);
    OCR1A=32000-1;   
    TIMSK1=(1<<OCIE1A); 
    OCR1B=16000-1; 
    TIMSK1|=(1<<OCIE1B);
    TCCR1B=B001;
    TIFR1&=0xff ; 
   }

ISR (TIMER1_COMPB_vect){ digitalWrite(10,HIGH); }
ISR (TIMER1_COMPA_vect){ digitalWrite(10,LOW);  }

void startTC2(void)
  {
    TCCR2B=0;   
    TCNT2=0; 
    TCCR2A=(1<<WGM21);
    OCR2A=250-1;  
    TIMSK2=(1<<OCIE2A); 
    OCR2B=125-1; 
    TIMSK2|=1<<OCIE1B;
    TCCR2B=B101;
    TIFR2&=0xff ; 
  }

ISR (TIMER2_COMPB_vect) {digitalWrite(10,HIGH);}
ISR (TIMER2_COMPA_vect) {digitalWrite(10,LOW);}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что-то Вы сильно накрутили. Нафига Вам самому дергать 10-ый пин, когда таймер и сам его отлично дёргает? Зачем использовать одновременно и канал А, и канал B, т.е. ешё и девятый пин дёргать?

Возьмите вот здесь три строки кода для настройки таймера и заодно там есть калькулятор для расчёта констант на нужную частоту.

Poste
Offline
Зарегистрирован: 12.07.2017

ЕвгенийП пишет:
Что-то Вы сильно накрутили. Нафига Вам самому дергать 10-ый пин, когда таймер и сам его отлично дёргает? Зачем использовать одновременно и канал А, и канал B, т.е. ешё и девятый пин дёргать?

Возьмите вот здесь три строки кода для настройки таймера и заодно там есть калькулятор для расчёта констант на нужную частоту.

Спасибо, обязательно возьму, уже присматривался к Вашей  статье.  накрутил, но старался сделать все строги по даташиту Atmega328P

Нужно на будущее понять почему казалось бы одинаковая программа  работает под таймером 2 и не работает под таймером 1. Что-то я вогнал в неправильный режим ?

Если

digitalWrite(10,HIGH);

успевает отрабатывать на 500 Гц под 8-битным, то почему не удается на 500 Гц под 16-битным таймером?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, не знаю. Вы задействовали два канала сразу, читайте даташит внимательнее. Вот там у меня как раз "строго по даташиту" :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Poste, если вы считаете что просто поменять названия регистров и дело в шляпе -то таки нет.  биты WGM11 и WGM21 задают совершенно разные режимы.

Poste
Offline
Зарегистрирован: 12.07.2017

dimax пишет:
Poste, если вы считаете что просто поменять названия регистров и дело в шляпе -то таки нет.  биты WGM11 и WGM21 задают совершенно разные режимы.
Спасибо, что указали на ошибку. Я написал ради прерываний, что нужно исправить в коде для startTC1() , чтобы был режим аналогичный таймеру 2 ?

Poste
Offline
Зарегистрирован: 12.07.2017

ЕвгенийП пишет:
Ну, не знаю. Вы задействовали два канала сразу, читайте даташит внимательнее. Вот там у меня как раз "строго по даташиту" :)
Идея была такая: первый и второй каналы разнесены на полпериода. Первый канал по прерыванию  устанавливает на выходе HIGH, а второй  LOW. Итого  должен был получится  меандр со скважностью 2.

Poste
Offline
Зарегистрирован: 12.07.2017

dimax пишет:
Poste, если вы считаете что просто поменять названия регистров и дело в шляпе -то таки нет.  биты WGM11 и WGM21 задают совершенно разные режимы.

Этот режим нужен для прерываний по сравнению?  : 

Цитата:
20.12.2. Clear Timer on Compare Match (CTC) Mode

In Clear Timer on Compare or CTC modes (mode 4 or 12, WGM1[3:0]=0x4 or 0xC), the OCR1A or ICR1
registers are used to manipulate the counter resolution: the counter is cleared to ZERO when the counter
value (TCNT1) matches either the OCR1A (if WGM1[3:0]=0x4) or the ICR1 (WGM1[3:0]=0xC). The
OCR1A or ICR1 define the top value for the counter, hence also its resolution. This mode allows greater
control of the compare match output frequency. It also simplifies the operation of counting external
events.
The timing diagram for the CTC mode is shown below. The counter value (TCNT1) increases until a
compare match occurs with either OCR1A or ICR1, and then TCNT1 is cleared.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Poste пишет:

Идея была такая: первый и второй каналы разнесены на полпериода. Первый канал по прерыванию  устанавливает на выходе HIGH, а второй  LOW. Итого  должен был получится  меандр со скважностью 2.

Ну, у меандра всегда скважность 2 по определению меандра. И вот в тех моих примерах как раз и получается правильный меандр со скважностью 2 на одном канале и одном пине. Разбертесь.

Poste
Offline
Зарегистрирован: 12.07.2017

ЕвгенийП пишет:
Poste пишет:
Идея была такая: первый и второй каналы разнесены на полпериода. Первый канал по прерыванию  устанавливает на выходе HIGH, а второй  LOW. Итого  должен был получится  меандр со скважностью 2.
Ну, у меандра всегда скважность 2 по определению меандра. И вот в тех моих примерах как раз и получается правильный меандр со скважностью 2 на одном канале и одном пине. Разбертесь.
Моя цель - работа с прерываниями таймера, а формирование меандра как средство проверки.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно. Ну, тогда, удачи!