я тут недавно баловался, продолжение темы
И снова таймеры - импульс по счетчику - Песочница. Раздел для новичков - Arduino.ru
столкнулся с аналогичным поведением
//TCCR1A |= 1 << COM1A1; // 10 - сброс вывода OC1A (PB1 pin 9 Nano) при совпадении с A // почему то не работает, отключает пин сразу при запуске таймера
TCCR1A |= 1 << COM1A0; // 01 - изменение состояния вывода OC1A (PB1 pin 9 Nano) на противоположное при совпадении с A
не знаю как объяснить, пришлось сделать переключение состояние пина
/*
Name: NanoTimers01.ino
Created: 09.11.2022 13:03:46
Author: Andrey
*/
static constexpr unsigned char pin_input_step = 5; // T1 PD5 pin 5 Nano
static constexpr unsigned char pin_mixer = 9; // OC1A PB1 pin 9 Nano
/*ISR(TIMER1_COMPA_vect) { // прерывание Таймер1 по совпадению
digitalWrite(pin_mixer, !digitalRead(pin_mixer));
}*/
/*(target time) = (timer resolution) * (# timer counts + 1)
(# timer counts + 1) = (target time) / (timer resolution) -> 16000000/1024
(# timer counts + 1) = (1 s) / (6.4e-5 s)
(# timer counts + 1) = 15625
(# timer counts) = 15625 - 1 = 15624*/
/*void startTimer1comp1sec(void) { // ежесекундный вызов прерывания по совпадению счетчика
cli(); // отключить глобальные прерывания
TCCR1A = 0b00000000; // очищаем все настройки таймера
TCCR1B = 0b00000000; // очищаем все настройки таймера
TCCR1B |= 1 << CS12; // clk_io/1024 (делитель частоты)
TCCR1B |= 1 << CS10; // clk_io/1024 (делитель частоты)
TIMSK1 |= (1 << TOIE1); // включить прерывание Timer1 overflow
TCCR1B |= (1 << WGM12); // включение в CTC режим
TIMSK1 |= (1 << OCIE1A); // включение прерываний по совпадению
OCR1A = 15624; // установка регистра совпадения
sei(); // включить глобальные прерывания
}*/
/*void startTimer1compext(void) { // вызов прерывания по совпадению счетчика от внешних импульсов
cli(); // отключить глобальные прерывания
TCCR1A = 0b00000000; // очищаем все настройки таймера
TCCR1B = 0b00000000; // очищаем все настройки таймера
TCCR1B |= 1 << CS12; // 110 - внешний источник на выводе T1 (T1 PD5 pin 5 Nano) по спаду сигнала
TCCR1B |= 1 << CS11; // 110 - внешний источник на выводе T1 (11 ножка) по спаду сигнала
TIMSK1 |= (1 << TOIE1); // включить прерывание Timer1 overflow
TCCR1B |= (1 << WGM12); // включение в CTC режим // сброс при совпадении
TIMSK1 |= (1 << OCIE1A); // включение прерываний по совпадению
OCR1A = 5; // установка регистра совпадения
sei(); // включить глобальные прерывания
}*/
/*void startTimer1compOutOCR1Atrig(void) { // изменение полярности выходного пина по совпадению счетчика от внешних импульсов
cli(); // отключить глобальные прерывания
TCCR1A = 0b00000000; // очищаем все настройки таймера
TCCR1B = 0b00000000; // очищаем все настройки таймера
TCCR1A |= 1 << COM1A0; // 01 - изменение состояния вывода OC1A (PB1 pin 9 Nano) на противоположное при совпадении с A
TCCR1B |= 1 << CS12; // 110 - внешний источник на выводе T1 (T1 PD5 pin 5 Nano) по спаду сигнала
TCCR1B |= 1 << CS11; // 110 - внешний источник на выводе T1 (11 ножка) по спаду сигнала
TCCR1B |= (1 << WGM12); // включение в CTC режим // сброс при совпадении
OCR1A = 5; // установка регистра совпадения
sei(); // включить глобальные прерывания
}*/
void startTimer1singleONcomp(void) { // разовое включение выходного пина по совпадению счетчика входных импульсов
cli(); // отключить глобальные прерывания
TCCR1A = 0x00; // очищаем все настройки таймера
TCCR1B = 0x00; // очищаем все настройки таймера
TCNT1 = (unsigned short)0; // сброс счетчика
TCCR1A |= 1 << COM1A1; // 11 - включение вывода OC1A (PB1 pin 9 Nano) при совпадении с A
TCCR1A |= 1 << COM1A0; // 11 - включение вывода OC1A (PB1 pin 9 Nano) при совпадении с A
TCCR1B |= 1 << CS12; // 110 - внешний источник на выводе T1 (T1 PD5 pin 5 Nano) по спаду сигнала
TCCR1B |= 1 << CS11; // 110 - внешний источник на выводе T1 (11 ножка) по спаду сигнала
TCCR1B |= (1 << WGM12); // включение в CTC режим // сброс при совпадении
OCR1A = (unsigned short)10; // установка регистра совпадения
sei(); // включить глобальные прерывания
}
void startTimer1pin1secOFF(void) { // отключение пина через секунду
cli(); // отключить глобальные прерывания
TCCR1A = 0x00; // очищаем все настройки таймера
TCCR1B = 0x00; // очищаем все настройки таймера
TCNT1 = (unsigned short)0; // сброс счетчика
//TCCR1A |= 1 << COM1A1; // 10 - сброс вывода OC1A (PB1 pin 9 Nano) при совпадении с A // почему то не работает, отключает пин сразу при запуске таймера
TCCR1A |= 1 << COM1A0; // 01 - изменение состояния вывода OC1A (PB1 pin 9 Nano) на противоположное при совпадении с A
TCCR1B |= 1 << CS12; // 101 - clk_io/1024 (делитель частоты)
TCCR1B |= 1 << CS10; // 101 - clk_io/1024 (делитель частоты)
TCCR1B |= (1 << WGM12); // включение в CTC режим // сброс при совпадении
OCR1A = (unsigned short)15624; // установка регистра совпадения
sei(); // включить глобальные прерывания
}
void initPins(void) {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
pinMode(pin_input_step, INPUT_PULLUP);
pinMode(pin_mixer, OUTPUT);
digitalWrite(pin_mixer, LOW);
}
// the setup function runs once when you press reset or power the board
void setup() {
initPins();
//startTimer1comp1sec();
//startTimer1compext();
//startTimer1compOutOCR1Atrig();
startTimer1singleONcomp();
//startTimer1pin1secOFF();
}
// the loop function runs over and over again until power down or reset
void loop() {
static unsigned char mixerState = 0;
if (!(mixerState)) {
if (digitalRead(pin_mixer)) {
startTimer1pin1secOFF();
mixerState = 1;
}
} else if (!digitalRead(pin_mixer)) {
mixerState = 0;
startTimer1singleONcomp();
}
}