Es läuft.
Sprich: der Controller wird bestromt, fährt eine Blinksignatur ab - mit waits, ohne Interrupt - und startet die eigentliche Watchdog-Testsequenz:Das sollte also ordentlich arbeiten. Tat es nicht, siehe Link auf Oszillogramm. (Anm.: für das Oszillogramm wurde die LED aus dem Steckbrett entfernt). Blöd! Diese 10-Hz-Rechteckfrequenz ist mir immer noch unerklärlich. Nach einigen unsinnigen und überflüssigen Überprüfungen des Quelltextes hatte ich das Testboard komplett von der Stromversorgung abgeklemmt und dann wieder bestromt. Siehe da . . . nu läufts wie gewolltgehofftgeplant - 8sec LED=an, 8sec LED=aus.Code:// ============================================================================= = // === HAUPTProgramm ========================================================== = // Initialisierungen, LED kurzblinken = Signal für Programmstart ============== = // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - int main (void) // { // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Pins/Ports als Ein- (0) oder Ausgang (1) konfigurieren, Pull Ups mit (1) aktiv // EEEEEAEA DDRB = 0b00000101; // Anschlussbelegung s.oben, tiny85 hat nur PB0..PB4(PB5) PORTB = 0b11111010; // PB0 = Test.LED, nur für TestAnzeige des "Stundentakts" // PB1 = Taster, akt. PullUp, Eingang: NUR durch /RESET // PB2 = LED-Kette, default auf Dunkelphase eingestellt // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Vorstart-Blink => x Blinkies rot - damit man sieht, dass etwas geht for ( u8 st = 0; st < 3; st ++ ) // Anzahl Blinkies rot { // SetBit (PORTB, rLED); wms ( 20 ); // Port PB0 rLED ein ClrBit (PORTB, rLED); wms ( 10 ); // Port PB0 aus } // Ende for ( STdAnz = 0; STdAnz <?; STdAnz ++ ) SetBit (PORTB, rLED); wms ( 100 ); // Port PB0 rLED ein ClrBit (PORTB, rLED); // Port PB0 aus // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SetBit (PORTB, kLED); wms ( 20 ); // Port für/mit PB0/rLED ClrBit (PORTB, kLED); wms ( 20 ); // Port für/mit PB0/rLED SLP0init ( ); // Ruhemodus SLEEP0 vorbereiten / initialisieren while ( 1 ) // Hier folgt das eigentliche Hauptprogramm { // SetBit (PORTB, kLED); // SLEEP0 ( ); // Ruhemodus SLEEP0 - dauert ca. 8 sec ClrBit (PORTB, kLED); // Port für/mit PB2/gLED aus SLEEP0 ( ); // Ruhemodus SLEEP0 - dauert ca. 8 sec } // Ende while ( 1 ) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - return 0; // Traditionelles Ende von main } // Ende main // ============================================================================= =
Nachfolgende Versuche konnten das Fehlverhalten reproduzieren: Im Programmier-/Flashmodus des Controllers Taktfrequenz erhöhen, Flashtakt erhöhen, flashen, Controllertakt auf 128kHz runter - und das 10-Hz-Blinken kommt (gefühlt immer, bin aber nicht gaanz sicher). Stromversorgung völlig aus nach dem Flashen bringt nach dem Wieder-Bestromen die gewünschte Funktion. Stromverbrauch mit METRAHit 12S: 00.00 mA. Genauer wurde noch nicht gemessen. Mit der Ampere-am-Volteingang-Methode sinds im Alle-LED-aus-Zustand ca. 0,4 µA bei 4,7 V.
Was jetzt noch folgt wird ein Zähler in der while-Schleife mit dem eine längere Zeitspanne realisiert werden kann.
Danke allen Helfern.
- - - Aktualisiert - - -
Der Vollständigkeit halber die Codesammlung WDT etc:
Code:/* >> Stand D:\D_pro-fils\compu_MC\C1 mC Projekte\C_test1\Ctst1_tmrxx.c =============================================================================== = Target MCU : siehe main Tiny13 Target Hardware : siehe main Target cpu-frequ. : siehe main =============================================================================== = *** Version / Versionsgeschichte: x12 23Jan22 2252 Seltsame Probleme beim Flashen. Läuft ganz gut x11 15Jan22 16hh Div. Aenderungen x10 17Jan22 1758 Erste Versuche mit WDT (erfolglos) x00 Nur ~wms~ =============================================================================== = Doku: D:\D_pro-fils\compu_MC\Datenblätter\atmel-controller_Datenblätter_App-Notes \ATtiny13_doc2535J_08-10-akt-neueste.pdf =============================================================================== = *** Aufgabenstellung : WDT-Timer für längere Pausen mit minimalist. Strombedarf ============================================================================== */ // =============================================================================== // =============================================================================== /*##### Variablenliste, global #####*/ // =============================================================================== // =============================================================================== // ##>> Macros zum Setzen, Löschen und toggeln von Bits bzw. Ausgängen #define SetBit(ADDR,BIT) ((ADDR) |= (1<<(BIT))) // Setz PORTC |= (1<<5); #define ClrBit(ADDR,BIT) ((ADDR) &= ~(1<<(BIT))) // Lösch PORTC &= ~(1<<5); //#define ToggleBit(ADDR,BIT) ((ADDR) ^= (1<<(BIT))) // Toogel PORTC ^= (1<<5); //#define IsBitClr(ADDR,BIT) (~ADDR & (1<<BIT)) // Bit=0? //#define IsBitSet(ADDR,BIT) (((ADDR)&(1<<BIT))?1:0) // Bit=1? IsBitSet (P, RC5pin // if (!(PINC & (1<<4))) // Wenn RC-5-Sensor LOW <=> IR ist on, und // .. ==> praktisch keine Abschaltung // if (!(PINC & 0x10)) ADCMMM = 2; // Ist Bit 4 gelöscht? 0x10 = 0b 0001 0000 // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #define PB PORTB // Kurzwort für PORTB #define kLED 2 // Lichterkette LED auf PB2 #define rLED 0 // Rote LED auf PB0 // // =============================================================================== // FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP = // FP FP FP FP Funktionsprototypen FP FP FP FP FP FP FP FP FP FP FP FP FP FP = void SLP0init (void) ; // Ruhemodus SLEEP0 vorbereiten / initialisieren void SLEEP0 (void) ; // Ruhemodus SLEEP0 startem ISR(WDT_vect) { } ; // Ende ISR(WDT_vect) void wms( uint16_t ms ) ; // Der Pausenwert ist nur experimentell ! // FP FP FP FP E N D E FP FP FP FP FP FP FP FP FP FP FP FP FP FP = // FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP FP = // ============================================================================= = // N E U Basis "alter" SLEEP1, Adaption aus searcher´s tiny44_WDT_Demo-in-BAS // ============================================================================= = // Dok D:\D_pro-fi...blätter\atmel-controller_Datenblätter_App-Notes // \ATtiny13_doc2535J_08-10-akt-neueste.pdf // ============================================================================= = // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void SLP0init (void) // Ruhemodus SLEEP0 vorbereiten / initialisieren { // cli(); wdt_reset(); // Reset Watchdog Timer MCUSR &= ~(1 << WDRF); //Ruecksetzen des Watchdog System Reset Flag MCUCR |= (1 << SM1); // SM1: Power Down 46 WDTCR |= (1<<WDP3) | (1<<WDP0); WDTCR |= (1 << WDTIE); // Watchdog Timer Interrupt Enable 41 return; } // Ende void SLEEP1 (void) -- Ruhemodus ein, wake up dur // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ============================================================================= = // ============================================================================= = // SLEEP - Test für sleep per Watchdog // ============================================================================= = // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void SLEEP0 (void) // Ruhemodus SLEEP0 startem { // MCUCR |= (1<<SE); // SE: Sleep enable 46 sei(); // asm volatile ("sleep"); // Inline-Assembler MCUCR &= ~(1<<SE); // => alten Zustand / zurücksetzen return; } // Ende void SLEEP1 (void) -- Ruhemodus ein, wake up dur // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ============================================================================= = // ============================================================================= = ISR(WDT_vect) { } // ISR(WDT_vect) - Nur Ansprungstelle // Mehr Infos: https: //arduino-projekte.webnode.at/meine-projekte/attiny-im-schlafmodus/wecken-mit-wdt/ // ============================================================================= = // ============================================================================= = //### Programm pausiert !! Dauer experimentell ! schwankt >> mit Temperatur ! // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void wms ( uint16_t ms ) // Der Pausenwert ist nur experimentell ! // - - - - - - - - - - - - - - - - { // Weiter Messwerte in L3_tmr10.c und früher for(; ms>0; ms--) { // uint16_t __c = 1000; // 17Jan22.18h08 : // Zeitmessung 50 "ms" sind 2,0 sec, 500 "ms" = 20 sec __asm__ volatile ( // siehe hierzu main, ca. Zeile 156ff "1: sbiw %0,1" "\n\t" // schwankt >> mit Temperatur ! ! ! "brne 1b" : "=w" (__c) : "0" (__c) ); } } // ============================================================================= = // ============================================================================= = // ===== ENDE Subroutinen ================================================= = // ============================================================================= =







Zitieren
Lesezeichen