- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: ATtiny13 - Wie Sleep beenden ohne externes Signal

  1. #11
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.684
    Anzeige

    Praxistest und DIY Projekte
    .. ich finde keine Interrupt Routine. Springt der µC ins Leere?
    ..
    Die Zeile "WDTCR &= ~(1<<WDE); // Watchdog Timer Interrupt D I S able 41" ist unnötig und wird vermutlich auch nicht ausgeführt
    Danke! Richtig, ich finde auch keine WDT-ISR. Hab ich nachgetragen. Die genannte Zeile gelöscht . . .
    Noch immer gibts nur so ´n Blinzeln im Oskar (klick).
    Geändert von oberallgeier (24.01.2022 um 09:02 Uhr)
    Ciao sagt der JoeamBerg

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Code:
        WDTCR  |=   (1<<WDE) | (1<<WDCE) | (1<<WDP3);
    Diese Zeile hatte ich eben auch übersehen. WDE setzt den Watchdog RESET. Du möchtest aber den Watchdog Interrupt. Muß also auch weg zusammen mit WDCE.
    MIT WDP3 wird der Timer auf 4 Sekunden eingestellt. OK.
    Bleibt nur WDTCR |= (1<<WDP3); von der Zeile übrig.
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #13
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.684
    . . Bleibt nur WDTCR |= (1<<WDP3); von der Zeile übrig . .
    Danke - läuft. Anfangs mit Stolpersteinen. Ausführlich erst morgen.
    Ciao sagt der JoeamBerg

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.684
    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  ================================================= =
    // ============================================================================= =
    Geändert von oberallgeier (24.01.2022 um 19:39 Uhr) Grund: Strombedarf
    Ciao sagt der JoeamBerg

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Antworten: 14
    Letzter Beitrag: 16.09.2008, 18:27
  2. Externes PWM-Signal einlesen und Auswerten
    Von Caligula im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 21.08.2008, 20:27
  3. ADC-Wert ohne Signal
    Von pacer_one im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 03.03.2008, 20:45
  4. Interruptroutine durch externes Signal starten...
    Von Spartakaktus im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 19.05.2006, 14:27
  5. Prozess beenden
    Von Jimmy C im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 10.01.2005, 20:53

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen