- 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.686

    ATtiny13 - Wie Sleep beenden ohne externes Signal

    Bitte um Hilfe.
    Aufgabe: Aufwecken eines tiny13 aus dem idle- oder einem sonstigen sleep ohne externes Signal.

    Hintergrund.
    Tiny85/sleep :
    Mein Pacer läuft auf nem tiny85 mit internem Oszillator und mit nem 9V-Block seit Monaten. Hier der Schaltplan und die Bestückung (Board) auf Lochplatte. Zur bequemen Bedienung sind zwei Tasten ausreichend.

    Tiny85 - Aufgabe/Nutzung: mehrmals wöchentlich wird jeweils mehrere Minuten der Blinkrhythmus bei Fitnessübungen benutzt.
    Beim ersten Bestromen geht der Pacer sofort in den sleep, ebenso bei geeignetem Tastendruck (TAB länger als 2 sec). Durch Tastendruck (TAB, PB1) länger als 2 sec wird er aus dem Sleep geweckt, das gewünschte Blinkprogramm wird mit den Tasten gewählt, läuft einmal ab und endet mit sleep (siehe Code). So ein Ablauf dauert zwei bzw. fünfundzwanzig (25) Minuten; danach geht der Pacer wieder in den sleep.
    Fazit: das Ding läuft und läuft (wie seit Jahren) und der popelige 9V-Block hält ca. 6 Monate !
    Code:
    // ===============================================================================
    // ===  Ruhemodus fuer tiny85 ===============   // entnommen 28Nov2021 aus Datei
    //      D:\D_pro-fils\compu_MC\C2\PCR_80\alter_code
    //      \PCR80_x64_statsquo_Stand-13-Okt-2010\PCR_80_tmr_x64.c
    //              x64 14Mai10 1930 PWM - dabei blinkt grünLED gaaanz kurz
    //      > > > > A B E R :   PCINT von 2 auf 1 (PB1) gesetzt
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      void SLEEP1 (void)            // Ruhemodus ein, wake up durch PCINT1 auf PIN PB1
    //      war: void schlafPC2 (void)          // Controller in Ruhemodus schalten
    //      Ende des Ruhemodus durch PCINT1 auf PIN1/TAB
    //      Start "normal" mit "Resetblink", danach warten auf Tastendruck ohne LEDs,
    //      nach Tastendruck nochmal Resetblink und dann einschlafen. 
    //      Dies zur Messung des Strombedarfs ausserhalb und im Schlafmodus.
    // - - - - - - - - - - - - - - - -
      {                             //
      GIMSK   |=  (1<<PCIE);        // PinChangeInterrupt enable              doc S  53
      PCMSK   |=  (1<<PCINT1);      // PinChangeInterrupt auf Pin PB1/PCINT1  doc S  54
      MCUCR   |=  (1<<SM1)|(1<<SE); // SM1: Power Down, SE: Sleep enable
                                    //
    // - - - - - - - - - - - - - - - -
      sei();                        //
      asm volatile ("sleep");       // Inline-Assembler
    //      Möglich statt "asm volatile ("sleep");.." auch die folgenden zwei Befehle
    //  sleep_mode ( ); sleep_disable ( ); //
                                    //
      MCUCR   &= ~(1<<SM1)|(1<<SE); // Folgende 3 Zeilen: alten Zustand / zurücksetzen
      GIMSK   &= ~(1<<PCIE);        // PinChangeInterrupt disable
      PCMSK   &= ~(1<<PCINT1);      // PinChangeInterrupt disable Pin PCINT2  doc S  54
    //sei();                        //
    // - - - - - - - - - - - - - - - -
      return;                          
      }                     // Ende void SLEEP1 (void)   -- Ruhemodus ein, wake up dur
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // ============================================================================= =
    Mein Problem:
    Tiny13 :
    Meine Weihnachtsbeleuchtung hat einige kurze Lichterketten die durch je eine minimalistischen Schaltung mit nem tiny13 und einer 3xAA-Batteriebox sieben Stunden eingeschaltet werden. Ausschalten erfolgt nach Ablauf der Zeit durch return 0; Einschalten nach dem ersten Bestromen bzw. durch den /RESET; da ist also IMMER händische Aktion erforderlich. Die schnelle Lösung erfolgte so - Ende durch return 0; - weil mir eine geeignete Lösung mit sleep nicht gelang.
    Zur Stromersparnis in den Ruhephasen wird der interne 128kHz-Oszillator genutzt, schneller ist bei der einfachen, zeitunkritischen Arbeitsweise nicht nötig, langsamer ist - ohne externen Quarz nicht möglich (? - klick mal).

    Nun Suche ich DOCH nach einer Lösung mit dem internen sleep um mir das tägliche wieder-Einschalten zu ersparen.
    Schwierig.
    Allenfalls möglich finde ich eine dummy-ADC-Wandlung die mir den Controller aufweckt. Durch ne entsprechende Anzahl von Weckwiederholungen kann eine geeignete Schleife die gewünschte Dunkelphase von ca. vierzehn Stunden erreichen. Dumm nur dass die sleep-Pausen durch den ADC ziemlich kurz sind, siehe Auszug/Zitat:

    Zitat aus ATtiny13_doc2535J 08/10
    ... A normal conversion takes 13 ADC clock cycles. The first conversion after the ADC is switched on (ADEN in ADCSRA is set) takes 25 ADC clock cycles in order to initialize the analog circuitry, as shown in Figure 14-4 below ...

    Selbst der popelige 8-Bit-Timer könnte das in einer maximal langen Schleife über zehn Mal langsamer - und entsprechend stromsparender. Aber - es gibt nach dem eben genannten Arbeitsblatt keine Möglichkeit - oder doch ? Oder gibt es Quarze oder ähnliche Bauteile zur energiesparenden (energielosen) Takterzeugung?

    Frage:
    Gibt es vielleicht doch ne Möglichkeit - wie auch immer? Nur Energie sollte sie nicht zusätzlich benötigen.

    Danke im Voraus
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.12.2018
    Beiträge
    459
    Ich hab zwar dein Problem nicht wirklich verstanden, aber wenn du was nach Zeitvorgaben steuern willst, dann hast du mindestens diese zwei Möglichkeiten.

    Entweder den Tiny immer in den Sleep Modus schicken und nach der maximalen Sleep-Timer-Zeit (ich glaube 4 Sekunden - je nach Modell) aufwachen lassen, dann einen Zähler hochzählen und damit kannst du bestimmen, wie lange er "nichts" macht und wann er wieder die LEDs schaltet oder sowas.

    Oder du hängst eine Real Time Clock daran (DS3231 ist wohl derzeit das zu empfehlende Modell) und programmierst dort die entsprechenden Alarmzeiten mit denen du den Tiny per Interrupt aus dem Tiefschlaf wecken kannst.

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    .. hast du mindestens diese zwei Möglichkeiten .. Tiny immer in den Sleep Modus schicken und .. aufwachen lassen .. Oder .. eine Real Time Clock ..
    GENAU dieses "Entweder" ist meine Absicht - eine INTERNE Wake up Quelle. Die externe Quelle RTC brauchts dann ja nicht.

    Der Teufel steckt wie immer im Detail, denn ich will ja, siehe oben, dass der Controller OHNE externen Eingriff wieder aus dem sleep Modus kommt. Dumm, denn welcher Sleep Modus des tiny13 kann das? (GENAU DAS versteh ich nicht).

    Zur Verfügung stehen beim tiny13 die Wake-up Sources (siehe Datenblatt) :

    ......Bild hier  

    INT0 oder Pin Change...- nur von EXTERN, ich will aber eine interne Aktion
    EEPROM Ready............- beim EEPROM-lesen schafft der Controller doch ! ?
    ADC . . . . . . . . . . . . .- im Eingangspost erwähnt, ist zu kurz für Ersparungen (und beim Wandeln benötigt der µC Strom!?)
    Other I/O . . . . . . . . ..- sind auch EXTERN, ich benötige eine interne Aktion
    Watchdog . . . . . . . . .- ? ? ? gibt nen Systemstart <=> alles wird zurückgesetzt, auch die Zählschleife . . .

    Daher die Bitte:
    a) Welcher sleep Modus macht mir das OHNE Zurücksetzen des Controllers UND ohne externe Quelle?
    b) Wie bitte sieht dann der geänderte Code aus (siehe funktionierende Sequenz oben).
    Ciao sagt der JoeamBerg

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,
    das müßte schon mit dem Watchdog gehen. Der läßt sich anscheinend nicht nur auf Reset sondern auch auf Watchdog Interrupt konfigurieren und wenn es sein muß sogar auf Beides damit in einer ISR vor Reset gesichert werden kann.

    Der Watchdog Timer läuft wohl mit 128kHz. Die maximale Laufzeit ist 8 Sekunden. Also alle 8 Sekunden raus aus dem sleep, in der ISR nachsehen, ob es schon Zeit ist oder eine Variable inkrementieren und dann wieder in den sleep.

    Das ist die Idee. Mal sehen, ob ich auch die Programmzeilen dazu zusammen bekomme.

    Könnte aber was dauern. zZ kämpfe ich noch mit einem Breadboardset, das so ein Powermodul für Input 6,5 bis 12V und Output 5V und 3,3V hat. Auf dem Ding scheint es gefälschte AMS1117 Spannungswandler verbaut zu haben. Es sollten LDOs sein. Droput Voltage ist beim 5V Wandler aber fast zwei Volt anstatt maximal 1,3V. Und 'ne normale, keine Schottky Verpolschutzdiode. Mein 7V Steckernetzteil, das ich immer verwende reicht da also nicht aus. ... Für 3,50€ incl. Steckbrett und 'ner ganzen Menge Steckkabel ... Was soll man machen?

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.12.2018
    Beiträge
    459
    Im Datenblatt DS40002307A Kapitel 8.4 kannst du nachlesen, dass man zwischen Interrupt Mode und Reset Mode umschalten kann. Dafür ist das WDTIE-Flag zuständig. Damit müsste das lösbar sein. In Kapitel 8.5.2 findest du noch was zu den Registern und Flags.
    Wenn ich das richtig sehe, muss WDE = 0 und WDTIE = 1 sein, damit der Interrupt ausgelöst wird.
    Geändert von Gnom67 (13.01.2022 um 20:54 Uhr)

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von Andre_S
    Registriert seit
    26.06.2005
    Beiträge
    360
    Hallo,

    ist zwar nicht taufrisch, aber im Prinzip wie hier im Tread schon beschrieben:
    https://arduino-projekte.webnode.at/...ecken-mit-wdt/


    Gruß André

Ä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