www.mikrocontroller.net

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


Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
//------------------------
// Programmcode Test 644
//------------------------
#include <avr/io.h>

int main (void) {
DDRC  = 0xff;  // Datenrichtung PORT C 

MCUSR  |=           // MCU Status Register
         (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

WDTCSR |=           // Watchdog Timer Controll Register
         (1<<WDP0)  // Watchdog Timer Prescaler 0
       | (0<<WDP1)  // Watchdog Timer Prescaler 1
       | (0<<WDP2)  // Watchdog Timer Prescaler 2
       | (1<<WDP3)  // Watchdog Timer Prescaler 3
       | (0<<WDE)   // Watchdog System Reset Enable
       | (0<<WDCE)  // Watchdog Change Enable
       | (0<<WDIE)  // Watchdog Interrupt Enable
       | (0<<WDIF); // Watchdog Interrupt Flag
// Hauptprogramm (Endlosschleife) 
 while(1){
  PORTC ^= _BV(PC1); // toggel Pin PC1
 }  
 return 0;
}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sind das da 8V Spitze an deinem Portpin?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ecslowhand (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>8V sind vielleicht ein bisschen viel.

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>

int main (void) {
char a = 0;   // <-- Variable für Reset
a = MCUSR;    // <-- Resetbedingung Merken

DDRA  = 0xff; // <-- Datenrichtung PORT A setzen
DDRC  = 0xff;

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

WDTCSR |=           // Watchdog Timer Controll Register
         (1<<WDP0)  // Watchdog Timer Prescaler 0
       | (0<<WDP1)  // Watchdog Timer Prescaler 1
       | (0<<WDP2)  // Watchdog Timer Prescaler 2
       | (1<<WDP3)  // Watchdog Timer Prescaler 3
       | (0<<WDE)   // Watchdog System Reset Enable
       | (0<<WDCE)  // Watchdog Change Enable
       | (0<<WDIE)  // Watchdog Interrupt Enable
       | (0<<WDIF); // Watchdog Interrupt Flag

// Hauptprogramm (Endlosschleife) 
PORTA = a;   // <-- Reset an Port A ausgeben
 while(1){
  PORTC ^= _BV(PC1); // toggel Pin PC1
 }  
 return 0;
}

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste mal die Hardwareanschaltung.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
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.

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Simon
ich Esel - habe mal ein
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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
The Watchdog always on (WDTON) fuse, if programmed, will force the
Watchdog Timer to System Reset mode. With the fuse programmed the System
Reset mode bit (WDE) and Interrupt mode bit (WDIE) are locked to 1 and 0
respectively. ...
Danke euch! Die 'Schläge auf den Hinterkopf' haben's gebracht.
Gruß
Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.