PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktionsaufruf in Interruptroutine geht nicht



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

SprinterSB
07.02.2007, 15:20
Es würde dich genügen, in der ISR nur ein Merker zu setzen, daß 30s vorbei sind, und im Hauptprogramm die Arbeit machen? Wahrscheinlich dauert das alles viel zu lange...
getTemp... loopt wahrscheinlich ewig in einer ADC-Schleife rum?

BTW:

OCR1B = 0xf43;
TCNT1=0;

Was soll das TCNT1 = 0 in der ISR?


Hast du irgendwo Warteschleifen drin, deren Variable in einer ISR gezählt wird? Das kann nicht gehen...

Maverick83
07.02.2007, 15:32
Hallo SprinterSB
Mit dem TCNT1=0 setze ich den counter wieder =0 damit er dann wieder auf 3907 = 1 sec zählen kann und den interrupt auslöst.

oder verstehe ich da etwas falsch?

SprinterSB
07.02.2007, 15:38
Du verwendest den Timer doch im CTC-Mode?.

Wenn überhaupt, sollte das TCNT1=0 an Anfang stehen und nicht am Ende der ISR, weil das ungenauer ist (das Ausführen der Funktionen braucht ja Zeit).

Die Uhrsache des Reset kannst du Übrigens im MCUSR (oder war's MCUCSR oder so) abfragen.

Maverick83
07.02.2007, 16:19
ja das TCNT1 habe ich mir genau aus diesen Gründen auch schon überlegt an den Anfang zu setzen.

Ja ich verwende den Timer im CTC Mode, also ist das TCNT1=0 nicht nötig?

SprinterSB
07.02.2007, 18:35
Jo, sollte überflüssig sein bzw. bringt eine Ungenauigkeit rein, die du sonst nicht hast. Wobei ich mir gerade überleg, was ein Tmier macht, wen OC1A und OC1B benutzt werden..., nimmt dann wahrscheinlich nur das Minimum weil er zum zweiten Wert nie (bzw nur 1 Mal) kommt.