El temporizador ATMega2560 no vuelve a aumentar después del desbordamiento

0

Quiero generar una forma de onda con f = 196 Hz usando solo el modo normal. Aquí está el código que utilizo. Cuando el temporizador se desborda, TOV1 se configura y PIND0 se activa. TOV1 se borra después de eso y espero que ocurra otro desbordamiento para que PIND0 vuelva a alternar.

Probé mi código, con PIND0 conectado al LED. Al encenderse, el LED se encendió y apagó poco después, pero no se encendió nuevamente. Debido a que se apagó, significa que el desbordamiento ocurrió, por lo que se activó el PIND, pero no sé por qué no se volvió a encender. Incluso intenté no borrar TOV1 pero obtengo el mismo resultado que TOV1.

#include <avr/io.h>
#define F_CPU 25690112UL
int main(void)
{
    TIFR1 |= (1<<TOV1); // clear timer 1 overflown flag
    DDRD = 0xFF; // set port D as output
    TCCR1B = 0b00000001; // using internal I/O clock with prescaler 1
    while(1){
        while(TIFR1 & (1<<TOV1)){
            PIND ^= (1<<PD0); // toggle bit 0 on port D
            TIFR1 |= (1<<TOV1); // clear TOV1 by adding 1 to TOV1
        }
    }
}

¿Alguien puede ver un error en mi código?

    
pregunta aukxn

1 respuesta

2

La línea PIND ^ = (1 < < PD0) está desactivada.

El registro de PIN contiene los pines del estado físico real, y normalmente no se escribiría. El registro PORT establece el estado de los controladores de pines.

Sin embargo, como un registro de solo lectura común es un desperdicio de espacio de direcciones de E / S, Atmel agregó una característica nítida al registro de pin: Al escribir una máscara de bit a PIN se activarán los bits correspondientes en PORT. La línea 'PIND ^ = máscara' es aproximadamente la misma que la máscara PORTD XOR PIND XOR. Dado que PIND lee los pines de las unidades PORTD, PIND suele ser = PORTD, lo que hace que esto sea equivalente a 'PORTD = máscara'.

Intente sustituir 'PIND' con 'PORTD', -o-- '^ =' con solo '='

    
respondido por el Brog

Lea otras preguntas en las etiquetas