Forum: Mikrocontroller und Digitale Elektronik AVR Atiny85 Restart


von Kahn P. (Gast)


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

von Philipp_K (Gast)


Lesenswert?

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.

von Kahn P. (Gast)


Lesenswert?

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...

von chris (Gast)


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.

von Kahn P. (Gast)


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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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...

von Ingo L. (corrtexx)


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

von Kahn P. (Gast)


Lesenswert?

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.

von Kahn P. (Gast)


Lesenswert?

Ingo L. schrieb:
> handle_watchdog_reset

Das ist ja interessant, und ich probiere das gleich aus.

Danke
 Karsten

von Ingo Less (Gast)


Lesenswert?

Und? Hats geklappt?

von Kahn P. (Gast)


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

von Peter D. (peda)


Lesenswert?

Wichtig ist das MCUSR = 0;
Die Init-Sektion brauchst Du nicht, dazu hat der ATtiny zu wenig RAM. Im 
Main reicht völlig.

von Kahn P. (Gast)


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

von Kahn P. (Gast)


Lesenswert?

Ok gelöst aus CLI wurde STI...

warum es in der Atmel Doku andersrum steht weiß ich nicht...

thx
 K.

von Ingo L. (corrtexx)


Lesenswert?

Darf man fragen was "STI" ist?

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.