Atmega 16 - Timer0 con interrupción

0

En este código, el LED se ilumina en un pin PC0 con flash cada 50 ms. Tiene XTAL de 16 MHz. Con una frecuencia de CPU de 16 MHz, incluso un retardo máximo de 16.384 ms se puede lograr con un precalculador de 1024. Cada 256 valores preescolares, está logrando una interrupción.

  1. DDRC | = (1 < < 0) .... En el código dado, ¿qué significa?
  2. Quiero iluminar todos los LED en PORTC. Para esto, lo que tengo que cambiar en DDRC | = (1 < < 0).
#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t tot_overflow;

void timer0_init()
{
    TCCR0 |= (1 << CS02);
    TCNT0 = 0;
    TIMSK |= (1 << TOIE0);
    sei();
    tot_overflow = 0;
}

ISR(TIMER0_OVF_vect)
{
    tot_overflow++;
}

int main(void)
{
    DDRC |= (1 << 0);
     timer0_init();
    while(1)
    {
        if (tot_overflow >= 12)  
        {
            if (TCNT0 >= 53)
            {
                PORTC ^= (1 << 0);    
                TCNT0 = 0;            
                tot_overflow = 0;     
            }
        }
    }
}
    
pregunta Mohit Tripathi

2 respuestas

1
  1. DDRC | = (1 < < 0) : significa que está configurando el pin PC0 como salida
  2. Debe configurar los pines PC0-PC7 como salidas para hacer que todos los LEDS se iluminen haciendo algo como esto DDRC = 0b11111111

Lea las operaciones de Bitwise !

¡Lee una hoja de datos!

    
respondido por el Junior
1

DDRC|=(1<<0) establece PC0 como salida. DDRC=0b11111111 (o OxFF, o 255), establece PC0-7 como salida.

Luego, también también debe establecer el pin alto. Eso es lo que hace PORTC ^= (1 << 0) (en realidad, ^ es un xor a nivel de bits, así que alterna el pin de alto a bajo y viceversa). Si desea alternar todos los pines simultáneamente, PORTC ^= (0b11111111) lo hará.

    
respondido por el Nicolas D

Lea otras preguntas en las etiquetas