Hallo,
der WDT des mega48 lässt sich auf 4 unterschiedliche Weisen
initialisieren (Stopped, Interrupt Mode, System Reset Mode und
Interrupt and System Restet Mode (vgl. DS s.52)). avr-gcc 3.4.3 stellt
Makros zum Ein- bzw. Abschalten und zum Reset des WDT bereit. Der WDT
wird dann immer im System Reset Mode initialisiert. Mich interessiert
allerdings der Interrupt Mode und ich habe Versucht meine eigene
Initfunktion dafür zu schreiben:
void WDTInitIntMode(UINT8_T byTimeout){
cli();
wdt_reset();
// MCUSR &= ~(1<<WDRF); // ??
WDTCSR = 0x10; // bit zum Ändern der WDT Settings
WDTCSR = 0x50 | byTimeout; // WDIE + gewünschter Timeout
sei();
}
allerdings funktioniert das nicht. Zwar wird wie gewünscht WDIE gesetzt
aber der Timeout nicht. Auch meine ISR wird nie angesprungen (sei() ist
gemacht):
ISR(WDT_vect){
byTimer++;
}
Mein Debugger ist der JTAG mkII AVRStudio (V. 412 SP1). Beim debuggen
damit sieht es so aus als würde trotz WDEN = 0. Ein Reset ausgelöst
(Breakpoint vor Endlosschleife wird angesprungen) ... allerdings sieht
es auf der Hardware so aus als würde das nie passieren?? Also ...
1.) Warum funktioniert das setzten von WDIE aber nicht WDP2..0?
2.) Was ist an meiner ISR falsch?
3.) Warum wird beim debuggen so komisch in der Gegend
"rumgesprungen"?
so long ... Uwe
Ich hab noch was vergessen beim compilieren bekomm ich die Warnings: ../../src/main.c:8: warning: return type defaults to `int' ../../src/main.c: In function `ISR': ../../src/main.c:10: warning: control reaches end of non-void function woher kommt das?
In deiner Zeile WDTCSR = 0x10; wird nur ein Bit gesetzt. Um die Einstellungen zu ändern müssen aber WDCE und WDE im gleichen Schritt auf 1 gesetzt werden. Danach kanst du im nächsten Schritt die neuen Werte setzen, dabei muss WDCE aber 0 sein
> ../../src/main.c:8: warning: return type defaults to `int' > ../../src/main.c: In function `ISR': > ../../src/main.c:10: warning: control reaches end of non-void function #include <avr/interrupt.h>
Hallo Jörg und Jürgen,
danke für die prompte Antwort ... ich hab das ganze jetzt hingekriegt
allerdings nur so:
#include <avr/interrupt.h>
#include <avr/signal.h>
void WDTInitIntMode(UINT8_T byTimeout){
cli();
wdt_reset();
WDTCSR = 0x18;
WDTCSR = 0x50 | byTimeout;
sei();
}
SIGNAL(SIG_WATCHDOG_TIMEOUT){
byTimer++;
}
ab welcher avr-gcc Version gibts den ISR(..) (meine 3.4.3)? Hab gelesen
das SIGNAL bzw. INTERRUPT eigentlich nicht mehr verwendet werden
sollten? Und wie kann ich mein avr-gcc updaten? Hab mal das neue WinAVR
(20060125) versucht allerdings hatte ich damit ziemliche Probleme?
Gruß Uwe
> ab welcher avr-gcc Version gibts den ISR(..) (meine 3.4.3)? avr-libc 1.4 > Hab mal das neue WinAVR (20060125) versucht allerdings hatte ich > damit ziemliche Probleme? Das wäre für Windows-Nutzer aber vermutlich der praktikabelste Weg. Wenn du damit Probleme hast, solltest du diese in einem separaten Thread thematisieren, damit dir geholfen werden kann.
Ok ich hab das ganze jetzt doch upgedatet gekriegt ... allerdings läufts
jetzt wieder nicht mehr ... lol.
void WDTInitIntMode(UINT8_T byTimeout){
cli();
wdt_reset();
WDTCSR = 0x18;
WDTCSR = 0x42; // zur vereinfachung mal ohne byTimeout
sei();
}
Dissasembly:
@000000B3: WDTInitIntMode
54: void WDTInitIntMode(UINT8_T byTimeout){
+000000B3: 94F8 CLI Global Interrupt
Disable
56: wdt_reset();
+000000B4: 95A8 WDR Watchdog reset
57: WDTCSR = 0x18;
+000000B5: E188 LDI R24,0x18 Load immediate
+000000B6: 93800060 STS 0x0060,R24 Store direct to data
space
58: WDTCSR = 0x42;
+000000B8: E482 LDI R24,0x42 Load immediate
+000000B9: 93800060 STS 0x0060,R24 Store direct to data
space
59: sei();
+000000BB: 9478 SEI Global Interrupt
Enable
+000000BC: 9508 RET Subroutine return
sieht ja alles so weit ganz gut aus allerdings steht WDTCSR danach
immer auf 0x4A statt 0x42?? Mit der alten Version von WinAVR hats
funktioniert (jetzt gcc 3.5.4 avr-libc 1.4.3)! Irgendwelche Tipps?
Gruß Uwe
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.