Usando un temporizador AVR para generar una señal de 38 kHz

0

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.

    
pregunta user3414278

1 respuesta

1

No está actualizando el PB2, lo configuró alto en el primer retardo y luego lo configuró nuevamente en el segundo retardo, cambie de PORTB | = (1 < < PB2); a PORTB & = ~ (1 < < PB2); en uno de los retrasos

    
respondido por el Kvegaoro

Lea otras preguntas en las etiquetas