AVR Atiny85 Restart

Gast #4638702
Lesenswert?
• ▲
▼
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
Gast #4638775
Lesenswert?
• ▲
▼
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.
Gast #4638845
Lesenswert?
• ▲
▼
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
#4638859
Lesenswert?
• ▲
▼
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
Gast #4639344
Lesenswert?
• ▲
▼
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
Gast #4639547
Lesenswert?
• ▲
▼
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren