Einen schönen guten Morgen! ich programmiere mit ATmega16, ich will den Watchdog nicht für Reset verwenden, sondern als ganz normalen Timeout mißbrauchen. Kann man die Funktion von "Reset" diabeln und dafür z.B. eine Funktion aufrufen lassen, wenn der Watchdog losgeht? aus der wdt.h hier die ASM Funktion von dem _wdt_write(timeout) (= wdt_enable(timeout) ) #define _wdt_write(value) \ _asm__ __volatile_ ( \ "in _tmp_reg_,__SREG__" "\n\t" \ "cli" "\n\t" \ "wdr" "\n\t" \ "out %0,%1" "\n\t" \ "out _SREG_,__tmp_reg__" "\n\t" \ "out %0,%2" \ : /* no outputs */ \ : "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \ "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)), \ "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \ _BV(WDE) | (value & 0x07)) ) \ : "r0" \ ) Ich kenne mich mit ASM nicht gut aus, es müsste ja ein Befehl ähnlich "JMP 0" oder so kommen, kann man den nicht durch was anderes ersetzen? Oder ist die Reset - Funktion per Hardware festgelegt?
Das hat damit überhaupt nix zu tun. Der Reset nach einem Watchdog-Timeout ist eine Hardware-Angelegenheit. Da hat man als Programmierer keine Eingriffsmöglichkeit. Die Funktion oben konfiguriert lediglich den WDT.
Ja, aber man kann beim Startup abfragen, ob ein WDT den Reset ausgelöst hat. Bei Atmel kenne ich mich da nicht aus, beim PIC gehts.
Bei neueren AVRs kann man auch einen Watchdoginterrupt aufsetzen und den Watchdog so konfigurieren, daß beim ersten Timeout der Interrupt ausgeführt wird und erst beim nächsten Timeout der harte Reset. Allerdings hat doch der Mega16 schon haufenweise Timer (T0, T1, T2), da muß man doch überhaupt nicht den Watchdog mißbrauchen. Peter
>Bei Atmel kenne ich mich da nicht aus, beim PIC gehts. Geht auch beim AVR (Atmel stellt auch noch andere Controller her...). Der Watchdog sollte aber eher nur im Notfall für sowas benutzt werden (Ich schliesse mich da mal wieder Peter an).
OK Danke, dachte nur wenns ginge, könnte man sehr einfach ein Timeout realisieren mit den vom WDT vordefinierten Werten. Ohne große Registerbeschreiberei. Trotzdem THX
Naja, so viel mehr Arbeit ist doch der Timeout mit einem normalen Timer auch nicht. ,,Mit den vordefinierten Werten'' musst du dort auch lediglich die CSxx-Bits im TCCRxB-Register setzen sowie das TOIEx-Bit im TIMSK oder TIMSKn. Eine ISR hättest du ja für die Watchdog-Variante ohnehin benötigt.
Wenne ich den Timer2 nehm (Timer0 und Timer1 sind belegt) kann ich max mit Vorteiler 1024 und 16Mhz CPU Takt ein Timerüberlauf nach 16ms produzieren, das ist viel zu wenig, ich brauche was im Bereich von ~sec. Für den Watchdog eine ISR? Wußte nicht dass der eine hat...
Nachtrag von mir selbst: Mit einem 32kHz Uhrquarz extern an T2 kann ich eine Überlaufzeit von max 8s erzeugen, so könnte es gehen, allerdings dann nur mit Hardwareeingriff!
Was hindert Dich denn daran, im Interrupt noch ne Variable zu zählen, bis die Zeit rum ist ? z.B. alle 10ms nen Interrupt und dann von 100 runterzählen, schon hast du eine Sekunde. Mit 8 Bytes kannst Du auch Giga-Jahre zählen. Peter
Öhm ja, guter Tip! So könnte man das realisiern... Resultierend der frühen Tageszeit waren meiner geistigen Kreativität enge Grenzen gesetzt... Thx ;-)
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.