AVR / AT90USB - Alterungseffekt? Rest - Anlauf - Reset durch FW?

OP #1647415
Lesenswert?
• ▲
▼
Moin zusammen!

Ich habe bei einem AT90USB gerade ein sehr seltsames Verhalten ...

Der Controller (AT90USB1287) läuft nun seit ca. 6 Monaten mit einer 
Firmware, die das CDC-Beispiel (virtueller Comport über USB) von Atmel 
integriert hat. An dem Beispiel-Code hab ich auch nicht viel geändert - 
nur die PLL auf meine externen 16MHz angepasst (natürlich auch in Fuses 
berücksichtigt).

Nach 6 Monaten quittiert der Controller plötzlich seinen Dienst und 
generiert ein Reset ... läuft an ... 0.5 - 1s ... wieder Reset.

Sehr komisch ... also spiele ich mal eine Firmware drauf, in der die 
App-Note von Atmel auskommentiert ist. Und siehe da ... kein Reset mehr, 
sondern läuft normal an und führt seine Aufgaben durch.

Die Frage ist jetzt: Was kann sich mit der Zeit verändern, sodass der 
USB-Teil der Firmware bzw. die Nutzung der USB-Hardware solche Resets 
verursachen kann?
Dabei ist es auch egal, ob ein Host-PC angesteckt ist oder nicht.

Die Watchdog-Fuse ist deaktiviert.
An den Wachtog timings des CDC-Codes habe ich auch schon herumgespielt, 
ohne dass sie davon das Reset .. Anlauf-Verhalten geändert hätte.

Übrigens habe ich auch einige Geräte, die bereits 12Monate mit der 
gleichen Firmware laufen - keine Probleme.
OP #1655244
Lesenswert?
• ▲
▼
Hab das Verhalten nochmals untersucht ...

In die Firmware ist ja ein Teil der CDC - App Note (Virtual COM Port) 
von Atmel eingeflossen.
Nun scheint es so zu sein, dass diese den ID-Pin abfragt, ob er sich 
mitten im Betriebgeändert hat (und damit die Rolle unseres USB-Gerätes).
Wenn dem so ist, wird wohl bewusst der Watchdog angeschaltet, und mit 
einer while(1); wird ein Reset provoziert.

In der Beispiel-Datei "usb_task.c" aus dem Atmel-Beispiel sieht das dann 
so aus:
1
(...)
2
   if( g_old_usb_mode != g_usb_mode )
3
   {
4
      // ID pin hot state change
5
#if ( ID_PIN_CHANGE_GENERATE_RESET == ENABLE)
6
      // Hot ID transition generates wdt reset
7
      wdtdrv_enable(WDTO_500MS);
8
      while(1);
9
(...)

Jetzt ist die Frage, warum lief dass dann eine Weile und dann schlägt 
plötzlich immer wieder dieser Mechanismus zu?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.