Hallo, ich verwende einen Atiny85s am USB-Port als Datenschleuder. Alles wunderbar. Nun begibt es sich, das ich den AVR neu starten muss. Hierzu verwende ich eine von Atmel genannte Methode: [cpp] cli(); wdt_enable (WDTO_15MS); while (1);//Reset Atiny85 by never respond watchdog [/cpp] Das verstehe ich nicht. Der Atiny hängt dann und wird auch danach nie wieder etwas "sagen". Wo ist also der Denkfehler, bzw. Wie kann ich ein rein/raus -Steckvorgang am USB-Port simulieren ? Der Baustein wird von einem Windows Rechner versorgt und tauscht 2000 Bytes/Sekunde mit dem Host aus. Der Atiny läuft mit 16.5 Mhz basierend auf V-Usb Kompiliert mit Atmel Studio, upload via usbasp. Vielen Dank für Hinweise Karsten http://flexxvision.de/konnektivitaet.html#a1888
Karsten S. schrieb: > wdt_enable (WDTO_15MS); AHbe noch nie mit dem Watchdog gearbeitet.. aber der überwacht den Programmablauf und löst einen Reset aus wenn etwas hängt. Du lässt ihn hängen und nach 15ms löst der Watchdog den reset aus.
Hallo Phillip, Vielen Dank für deine schnelle Antwort. Ja das wäre schon schön, aber nach dieser Aktion ist das Teil leider tot. Ich muss dann manuell das Dingens triggern. hmm...
Karsten S. schrieb: > Ja das wäre schon schön, aber nach dieser Aktion ist das Teil leider > tot. > Ich muss dann manuell das Dingens triggern. Nach einem WDT-Reset bleibt der Watchdog weiter aktiv und schlägt dann irgendwann zu, wenn man ihn nicht triggert. Deshalb sollte man ihn gleich am Anfang der main() deaktivieren, wenn man ihn nicht braucht.
Hallo Chris, also das hat gefehlt, sehr gut! So bleibt das Teil am Leben. Wenn ich den ResetPin triggere (FUSE hier auf Reset erlaubt) Dann wird die Mainfunktion nicht mehr aufgerufen. (manuelles re- Stöpseln nötig) Kann man da etwas machen ? Wenn ich Reset an der Fuse verbiete ist der Port als normaler IO nutzbar stimmt das ? Danke für Hinweise. Karsten
Karsten S. schrieb: > Wenn ich Reset an der Fuse verbiete ist der Port als normaler IO nutzbar > stimmt das ? Und dein Tiny kann nicht mehr per ISP geflasht werden...
für einen Mega AVR verwende ich immer folgende Codezeilen um das von dir beschriebene Problem zu vermeiden: in einer separaten *.c Datei:
1 | #include <avr/wdt.h> |
2 | #include "watchdog_handle.h" |
3 | |
4 | void handle_watchdog_reset(void) |
5 | {
|
6 | MCUSR = 0; |
7 | wdt_disable(); |
8 | }
|
in einer separaten *.h Datei:
1 | /*
|
2 | Nach einem Watchdig Reset wird die Funktio handle_watchdog_reset() vor dem Programmstart
|
3 | ausgeführt um den Watchdogtimer frühzeitig zu deaktiveren. Ohne diese Routine
|
4 | würde der Controller nach einem Reset nicht mehr starten, da der WDT immer
|
5 | wieder einen Reset erzwingen würde.
|
6 | |
7 | */
|
8 | |
9 | void handle_watchdog_reset(void) __attribute__((naked)) __attribute__((section(".init1"))); |
Ob das Register genau so passt musst du selber prüfen. Hoffe es hilft dir weiter
Marc V. schrieb: > Und dein Tiny kann nicht mehr per ISP geflasht werden... Genau so muss das sein, danke für die Warnung. Gruß K.
Ingo L. schrieb: > handle_watchdog_reset Das ist ja interessant, und ich probiere das gleich aus. Danke Karsten
Lieder noch nicht, der Handler wurde nicht angesprungen, bezüglich der
Vereinbarung section(".init1"... Ich muss da erst weiter forschen.
Allerdings wird auch Main nie wieder angesprungen, nach Betätigung des
RestBits oder nach Auslösung des Verfahrend über Watchdog.
In allen Fällen muss ich den Dongle ein/ausstecken was man nicht möchte.
Ich verändere nämlich zur Laufzeit die PID und VID und lade über WinUsb
*.inf das Gerät neu.
Na aber Danke der Nachfrage, das wird der Tage noch.
Grüsschen aus Berlin
Karsten
Wichtig ist das MCUSR = 0; Die Init-Sektion brauchst Du nicht, dazu hat der ATtiny zu wenig RAM. Im Main reicht völlig.
Hallo Peter, nach meiner Aktion : [cpp] cli(); wdt_enable (WDTO_15MS); while (1);//Reset Atiny85 [/cpp] Ist der Tiny tot, main() wird nichtmehr angesprungen. Ich denke der bleibt in der while stecken.. mal sehen morgen.. Danke Dir, Lg Karsten
Ok gelöst aus CLI wurde STI... warum es in der Atmel Doku andersrum steht weiß ich nicht... thx K.
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.