Maverick83
06.02.2007, 21:12
Hallo Zusammen
Ich habe da ein Problem:
Ich möchte gerne alle 30 sekunden eine Funktion aufrufen.
Das blöde ist, sobald die 30 sekunden erreicht sind bekommt mein ATmeg128
ein Reset.
Wenn ich die Funktionen jedoch normal im main() aufrufe funktionieren sie einwandfrei.
Ich hoffe Ihr könnt mir helfen, hier mal der Code:
void init_Timer1(void){
TCCR1B|=(1<<WGM12)|(1<<CS12)|(1<<CS10); //set timer to CTC mode and prescalor to 1024
OCR1BH=0x0F; //set compare register B to 3907 = ~1second
OCR1BL=0x43;
TIMSK|=(1<<OCIE1B); //enable compare interrupt
TCNT1H=0x00; //set the timer starting position to 0
TCNT1L=0x00;
sei(); //enable Global interrupt
}
//***Compare match Interrupt Timer 1***
ISR(TIMER1_COMPB_vect){
countSeconds++;
lock=0;
if(countSeconds==30){
send_String_to_Display("ZZ",DispLine_3);
wdt_reset(); //reset Watchdog
getAddress(6,deviceAddress);
tempTankT12=getTemperature(deviceAddress);
wdt_reset(); //reset Watchdog
countSeconds=0;
}
TCNT1H=0x00; //set the timer starting position to 0
TCNT1L=0x00;
}
countSeconds ist ein int volatile
die zwei "Z" erscheinen dabei noch auf dem Display kurz danach wird der AVR wahrscheinlich vom Wachtdog zurück gesetzt, weil er wahrscheinlich in "getTemperature" stecken bleibt.
Vielen Dank für Eure Hilfe
Beni
Ich habe da ein Problem:
Ich möchte gerne alle 30 sekunden eine Funktion aufrufen.
Das blöde ist, sobald die 30 sekunden erreicht sind bekommt mein ATmeg128
ein Reset.
Wenn ich die Funktionen jedoch normal im main() aufrufe funktionieren sie einwandfrei.
Ich hoffe Ihr könnt mir helfen, hier mal der Code:
void init_Timer1(void){
TCCR1B|=(1<<WGM12)|(1<<CS12)|(1<<CS10); //set timer to CTC mode and prescalor to 1024
OCR1BH=0x0F; //set compare register B to 3907 = ~1second
OCR1BL=0x43;
TIMSK|=(1<<OCIE1B); //enable compare interrupt
TCNT1H=0x00; //set the timer starting position to 0
TCNT1L=0x00;
sei(); //enable Global interrupt
}
//***Compare match Interrupt Timer 1***
ISR(TIMER1_COMPB_vect){
countSeconds++;
lock=0;
if(countSeconds==30){
send_String_to_Display("ZZ",DispLine_3);
wdt_reset(); //reset Watchdog
getAddress(6,deviceAddress);
tempTankT12=getTemperature(deviceAddress);
wdt_reset(); //reset Watchdog
countSeconds=0;
}
TCNT1H=0x00; //set the timer starting position to 0
TCNT1L=0x00;
}
countSeconds ist ein int volatile
die zwei "Z" erscheinen dabei noch auf dem Display kurz danach wird der AVR wahrscheinlich vom Wachtdog zurück gesetzt, weil er wahrscheinlich in "getTemperature" stecken bleibt.
Vielen Dank für Eure Hilfe
Beni