Es läuft.
Sprich: der Controller wird bestromt, fährt eine Blinksignatur ab - mit waits, ohne Interrupt - und startet die eigentliche Watchdog-Testsequenz:
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
// ============================================================================= =
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.
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 ================================================= =
// ============================================================================= =
Lesezeichen