Habe schon gesucht, aber nichts gefunden.. Kann mir jmd kurz schreiben, wie ich beim Atmega8 mit internem Oszi die Fuses setzen muss und welche C Macros den Watchdog deaktivieren? WDTCR = 0x1F; WDTCR = 0x07; und wdt_disable(); gehen nicht. Fuses: hfuse: 0xD9 lfuse: 0x24 Danke schonmal!
Florian Sc schrieb: > Habe schon gesucht, aber nichts gefunden.. Quatsch mit Soße... Liest Du kein Datenblatt? > Kann mir jmd kurz schreiben, wie ich beim Atmega8 mit internem Oszi die > Fuses setzen muss und welche C Macros den Watchdog deaktivieren? Warum deaktivieren? Hast du den Watchdog denn vorher in Deinem Programm aktiviert? Wie kommst du zu der Erkenntnis, dass der Watchdog läuft? Regelmäßiger Neustart des Programms? Dies könnte auch durch einen auftretenden Interrupt ausgelöst werden, für den Du keinen Interrupthandler geschrieben hast.
Ich muss in die Programmschleife cli(); einfügen, sonst läuft es nicht - daher denke ich der Watchdog ist es..
atmega8 hat afaik keinen watchdog interrupt. der watchdog wird immer aufgerufen egal ob mit oder ohne cli und sei ich denke du hast deinen stack nicht/fehlerhaft initialisiert. sind alle interruptvektoren richtig drin?
Florian Sc schrieb: > Ich muss in die Programmschleife cli(); einfügen, sonst läuft es nicht - Häää? Wie bitte? Lass mal die Hose runter und poste deinen Code als Anhang... > daher denke ich der Watchdog ist es.. Guuuute Kombinationsgabe.... ;)
retreti schrieb: > atmega8 hat afaik keinen watchdog interrupt. Den hat KEIN AVR. Der Watchdog, sofern er denn überhaupt einmal gestartet wurde, löst im Falle des nicht rechtzeitigen Zurücksetzens einen Reset aus. > der watchdog wird immer aufgerufen egal ob mit oder ohne cli und sei Der Watchdog wird nicht aufgerufen. Er wird gestartet, gestoppt oder zurückgesetzt. Dass das Ganze dann unabhängig von cli und sei läuft stimmt allerdings.
Dein Programm wackelt, wenn überhaupt, nur zwei mal an dem Portpin und verharrt dann in einer Endlosschleife. Wo meintest Du, müsstest Du ein cli() einfügen, dass die Klospülung funktioniert?
Ah... hab das cli() eben entdeckt. Ist aber trotzdem blanker Unsinn! Wo ist der Rest von Deinem Problemcode?
Ui... allen Ernstes übersehen. Doch schon so spät? Trotzdem werde ich das Gefühl nicht los, dass Dein Problemcode auf deinem Rechner ein wenig umfangreicher ist.
es ist genau der Code. Wenn ich cli() auskommentiere, leuchtet die LED kurz auf, dann geht sie aus. Mit cli() blinkt es schön im Sekundentakt.
Wie dem auch sei. cli() hat in keinster Weise Einfluss auf einen laufenden Watchdog. Und selbst wenn es etwas mit dem Watchdog zu tun hätte, müsste Deine LED trotzdem blinken (wenn auch anders), da der Watchdog den Controller regelmäßig neu starten würde. Bin kurz davor, mein STK500 rauszukramen und den Schlonz durch nen Mega8 zu drücken....
1 | void delay_ms(unsigned int ms) |
2 | /* delay for a minimum of <ms> */
|
3 | /* with a 1Mhz clock, the resolution is 1 ms */
|
4 | {
|
5 | unsigned int i=0; |
6 | unsigned int j,ii; |
7 | int k; |
8 | for ( i=0;i<300;i++) |
9 | {
|
10 | for(j=0;j < ms;j++) |
11 | {
|
12 | k = -j; |
13 | cli(); // muss rein, sonst geht es nicht |
14 | }
|
15 | }
|
16 | }
|
Ohne dein "cli();) wird die Warteschleife komplett wegoptimiert. Woher hast du dieses merkwürdige Gebilde?
Hat noch jemand anders ne Idee? Macht auf jeden Fall nen Unterschied mit oder ohne cli();
Ich schließe mich mal dem Herrn Müller an. Ohne das cli ist die Schleife wirklich sinnlos und wird mit 99,9%iger Sicherheit wegoptimiert. Und wozu bitte ist das k darin gut?
Magnus Müller schrieb: > retreti schrieb: > atmega8 hat afaik keinen watchdog interrupt. Richtig. > Den hat KEIN AVR. Der Watchdog, sofern er denn überhaupt einmal > gestartet wurde, löst im Falle des nicht rechtzeitigen Zurücksetzens > einen Reset aus. Da muß ich Dich enttäuschen, das ist falsch. Die neueren Avr's , wei z.B. Atmega88 oder 644 gehen erst in den WDT-Interrupt, sofern sei() gesetzt (äußerst schön um erst ein paar Sachen zu sichern) und gehen dann erst in den Reset. >@ Florian Sc: >Hat noch jemand anders ne Idee? Macht auf jeden Fall nen Unterschied mit >oder ohne cli(); Naja ich vermute auch mal das die schleife wegoptimiert wird, da ja in ihr nix passiert, wenn cli() fehlt. Schon mal ohne Optimierung compiliert ? Dann optimiert der compiler auch nix raus.Zeig doch mal deine .LSS Datei. Da kann man im Assembler Code genau sehen ob die Schleife fehlt oder nit! Besser benutze einfach util\delay.h, da kannste nix falsch machen. Oder noch besser Timer. Gruß
Die Schleife wird ohne cli() definitiv wegoptimiert. Habe das Ganze mal zur Probe compiliert. Im Anhang das .lss MIT cli().
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.