Forum: Compiler & IDEs ATmega8 und delay: Ich versteh die Welt nicht mehr


von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab ein großes Problem: Nachdem ich ein wenig mit Soft-PWM 
rumgespielt habe, funktionieren die einfachsten Sachen nicht mehr. Das 
primitive Blink-Programm (das so auf dem selben uC mal tat) will einfach 
nicht mehr.

Jeder Wert <= 13 funktioniert, dann leuchtet die LED halt mit halber 
Helligkeit. Bei größeren Werten kommt er aber gar nicht mehr bis zum 
Einschalten.

Der Code wird korrekt zum uC übertragen, ich kann ihn von dort wieder 
auslesen, das kann also nicht der Fehler sein.

OK, dann mal die Fakten: Ich hab hier einen ATmega8, die Fuses sind in 
der Standardeinstellung (ich hatte den Takt mal falsch gesetzt, da hat 
sogar der Timer gesponnen, aber jetzt sind sie wieder auf 0xC1 0x99). 
Compiler ist avr-gcc 4.1.3 20080612 bzw. WinAVR-20081205 (mit beiden 
getestet, gleiches Problem). Optimierung ist -Os, F_CPU ist auch richtig 
gesetzt.

Ich hab das Programm mit 13 und 14 kompiliert und dissassembliert, sieht 
alles OK aus, der einzige Unterschied ist die 
Warteschleifeninitialisierung:
1
_delay_ms(13):
2
  62:   e2 eb           ldi     r30, 0xB2       ; 178
3
  64:   fc e0           ldi     r31, 0x0C       ; 12
4
5
_delay_ms(14):
6
  62:   ec ea           ldi     r30, 0xAC       ; 172
7
  64:   fd e0           ldi     r31, 0x0D       ; 13

Ich hoffe, mir kann hier jemand helfen!

Ansonsten: Frohe Weihnachten!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> OK, dann mal die Fakten: Ich hab hier einen ATmega8, die Fuses sind in
> der Standardeinstellung (ich hatte den Takt mal falsch gesetzt, da hat
> sogar der Timer gesponnen, aber jetzt sind sie wieder auf 0xC1 0x99)

Schau mal nach der Fuse "Watch-dog Timer always on; [WDTON=0]" bzw. 
schalte die mal aus.

Hinweise zum Watchdog:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Der_Watchdog

Insbesondere dieser Abschnitt: "Es besteht die Möglichkeit 
herauszufinden, ob ein Reset durch den Watchdog ausgelöst wurde..."

von Christian (Gast)


Lesenswert?

Super, danke, ich hab die Fuse ausgeschaltet, jetzt tuts.

Aber ich würde auch ganz gern verstehen, was da eigentlich passiert. 
Irgendwas muss den Watchdog ja ausgelöst haben. Wie gesagt, delay bis 13 
ms funktioniert, mehr nicht. Auch wenn zum Beispiel 2 mal hintereinander 
10 ms warte, hängt er (möglicherweise packt das dann der Compiler 
zusammen). Komischerweise tat halt genau dieses Programm unverändert 
schon mal (mit WDTON=0) und jetzt nicht mehr.

Naja, ich brauch den Watchdog grad nicht, ich kann also wieder spielen.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich hatte das Problem auch mal 
(http://www.mikrocontroller.net/articles/Pollin_Funk-AVR-Evaluationsboard#Parallelport_ISP_Typ_STK200). 
Damals hatte ich vermutet, dass die im Netz angegebenen 
Default-Einstellungen einen aktivierten Watchdog beschreiben, das aber 
in den Werkseinstellungen nicht der Fall ist. Nachdem man das erste Mal 
die vermeintlichen Werkeinstellungen reaktiviert hat, sitzt man im 
Resetwunderland. Bisher hatte ich noch keinen "frischen" AVR zum 
nachkontrollieren dieser These.

von Christian (Gast)


Lesenswert?

Die These könnte stimmen. Das Datenblatt des ATmega8 gibt Dir Recht:
1
Fuse High Byte | Bit No. | Description   | Default Value
2
---------------+---------+---------------+---------------------------------------
3
WDTON          | 6       | WDT always on | 1 (unprogrammed, WDT enabled by WDTCR)

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.