steffen21m
07.01.2008, 06:19
Hallo Leute !
Habe ein kleines Uhrenprogramm. Wenn der Timer1 des Atmega32 einen Overflow hat soll eine Sekunde dazugezählt werden. Leider arbeitet der ATMega aber nicht das Interruptprogramm ab. Was mache ich falsch ??
(Programm siehe unten ;-)) In meiner Main wird Start_Clock() aufgerufen. Timer läuft auch .. nur die ISR wird nicht abgearbeitet.
Gruß Steffen
#include "clock.h"
//Die Uhrzeit steht in folgenden Variablen
unsigned char ss=0; //Globale Variable für die Sekunden
unsigned char mm=12; //Globale Variable für die Minuten
unsigned char hh=12; //Globale Variable für die Stunden
unsigned char day=12; //Globale Variable für den Tag
unsigned char mon=12; //Globale Variable für den Monat
unsigned int year=2007; //Globale Variable für das Jahr
//################################################## ##########################
//Overflow Interrupt wird bei 59 Sekunden ausgelöst
ISR(TIMER1_OVF_vect)
//################################################## ##########################
{
//Zurücksetzen des Timers
TCNT1 = 65535 - (SYSCLK / 1024);
//1 Sekunde addieren
Add_one_Second ();
}
//################################################## ##########################
//Addiert 1 Sekunde
void Add_one_Second (void)
//################################################## ##########################
{
ss++;//Addiere +1 zu Sekunden
if (ss == 60)
{
ss = 0;
mm++;//Addiere +1 zu Minuten
if (mm == 60)
{
mm = 0;
hh++;//Addiere +1 zu Stunden
if (hh == 24)
{
hh = 0;
if (hh== 0)
{
day++;//Addiere +1 zu Tag
}
}
}
}
}
//################################################## ##########################
//Diese Routine startet und initialisiert den Timer
void Start_Clock (void)
//################################################## ##########################
{
//Timer 1 Overflow einschalten
TIMSK |= (1 << TOIE1);
//Prescaler auf 1024 setzen
TCCR1B |= (1<<CS10 | 0<<CS11 | 1<<CS12);
//Timer 1 auf 0 setzen
TCNT1 = 65535 - (SYSCLK / 1024);
}
Habe ein kleines Uhrenprogramm. Wenn der Timer1 des Atmega32 einen Overflow hat soll eine Sekunde dazugezählt werden. Leider arbeitet der ATMega aber nicht das Interruptprogramm ab. Was mache ich falsch ??
(Programm siehe unten ;-)) In meiner Main wird Start_Clock() aufgerufen. Timer läuft auch .. nur die ISR wird nicht abgearbeitet.
Gruß Steffen
#include "clock.h"
//Die Uhrzeit steht in folgenden Variablen
unsigned char ss=0; //Globale Variable für die Sekunden
unsigned char mm=12; //Globale Variable für die Minuten
unsigned char hh=12; //Globale Variable für die Stunden
unsigned char day=12; //Globale Variable für den Tag
unsigned char mon=12; //Globale Variable für den Monat
unsigned int year=2007; //Globale Variable für das Jahr
//################################################## ##########################
//Overflow Interrupt wird bei 59 Sekunden ausgelöst
ISR(TIMER1_OVF_vect)
//################################################## ##########################
{
//Zurücksetzen des Timers
TCNT1 = 65535 - (SYSCLK / 1024);
//1 Sekunde addieren
Add_one_Second ();
}
//################################################## ##########################
//Addiert 1 Sekunde
void Add_one_Second (void)
//################################################## ##########################
{
ss++;//Addiere +1 zu Sekunden
if (ss == 60)
{
ss = 0;
mm++;//Addiere +1 zu Minuten
if (mm == 60)
{
mm = 0;
hh++;//Addiere +1 zu Stunden
if (hh == 24)
{
hh = 0;
if (hh== 0)
{
day++;//Addiere +1 zu Tag
}
}
}
}
}
//################################################## ##########################
//Diese Routine startet und initialisiert den Timer
void Start_Clock (void)
//################################################## ##########################
{
//Timer 1 Overflow einschalten
TIMSK |= (1 << TOIE1);
//Prescaler auf 1024 setzen
TCCR1B |= (1<<CS10 | 0<<CS11 | 1<<CS12);
//Timer 1 auf 0 setzen
TCNT1 = 65535 - (SYSCLK / 1024);
}