Hola amigos , ya que estan con el Codevision avr , justo ahora estoy practicando con ese software ,
aqui les mando un ejemplito del timer0 vamos a generar una señal Periodica de 5ms en estado bajo
y 2ms en estado alto, cuando se presione el pulsador.
antes que nada un poco de teoria
EL TIMER0El atmega16 puede trabajar en distintos modos de generacion de formas de onda (4 modos):
1- MODO NORMAL
2- MODO PWM, Fase correcta
3- MODO CTC (Borrado del contador en la igualdad de comparación: TCNT0=OCR0 => borrar TCNT0 )
4- MODO Fast PWM
Estos modos se configuran en el registro TCCR0 (Resgistro de Control del Timer0) especificamente
en los bits 6 y 5 (ver datasheet)
aqui voy a trabajar con el MODO CTC , en el que se hace una comparacion entre los registros TCNT0 y OCR0 ,
cuando el contador TCNT0 enpiece a contar 1 ,2,3, ...... y llegue al valor que tiene el registro OCR0 (valor
que lo pone el programador), entoces TCNT0 es puesto a 0 (borrado) y se activa el flag OCF0 , y se ejecuta
la interrupcion por "igualdad de comparacion" . asi de simple o noo
Eso no es todo , para que veas cuantos recursos tiene este micro , el modo que explique solo es para ver de
que modo vamos a generar la forma de onda. ahora tambien podemos configurar la patita (el pin OC0) por
donde saldra la señal , para ello existe dos bits de configuracion bits 5 y 4 del registro TCCR0 (ver data sheet
) .
COM01 COM00
0 0 No se forma señal en el pin OC0 , OC0 desconectado
0 1 TOGGLE en OC0 en la igualdad de comparacion
(Si pin OC0 es "0" ahora sera "1" y viceversa) 1 0 O en el pin OC0 en la igualdad de comparcion
1 1 1 en el pin Oc0 en la igualdad de comparcion
Usare el modo TOGGLE , es decir el pin OC0 sera "0" hasta que el timer llegue a los 5ms y luego el pin sera
"1" por 2ms y asi susecivamente 5ms 2ms , 5ms 2ms , ................. genrando la señal periodica
para mas detalle aqui les pongo el programa , donde logicamente veran que use el preescaler del timer0
CLK/1024 para llegar a los 5ms y 2ms .
_2m__ _____
//programa que genera una onda periodica ____5ms__| |_________| |
//clock 8Mhz , 5ms en bajo y 2ms el alto , al presionar el pulsador #include <mega16.h> volatile char i;
volatile int bajo = (5*8*1000/1024)-1;
volatile int alto = (2*8*1000/1024)-1;
interrupt [EXT_INT0] void ext_int0_isr(void) { DDRB = 0b11111111;
OCR0 = bajo;
TCCR0 = 0b00011101;
//modo CTC, toggle OC0, CLKIO/1024 TIMSK = 0b00000010;
}
interrupt [TIM0_COMP] void timer0_comp_isr(void) { i=~i;
if (i==0)
OCR0=bajo;
else
OCR0=alto;
}
void main (void) { MCUCR = 0b00000010;
//INTE0 Flanco de bajada GICR = 0b01000000;
//habilitamos INTE0 #asm("sei")
//SREG.7 = 1; while(1);
}
Aqui la simulacion:
y la salida de la simulacion:
Por cierto esta simulacion esta en Proteus 7.2 Sp6 y la forma de onda es la esperada ,pero lo simule en el proteus 7.4 , 7.5 , inclusive en el 7.6 sp0 pero
la forma de onda en estas versiones es incorrecta , haber mi amigo MLO o alguien me pueda decir si hay este mismo error en estas versiones pues
ya puse de cabeza mi PC y naca la perinaca con estas versiones en cuanto a la interrupcion de timer0 por igualdad de comparcion . no se
si sera mi PC que es AMD con procesador Athlon XP , por ahi vi que dicen que en otras maquinas si corre bien . pasen la voz please , por lo pronto me quedo
con esta 7.2 sp6 .