- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 14

Thema: ATtiny13 - Wie Sleep beenden ohne externes Signal

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.678
    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

Ä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
  •  

Solar Speicher und Akkus Tests