Forum: Mikrocontroller und Digitale Elektronik Mega644 läuft nicht durch (watchdog?)


von Peter (Gast)


Angehängte Dateien:

Lesenswert?

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
1
//------------------------
2
// Programmcode Test 644
3
//------------------------
4
#include <avr/io.h>
5
6
int main (void) {
7
DDRC  = 0xff;  // Datenrichtung PORT C 
8
9
MCUSR  |=           // MCU Status Register
10
         (0<<JTRF)  // JTAG Reset Flag
11
       | (0<<WDRF)  // Watchdog Reset Flag
12
       | (0<<BORF)  // Brown-out Reset Flag
13
       | (0<<EXTRF) // External Reset Flag
14
       | (0<<PORF); // Power-on Reset Flag
15
16
WDTCSR |=           // Watchdog Timer Controll Register
17
         (1<<WDP0)  // Watchdog Timer Prescaler 0
18
       | (0<<WDP1)  // Watchdog Timer Prescaler 1
19
       | (0<<WDP2)  // Watchdog Timer Prescaler 2
20
       | (1<<WDP3)  // Watchdog Timer Prescaler 3
21
       | (0<<WDE)   // Watchdog System Reset Enable
22
       | (0<<WDCE)  // Watchdog Change Enable
23
       | (0<<WDIE)  // Watchdog Interrupt Enable
24
       | (0<<WDIF); // Watchdog Interrupt Flag
25
// Hauptprogramm (Endlosschleife) 
26
 while(1){
27
  PORTC ^= _BV(PC1); // toggel Pin PC1
28
 }  
29
 return 0;
30
}

von holger (Gast)


Lesenswert?

>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.

von Peter (Gast)


Lesenswert?

@holger
Schon probiert, aber wenn ich den Watchdog in den Fuses deaktiviere 
(WDTON), habe ich genau das gleiche verhalten.

von Simon K. (simon) Benutzerseite


Lesenswert?

Sind das da 8V Spitze an deinem Portpin?

von holger (Gast)


Lesenswert?

>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.

von ecslowhand (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

@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

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von holger (Gast)


Lesenswert?

>8V sind vielleicht ein bisschen viel.

Vieleicht nur falsch gemessen?
Tastkopf GND nicht oder falsch angeschlossen z.B.
Naja, wer weiss?

von Peter (Gast)


Lesenswert?

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
1
#include <avr/io.h>
2
3
int main (void) {
4
char a = 0;   // <-- Variable für Reset
5
a = MCUSR;    // <-- Resetbedingung Merken
6
7
DDRA  = 0xff; // <-- Datenrichtung PORT A setzen
8
DDRC  = 0xff;
9
10
MCUSR  |=           // MCU Status Register löschen
11
         (0<<JTRF)  // JTAG Reset Flag
12
       | (0<<WDRF)  // Watchdog Reset Flag
13
       | (0<<BORF)  // Brown-out Reset Flag
14
       | (0<<EXTRF) // External Reset Flag
15
       | (0<<PORF); // Power-on Reset Flag
16
17
WDTCSR |=           // Watchdog Timer Controll Register
18
         (1<<WDP0)  // Watchdog Timer Prescaler 0
19
       | (0<<WDP1)  // Watchdog Timer Prescaler 1
20
       | (0<<WDP2)  // Watchdog Timer Prescaler 2
21
       | (1<<WDP3)  // Watchdog Timer Prescaler 3
22
       | (0<<WDE)   // Watchdog System Reset Enable
23
       | (0<<WDCE)  // Watchdog Change Enable
24
       | (0<<WDIE)  // Watchdog Interrupt Enable
25
       | (0<<WDIF); // Watchdog Interrupt Flag
26
27
// Hauptprogramm (Endlosschleife) 
28
PORTA = a;   // <-- Reset an Port A ausgeben
29
 while(1){
30
  PORTC ^= _BV(PC1); // toggel Pin PC1
31
 }  
32
 return 0;
33
}

von Pete K. (pete77)


Lesenswert?

Poste mal die Hardwareanschaltung.

von Simon K. (simon) Benutzerseite


Lesenswert?

Peter wrote:
> MCUSR  |=           // MCU Status Register löschen
>          (0<<JTRF)  // JTAG Reset Flag
>        | (0<<WDRF)  // Watchdog Reset Flag
>        | (0<<BORF)  // Brown-out Reset Flag
>        | (0<<EXTRF) // External Reset Flag
>        | (0<<PORF); // Power-on Reset Flag

Damit löschst du aber gar nix. Die Anweisung bewirkt genau nichts.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Peter (Gast)


Lesenswert?

@Simon
ich Esel - habe mal ein
1
MCUSR  = 0x00;
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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.