Hallo,
ich habe einen ATMega644 (laut AVR Studio 4.14 Build589 -> Signatur 0x1E
0x96 0x09). Habe Untenstehendes kleine Programm geschrieben und mit
WinAVR-20040720 compeliert. Das Programm soll einfach Pin23 (PC1)
toggeln lassen. Das tut er auch (siehe Bild Osci-Screen unten).
Allerdings kann man am oberen Osci-Screen sehen, dass das Programm immer
unterbrochen wird und dann wieder los läuft. Es läuft ca. 20ms - steht
dann für ca. 80ms usw.
Ich habe ja den Watchdog in verdacht, finde aber einfach keine Ursache.
Habe darum auch noch die Fuse Settings mit ins Bild kopiert. Als Tackt
verwende ich einen 11,059MHz Quarz.
Hat jemand eine Idee, warum sich der 644 so verhält?
Gruß
Peter
P.S. hier das Programm
>Ich habe ja den Watchdog in verdacht, finde aber einfach keine Ursache.>Habe darum auch noch die Fuse Settings mit ins Bild kopiert. Als Tackt
Wozu muss man da eine Frage stellen?
Watchdog ausschalten und probieren.
Dann wirst du schon sehen was passiert.
>Schon probiert, aber wenn ich den Watchdog in den Fuses deaktiviere>(WDTON), habe ich genau das gleiche verhalten.
Vieleicht ist es ja auch ein Brownout Reset.
Miss mal deine Vcc mit dem Osci. Wenn ich mir
die Überschwinger an deinem Pin so ansehe, dann
fehlen evtl. auch Blockkondensatoren.
Durch das setzen der Fuses (siehe Bild) IST der Watchdog immer an.
Lies das MCUSR (MCU Status Register) am Programmanfang aus und gib Dir
den Inhalt aus, eventuell an einen Port. Dann weisst Du, wer oder was
deinen Prozessor eventuell resetet.
LG EC
@holger
Vcc sieht gut aus. Blockkondensatoren sind vorhanden 10uF an der
Versorgungsspannung des 644 und noch je 100uF an den Vcc Pins.
@Simon K.
Ja, 8V kommt hin.
@ecslowhand
gute Idee, werde ich mal machen - aber erst morgen... melde mich dann
wieder.
Thanks
Peter
Peter wrote:
> @holger> Vcc sieht gut aus. Blockkondensatoren sind vorhanden 10uF an der> Versorgungsspannung des 644 und noch je 100uF an den Vcc Pins.
100 n F wohl eher. 8V sind vielleicht ein bisschen viel.
Moin,
(natürlich 100nF - wer hat das Zeichen um 180° gedreht) Habe in meinem
Programm mal einige Zeilen (// <-- ) eingefügt, um die Resetbedingung
herauszubekommen.
Am Port A messe ich folgendes timing:
PA0 PORF ist 1, wenn das Programm läuft, sonst 0
PA1 EXTRF ist 1, wenn das Programm läuft, sonst 0
PA2 BORF ist 1, wenn das Programm läuft, sonst 0
PA3 WDRF ist 1, wenn das Programm läuft, sonst 0
PA4 JTRF ist 0, wenn das Programm läuft, sonst 0
Ich habe also immer 4 gültige Resetbedingungen????
Was mir noch eingefallen ist. Das Programm hat schon mal richtig
funktioniert. Ich glaube der 644 hat dies Verhalten erst, seid ich die
WDTON Fuse gesetzt habe. Kann es sein, dass der 644 einfach 'nur' defekt
ist? Denn ein 'rumspielen' mit WDTON oder dem WDTCSR-Register zeigt
keine Wirkung.
Gruß
Peter
Simon K. wrote:
> Damit löschst du aber gar nix. Die Anweisung bewirkt genau nichts.
Naja: sie liest das MCUSR und schreibt es dann zurück. Ob das nun
,,genau nichts'' ist, muss die Hardware entscheiden. Die Anweisung
hier beispielsweise:
1
UDR|=0;
würde sehr wohl etwas bewirken. ;-)
Bezüglich Watchdog: du denkst aber daran, dass ein Watchdog, der
einmal zugeschlagen hat, sich nie wieder abschalten lässt, solange
man nicht entweder das WDRF gelöscht hat oder aber einen power cycle
vorgenommen hat, ja? Bei Arbeiten am Watchdog empfiehlt es sich
eigentlich, nach jeder Neuprogrammierung wirklich zwangsweise einen
power cycle durchzuführen.
Die ursprüngliche Schaltung war diese - für den Mega16 (der Mega 8 ist
eine Bestückungsvariante). Den Miso/Mosi Dreher am Mega16 (bzw. 644)
habe ich mit Gründrähten auf der Leiterplatte behoben. Ist so ein
kleines Entwicklungsboard.
Mittlerweile habe ich auf Lochraster diese Schaltung aufgebaut (um
Fehler an der Schaltung auszuschließen). Versorgt aus Labornetzteil und
ohne Abblock C's.
Leider hat der 644 das gleiche Verhalten.
anstatt des anderen eingebaut. Jetzt habe ich auch nur noch eine Reset
Bedingung. Und zwar die vom watchdog (an PA3 messbar).
@Jörg
jetzt lösche ich das WDRF (mit obigem Befehl). Er schlägt aber immer
wieder zu. Auch nach Aus- Einschalten. Das WDTCSR ist auch auf 0x00
gesetzt (WDTCSR = 0x00). Da sollte es doch keinen Watchdog geben, auch
wenn die Fuse WDTON gesetzt ist, oder?
Peter wrote:
> Da sollte es doch keinen Watchdog geben, auch> wenn die Fuse WDTON gesetzt ist, oder?
Doch, WDTON erzwingt den Watchdog, unabhängig von den Register-
einstellungen. Genau dafür ist es ja da: eine Fuse kann nicht
durch die Applikation selbst geändert werden, damit kann die
Applikation nie (egal warum) den Watchdog abschalten.
Wenn ich die Fuse WDON lösche läuft das Programm jetzt durch (Ein Fehler
war also das falsche löschen des Watchdog Flags).
Der andere Fehler war RTFM (read the f... manual). Da steht ja:
1
The Watchdog always on (WDTON) fuse, if programmed, will force the
2
Watchdog Timer to System Reset mode. With the fuse programmed the System
3
Reset mode bit (WDE) and Interrupt mode bit (WDIE) are locked to 1 and 0
4
respectively. ...
Danke euch! Die 'Schläge auf den Hinterkopf' haben's gebracht.
Gruß
Peter