Bitte um Hilfe zu meinem Watchdog-Reset. Ich habe bisher keine funktionierende Erfahrung mit Watchdog, die paar Anleitungen haben bisher nicht geholfen - zum Beispiel forumswissen oder dies hier.
Umgebung: mega1284P auf RNControl, 20 MHz, AVRStudio4, Programmer Pololu USB AVR Programmer, Labornetzteil, etliche Peripherie - andere Platinen über UART und I²C - die aber im Test alle abgeklemmt sind ausser UART und LCD auf PortB.
Der Watchdog wird durch avr/wdt.h eingebunden und als erste ausführbare Codezeile im main disabled. Auslösung durch ein Dreierpaket RC-5-Code aus (IR-FB-) Tastencode "0","0","0".
Codeauszüge:
Und so wird irgendwann durch Eingabe per RC-5 -- drei Bytes der Zifferntaste "0" -- der Watchdog ausgelöst:Code://... // #include <stdlib.h> // #include <avr/io.h> // #include <avr/interrupt.h> // #include <avr/wdt.h> // // - - - - - - - - - - - - - - - - // CPU wird NICHT definiert im AVRStudio Current Configuration Options // wird ab hier von twimaster*.c u. evtl. anderen Libs benötigt #define F_CPU 20e6// ============================================================================= = // === HAUPTProgramm ========================================================== = // Initialisierungen, LED1 kurzblinken als Signal für Programmstart, // Ausgabe des Identifizierungsstrings per UART // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - int main(void) // { // uint8_t i; // uint16_t ADC_ist; // uint16_t l = 500; // Laufvariable für ADC-Abschaltung unten .... // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Anmerkung: bishier nur Includes, Defines, Deklaratonen und Definitionen wdt_disable(); // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Ports+Pins als Ein- (0) od. Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren // A = Ausgang, E = Eingang ohne , EU = Eingang MIT PullUp // - - - - - - - - - - - - - - - - DDRA = 0b00000000; // siehe aktuell oben oder Fortschritt/R2D2 PORTA = 0b00010000; // Für ADC: PA6+PA7 = ADC-Eingang ##>> OHNE Pullup !! // DDRB = 0b11111011; // siehe aktuell oben PORTB = 0b01000000; // L1g on // DDRC = 0b11101100; // PC0 .. 7 (!) aktiv bei mega1284 !, PC0=SCL, PC1=SDA PORTC = 0b11110000; // PC4 ist Eingang für RC-5 (war PB2) // DDRD = 0b11111111; // -> siehe unter DDRB PORTD = 0b00000000; // Ports/Pull Ups (1) aktivieren // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //for(i=0; i<10; i++) // gLED2(PB5) blinken lassen bevor Interrupts erlaubt sind
Meine Programmierung basiert auf diesem Code aus dem RNW issen.Code:if ( iBB16 == 0 ) // bei "000" WatchdogReset auslösen { // // #include <avr/wdt.h> cli(); // Interrupts global abschalten wdt_enable (WDTO_15MS); // Watchdog aufziehen auf 15ms while (1); // warten, bis er zubeisst... }
Der Betrieb des Programms läuft in einer zufälligen Testsequenz - verschiedene Aktionen und Ausgaben - sinnvoll. Der Watchdog wird wunschgemäß ausgelöst, nachdem der oben genannte Code "000" eingegeben und erkannt wurde. Danach läuft der Controller/die Platine nicht mehr (sinnvoll). Es dämmert nur eine LED vor sich hin. Drücken des /RESETknopfes oder [Read Signature] im AVR-Studio hilft nicht. Programmieren/Flashen ist nicht mehr möglich. Ein Wiederstart ist nur möglich durch Abklemmen des UART (RxD/TxD auf PD0 und PD1 über den Pololu-Programmer) und Abschalten der allgemeinen Versorgung.
Bitte um Hilfe und danke im Voraus.







Zitieren


Lesezeichen