Второй день туплю над даташитом и не могу решить простейшую проблему: один раз в секунду нужно сгенерировать пульс частотой 40 кГц продолжительностью, скажем, 1 мс.
Что-то не поддаётся мне логика таймеров и прерываний... Вернее, принцип понятен, я даже добился пульсации, где длина пульса = длине паузы, а дальше - никак.
Киньте мануал, где это разжёвывается для нубов или покажите, в какой регистр какой флаг воткнуть.
Вот код
const byte LED = 9;
#define CPU_FREQ (16000000)
#define SIG_FREQ (40000)
#define PLS_CYCLES ((CPU_FREQ/(2*SIG_FREQ)))
ISR (TIMER1_COMPA_vect)
{
TCCR0A ^= _BV(COM0A0) ; //Toggle OC1A on Compare Match
if ( (TCCR0A & _BV (COM0A0)) == 0) {
digitalWrite (LED, LOW);
}
}
void setup()
{
pinMode (LED, OUTPUT);
// Timer 0 : 40 kHz PWM
TCCR0A = _BV(WGM01); // CTC
TCCR0B = _BV(CS00); // no prescaler
// 1 tick = 1/16MHz = 62.5 ns
// half period duration is 1/(2*40kHz) = 12.5 us
// We have to wait 12500/62.5 = 200 clock cycles
OCR0A = PLS_CYCLES - 1;
// Timer 1: interpulse gap
TCCR1A = _BV (WGM12); // CTC
TCCR1B = _BV(CS10) /*| _BV(CS11)*/ | _BV(CS12); // prescaler of 1024
// 1 tick = 1024/16MHz = 64 us
// We have to wait 999ms/64us = 15609 clock cycles
OCR1A = 15609 - 1 ;
TIMSK1 = _BV(OCIE1A); // enable Timer1 Interrupt
Serial.begin(115200);
}
void loop()
{}