PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 8 Sek WDT beim Atmega48v



Dunuin
27.09.2011, 22:35
Moin,

Ich habe die neuste Version von Bascom und wollte eben ein altes Programm kompilieren, was früher ging, aber nun lässt mich Bascom nicht mehr "Config Watchdog = 8192" nutzen und es wirft eine Fehlermeldung mit "...[8192]..." (ich gucke morgen bei der Arbeit nochmal, welcher Fehlercode es genau war) für die Zeile aus. Nun haben ja nicht alle AVRs einen Prescaler von 1024k, um auf die 8192ms zu kommen, also habe ich noch einmal ins Datenblatt geguckt und der Atmega48 kann das.
Daraufhin habe ich mir dann mal die m48def.dat angeguckt und ich glaube da stehen auch falsche Werte drin.
Dann wollte ich die WDP0 bis WDP3 Bits im Register mit "WDP0 = 1" und "Reset WDP0" usw. selbst auf 1001 setzen, um den WDT auf 8 Sek zu stellen, aber die Formulierung mag Bascom auch nicht, obwohl WDP0 bis WDP3 richtig farblich hervorgehoben werden auch die Abkürzung auch so in der m48def.dat für die jeweiligen Bits steht.

Kann sich da mal vielleicht jemand die m48def.dat ansehen und gucken, ob da wirklich was nicht stimmt? Ich habe die selbst versucht abzuändern, aber dann passte das Timing des WDTs überhaupt nicht mehr und der WDT Interrupt wurde ständig ausgeführt.

Was mich auch wunderte war, dass wenn ich die Definitionsdatei vom atmega48 und dem atmega48p vergleiche, unter der gleichen Einstellung für den WDT bei dem normalen atmega48 die Prescalerwerte in Tausenderschritten (also 2 bis 1024) angegeben werden und bei dem atmega48p die daraus resultiende Zeit in Millisekunden (also 16 bis 8192).

Edit:
Kann es sein, dass die Bits nicht direkt ansprechen kann und stattdessen "WDTCSR.WDP0 = 0" schreiben muss? Muss ich morgen auch noch einmal testen.

MagicWSmoke
28.09.2011, 09:44
..aber nun lässt mich Bascom nicht mehr "Config Watchdog = 8192" nutzen und es wirft eine Fehlermeldung mit "...[8192]..."
Ja, das ist ein Bug, getestet auf 2.0.7.1.

Dann wollte ich die WDP0 bis WDP3 Bits im Register mit "WDP0 = 1" und "Reset WDP0" usw. selbst auf 1001 setzen,
Wenn Du nicht weißt, daß WDP0 eine Konstante ist, der Du nichts zuweisen kannst und die in Verbindung mit dem Zielregister verwendet werden muss, dann würde ich das Ändern der .dat lieber bleiben lassen, denn das wird dann nix.
Der Bug hat aber zur Folge, daß:

Config Watchdog = 1024
den WDT tatsächlich auf 8 Sekunden setzt.
Um den Code bei 'ner neuen Version nicht ändern zu müssen, wär's hier sinnvoll das Register selbst zu setzen.
Das muss mit einer "timed sequence" gemacht werden, dies hier ist die Entsprechung des Config Watchdog Befehls:

MCUSR = MCUSR And NBits(WDRF)
WDTCSR = Bits(WDP3 , WDCE , WDE , WDP0)
WDTCSR = Bits(WDP3 , WDP0)

Edit:

Ich habe die selbst versucht abzuändern, aber dann passte das Timing des WDTs überhaupt nicht mehr und der WDT Interrupt wurde ständig ausgeführt.
Kommt darauf an, was geändert wurde.
Wenn Du in der .dat nach der Zeile wdvalue ... suchst und ihn durch diese ersetzt, dann klappt's auch:

WDVALUE=16,32,64,128,256,512,1024,2048,4096,8192
Sonst muss nix geändert werden.

Dunuin
28.09.2011, 10:50
Danke. Das versuche ich dann nachher mal.