Saludos foro!
Bueno de antemano gracias y mi duda es acerca del Timer del ATmega8 el T1 no me funciona de la mejor manera no se si atienda de forma correcta la interrupcion por desbordamiento, quiero generar una base de tiempo precisa para un reloj, el circuito tiene un cristal de 12MHz lo que hago es inicializar el la cuenta del Timer en 0xFFFF-12000=0x0
11F para que cuando desborde halla contado los 12000 pulsos de 83.333nS es decir 1 mS.
Ahorita estoy solo visualizando las variables que estoy usando pero el problema es que la variable segundos cambia hasta que la de los ms llega a 65535 no 1000 como lo indica el if de la interrupcion :S ademas de que tampoco cambia la velocidad del reloj le cambio el divisor que tiene y se mantiene la misma, yo la ocupo sin dividir, pero no se si por que sea un cristal externo o sinceramente no se que pueda ser, un registro que me falte no lo se, por eso pido ayuda al for adjunto el codigo del programa, el circuito y el proyecto para AVR Studio.
La interrupcion si funciona sin ningun problema resetea como debe hacerlo.
PD
En resumen lo que hace bien es en lo que al timer respecta:
-De cierta forma entra a la interrupcion por que incremeta ambas variables
-La interrupcion externa funciona sin ningun problema.
-El timer si empieza la cuenta en FB4F hasta desbordar
Lo que no hace es:
-Cada 1000 cuantas de ms hacer que incremente seg, si no hasta que llega 65535 (FFFF el valor max de unsigned int)
-No cambia la frecuencia del timer aun seleccionando el divisor por 1024, solo si no se le selecciona fuente este se mantiene fijo eso si funciono de forma correcta (Lo explica mejor dentro del PDF)

Bueno de antemano gracias y mi duda es acerca del Timer del ATmega8 el T1 no me funciona de la mejor manera no se si atienda de forma correcta la interrupcion por desbordamiento, quiero generar una base de tiempo precisa para un reloj, el circuito tiene un cristal de 12MHz lo que hago es inicializar el la cuenta del Timer en 0xFFFF-12000=0x0
Ahorita estoy solo visualizando las variables que estoy usando pero el problema es que la variable segundos cambia hasta que la de los ms llega a 65535 no 1000 como lo indica el if de la interrupcion :S ademas de que tampoco cambia la velocidad del reloj le cambio el divisor que tiene y se mantiene la misma, yo la ocupo sin dividir, pero no se si por que sea un cristal externo o sinceramente no se que pueda ser, un registro que me falte no lo se, por eso pido ayuda al for adjunto el codigo del programa, el circuito y el proyecto para AVR Studio.
La interrupcion si funciona sin ningun problema resetea como debe hacerlo.
Código:
/*
* Timer.c
*
* Created: 21/11/2011 02:42:26 p.m.
* Author: Jaime
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include "retardo.h"
#include "LCD_4bits.h"
unsigned int ms;
unsigned char seg;
/************************************************************************/
/* Interrupcion externa INT0 */
/************************************************************************/
ISR (INT0_vect)
{
//Limpia todas las variables
seg=0;
ms=0;
TCNT1=0xD11F;
}
/************************************************************************/
/* Interrupcion externa INT1 */
/************************************************************************/
ISR (INT1_vect)
{
//Por ahora no se ocupa
}
/************************************************************************/
/* Interrupcion por desbordamiento del T1 */
/************************************************************************/
ISR (TIMER1_OVF_vect)
{
TCNT1=0xD11F; //Inicializa el valor de la cuenta del T1 **En el main lo explica mejor
ms++; //Incrementa la variable que cuenta los milisegundos
if (ms==1000) //Si hay 1000 milisegundos
{
seg++; //Incrementa la de los segundos
ms==0; //Limipia los milisegundos
}
}
void main (void)
{
unsigned char hold;
DDRD=0x00; //Puerto D Como entrada
PORTD=0xFF; //Pull up enable para todo el puerto D
inicializacion_LCD(); //Inicializa el LCD a 4 bits
display_off(); //Apagar el cursor
/************************************************************************/
/* Interruciones externas */
/************************************************************************/
sei(); //Hablitacion de las interrupciones globales
MCUCR|=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00); //Interrupcion por transicion de bajada
GICR|=(1<<INT1)|(1<<INT0); //Hablitacion de las interrupciones externas
/************************************************************************/
/* Timer 1 */
/************************************************************************/
TCCR1B|=(0<<CS10)|(0<<CS10)|(1<<CS10); //Reloj sin dividir
TIMSK|=(1<<TOIE1); //Hablitacion de interrupcion por desbordamiento del T1
TCNT1=0xD11F; //Inicializa cuenta del T1 para contar 12000 pulsos o sea 1mS debido al cristal de 12MHz
//0xFFFF-12000=0xD11F para generar la interrupcion por desbordamiento
/************************************************************************/
/* Ciclo principal repetitivo */
/************************************************************************/
while(1)
{
linea_inicial(); //Acomoda el cursor en la linea inicial del LCD
print_var(ms,5,10,NO_DOT); //Imprime el valor de ms en el LCD con 5 digitos, decimal, y sin punto
salto_linea(); //A la segunda linea del LCD
print_var(seg,3,10,NO_DOT); //Imprime el valor de seg en el LCD con 3 digitos, decimal, y sin punto
display_write(' '); //Escribe un espacio
print_var(TCNT1,4,16,NO_DOT); //Imprime el valor de TCNT1 (cuenta del T1) en el LCD con 4 digitos, hexadecimal, y sin punto
do
{
hold=PIND&0x01; //Para visualizar, le pone pausa al sistema
} while (hold==0);
}
}
En resumen lo que hace bien es en lo que al timer respecta:
-De cierta forma entra a la interrupcion por que incremeta ambas variables
-La interrupcion externa funciona sin ningun problema.
-El timer si empieza la cuenta en FB4F hasta desbordar
Lo que no hace es:
-Cada 1000 cuantas de ms hacer que incremente seg, si no hasta que llega 65535 (FFFF el valor max de unsigned int)
-No cambia la frecuencia del timer aun seleccionando el divisor por 1024, solo si no se le selecciona fuente este se mantiene fijo eso si funciono de forma correcta (Lo explica mejor dentro del PDF)

Adjuntos
Última edición: