Настройка регистра таймера1 и таймера 2

настройка первого таймера работает

#include <avr/io.h>
#include <avr/interrupt.h>

#define STEP 2
#define DIR 3
#define ENA 4

void setup() {
  pinMode(STEP,OUTPUT);
  pinMode(DIR,OUTPUT);
  pinMode(ENA,OUTPUT);

  digitalWrite(ENA,LOW);
  digitalWrite(DIR,LOW);

  cli();
  TCCR1A=(0<<COM1A1) | (0<<COM1A0) |(0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
  TCCR1B=(0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
  OCR1A=20000;//задает скорость,чем меньше значение ,тем меньше скорость(6000max)
  TIMSK1=0b00000010;

  sei(); 
}

void loop() {
  
}

ISR(TIMER1_COMPA_vect){
  if(PIND&(1<<2)){PORTD &=~ (1<<2);}//step high на 2-м пине
  else           {PORTD |= (1<<2);}
}

а настройка второго таймера нет

#include <avr/io.h>
#include <avr/interrupt.h>

#define STEP 2
#define DIR 3
#define ENA 4

void setup() {
  pinMode(STEP,OUTPUT);
  pinMode(DIR,OUTPUT);
  pinMode(ENA,OUTPUT);

  digitalWrite(ENA,LOW);
  digitalWrite(DIR,LOW);

  cli();
  TCCR2A=(0<<COM2A1) | (0<<COM2A0) |(0<<COM2B1) | (0<<COM2B0) | (1<<WGM21) | (0<<WGM20);
  TCCR1B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (1<<CS20);
  OCR2A=2000;//задает скорость,чем меньше значение ,тем меньше скорость(6000max)
  TIMSK2=0b00000010;

  sei(); 
}

void loop() {
  
}

ISR(TIMER2_COMPA_vect){
  if(PIND&(1<<2)){PORTD &=~ (1<<2);}//step high на 2-м пине
  else           {PORTD |= (1<<2);}
}

кто может подсказать почему?

знаю что там 2B,забыл просто изменить когда копировал код первого таймера,но все равно не работает

что эта фраза значит? - таймер не работает вовсе, работает но неправильно, программа виснет?

Учитесь задавать вопросы нормально.

Какой чип?
Чего хотим добиться от таймера?
Чего получаем?

с первым таймером шаговый двигатель работает как надо,а когда попробовал настроить второй таймер по аналогии с первым,то двигатель не работает

атмега 328
добиться от второго таймера,чтобы работал как первый

Timer2 (как и timer0) у atmega328 8-битный.

Страница 144 даташита ( 17. 8-bit Timer/Counter2 with PWM and Asynchronous Operation )

оттуда и настраивал,не работает

Не многовато для 8 бит ?

я пробовал разные значения,ни на каких не работает

Таймер1 и Таймер2 РАЗНЫЕ, как не банально это звучит. Их нельзя настраивать копированием регистров, потому что одни и те же биты в двух таймерах имеют РАЗНОЕ ЗНАЧЕНИЕ.

Открывайте даташит и читайте. Вполне может оказаться, что настроить таймер2 ТАК ЖЕ, как первый - вообще не возможно, например таблица прескалеров у них РАЗНАЯ

1 лайк

Ну ты странный )))
8 бит - это максимальное значение 255 )))

пробовал менять на разные,ничего

От 2000 останется 208 - мотор то умеет так быстро ?
Увеличить прескалер до 8 и 2000 поменять на 250 для начала. Тогда ± будет 250*8=2000

как я люблю когда новички “пробуют”.
Это как пробовать заливать в бензобак олифу, мед и мочу. Не “ПРОБЫВАТЬ” надо, а точно ЗНАТЬ, какой параметр для чего. Для этого есть книги.

одинаковая таблица у них,CSx0 у них 1

Вы еще спорить будете?
pr1

pr2

посмотрите на страницу выше,там еще 3 строки

я устанавливал без делителя

Вы тупой или как,?
Какие строки совпадают, какие-то нет! Например биты 101 дадут в таймере 1 1024, а в таймере2 - только 128 - в 8 раз разница.

Atmega328P: WDfiles — файлообменник бесплатный - загрузить файл

без делителя совпадают строки