Necesito un retraso de 13 microsegundos para transmitir IR a una onda portadora de 38 kHz. Mi chip ( ATtiny84 ) se está ejecutando a 8 MHz. No puedo averiguar cuál es el problema en mi código:
void send(long microsecs)
{
TCCR0B |= (1 << CS00); // Enable Timer 0 - No prescale
while (microsecs > 0)
{
// 38 kHz is about 13 microseconds high and 13 microseconds low
PORTB |= (1 << PB2); // 3 µs
TCNT0 = 0;
while (TCNT0 < 104);
PORTB &= ~(1 << PB2); // 3 µs
TCNT0 = 0;
while (TCNT0 < 104);
// So 26 microseconds altogether
microsecs -= 26;
}
}
El retraso (104 ciclos de reloj) suma hasta 13 microsegundos a 8 MHz y el ciclo debe colgar el código durante el período de tiempo requerido, pero no funciona.
But
Cuando reemplacé esto:
TCNT0 = 0;
while (TCNT0 < 104);
por esto:
_delay_us(13);
todo funciona bien.
Si estoy haciendo algo mal, indíquelo.