- SF800 Solar Speicher Tutorial         
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.694
    .. 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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    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

  3. #3
    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 19:54 Uhr)

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

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


    Gruß André

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo,

    ich habe ein Bascom Demo Programm gemacht. Leider bin ich in C nicht so fit, daß ich das schnell hinbekomme. Habe aber versucht, möglichst gut zu kommentieren. Programm ist auf Tiny44 getestet. Auf Tiny13 heißen, so meine ich, nur zwei relevante Bits anders. Ist im Programm kommentiert.

    Gruß
    Searcher

    Code:
    '###################################################
    '
    'ATtiny44
    '
    'WATCHDOG DEMO
    '
    'IMPORTANT prerequisite:
    'WDTON fuse is default (unprogrammed = 1, watchdog timer interrupt function is enabled)
    '
    'three LEDs are used to visually monitor the success of sleep mode pauses
    '  1. after start of program (or a reset) all three leds lit for one second
    '  2. 8 seconds wdt pause
    '  3. wdt led flash, life led flash
    '  4. 8 seconds pause
    '  5. wdt led flash, life led flash
    '  6. 8 seconds pause
    '  7. wdt led flash, life led flash
    '  8. directly after 7. action led flash
    '  9  5 seconds pause in action sub, another action led flash
    ' 10. continue step 2. with 8 sconds pause
    '
    '  control overall sleep duration by value in watchdog_ovf
    '
    '#######################################################
    $regfile = "attiny44.dat"
    $framesize = 24
    $swstack = 24
    $hwstack = 38
    $crystal = 8000000                                          'internal oscillator
    
    Config Portb.0 = Output                                     'WDT LED, switched in watchdog isr (200ms flash)
    Config Porta.3 = Output                                     'Action LED indicates action after watchdog controlled sleep
    Config Porta.7 = Output                                     'Life LED, monitor wether sleep mode ist entered
    
    Rem : all LEDs for 1 second ON (check for program begin and/or µC reset)
    portb.0 = 1
    porta.3 = 1
    porta.7 = 1
    wait 1
    portb.0 = 0
    porta.3 = 0
    porta.7 = 0
    Rem : check end for program begin and/or µC reset
    
    dim watchdog_action_flag as byte                            'set in watchdog interrupt, indicates end of sleep pause
    dim watchdog_ovf as word                                    'counts watchdog timer overflows before action
    
    set mcucr.sm1                                               'prepare sleepmode as power down, SM1 Bit in MCUcR
    on wdt isr_watchdog                                         'watchdog interrupt vector to watchdog isr
    
    wdtcsr = bits(wdp0 , wdp3)                                  'set wdp0,wdp3 bits, watchdog prescaler to 8 seconds
    
    Rem : ### !wdr                                                        'asm instruction "wdr" resets the watchdog timer
    
    set WDTCSR.wdie                                             'watchdog interrupt enable
    Rem attiny13 : set WDTCSR.wdtie                                             'watchdog interrupt enable
    enable interrupts                                           'global interrupt enable (sei)
    
    
    Rem : ###############################################################################
    Rem : ### main loop
    Do
      set mcucr.se                                              'enable following sleep command, SE Bit in MCUCR
      !sleep                                                    'asm sleep command. enters sleepmode which is prepared in MCUCR by SM bits
      reset mcucr.se                                            'disable sleep commands: recomended in datasheet
    
      porta.7 = 1                                               'Life LED ON
      waitms 200                                                '200ms flash, monitor sleep state
      porta.7 = 0                                               'Life LED OFF
    Rem : ### if sleepmode ist not entered , Life LED OFF is not noticable (to fast, LED appears continiously on exept during action)
    
      if watchdog_action_flag = 1 then
        gosub sub_watchdog_action
        watchdog_action_flag = 0
      end if
    Loop
    Rem : main loop end
    Rem : ###############################################################################
    
    
    
    Rem : ###############################################################################
    Rem : ### in subroutine do whatever to be done after watchdog controlled long sleep break
    sub_watchdog_action:
      porta.3 = 1                                               'Action LED ON
      waitms 200                                                '200ms flash
      porta.3 = 0                                               'Action LED OFF
      wait 5                                                    '5 seconds do nothing, just wait
      porta.3 = 1                                               'Action LED ON
      waitms 200                                                '200ms flash
      porta.3 = 0                                               'Action LED OFF
    
    Rem : ### !wdr                                                        'asm instruction "wdr" resets the watchdog timer
      set WDTCSR.wdif                                           'clear eventually set interrupt flag before enabling wdt interrupt
      set WDTCSR.wdie                                           'watchdog interrupt enable
    Rem attiny13 :  set WDTCSR.WDTIF                                           'clear eventually set interrupt flag before enabling wdt interrupt
    Rem attiny13 :  set WDTCSR.WDTIE                                           'watchdog interrupt enable
    return
    Rem : ###############################################################################
    
    
    isr_watchdog:                                               'controls invoking of "sub_watchdog_action"
      portb.0 = 1
      waitms 200                                                '200ms flash - monitor watchdog interrupt
      portb.0 = 0
      watchdog_ovf = watchdog_ovf + 1                           'count wdt timer overflows/interrupts
      if watchdog_ovf >= 3 then
        reset WDTCSR.wdie                                       'watchdog interrupt disable
    Rem attiny13 : reset WDTCSR.wdtie                                       'watchdog interrupt disable
        watchdog_action_flag = 1                                'flag will be processed in main loop
        watchdog_ovf = 0
      end if
    return
    
    end                                                         'end program
    Geändert von Searcher (14.01.2022 um 10:03 Uhr) Grund: Kommentare im PRG berichtigt
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Danke Euch für die konstruktiven Hinweise.
    m Datenblatt DS40002307A Kapitel 8.4 kannst du nachlesen . . .
    Danke Gnom67 - jaaa, das ist DER Hinweis! .. steht auf den an die zwanzig Seiten Datenblatt die ich (noch) nie gelesen, nicht mal überflogen hatte. Sprich: bins selber schuld. Ich geh die nächsten Tage dran (jetzt erstmal an die Kletterwand - in der Halle - weils draussen deutlich unter Null ist *brrrr* aber der Himmel ist uni bayerisch-blau)

    @André : ach jee, und die Arduinohilfen gehören auch nicht zu meiner üblichen Literatur. Schade wie ich sehe!

    @Searcher : danke für Deine Mühe. PS: haste im Postfach nachgesehen?

    Danke nochmal für Eure Hilfen. Ich werde berichten.
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Es geht weiter? Ja, blos funktionieren tuts nicht :-/ Da muss ich mal (noch) gründlich (..er) drüberschauen.

    Code:
    // ============================================================================= =
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //  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-13-13V_13neu_13-13Vneu_13-13Vneu.pdf
    // ============================================================================= =
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      void SLP0init (void)          // Ruhemodus vorbereiten / initialisieren
      {                             //
    // __watchdog_reset();
    //  Siehe https://arduino-projekte.webnode.at
    //              /meine-projekte/attiny-im-schlafmodus/wecken-mit-wdt/
    //      Setzen des Registers fuer Watchdog Time-out Interrupt
        cli();
        wdt_reset();                // Reset Watchdog Timer
        MCUSR  &=  ~(1 << WDRF);    //Ruecksetzen des Watchdog System Reset Flag
        MCUCR  |=   (1 << SM1);     // SM1: Power Down                              46
    /* Set new prescaler(time-out) */
        WDTCR  |=   (1<<WDE) | (1<<WDCE) | (1<<WDP3);
    //  WDTCR  |=   (1 << WDTIE);   // Watchdog Timer Interrupt Enable              41
        WDTCR  |=   (1 << WDTE);   // Watchdog Timer Interrupt Enable setzen        41
      //  sei();
    
        return;                          
      }                     // Ende void SLEEP1 (void)   -- Ruhemodus ein, wake up dur
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // ============================================================================= =
    
    
    
    // ============================================================================= =
    //  Dok D:\D_pro-fi...blätter\atmel-controller_Datenblätter_App-Notes
    //      \ATtiny13_doc2535J_08-10-akt-neueste-13-13V_13neu_13-13Vneu_13-13Vneu.pdf
    //  Dann - neu: D:\D_pro-fi...blätter\atmel-controller_Datenblätter_App-Notes
    //      \ATtiny13A-Data-Sheet-DS40002307A-2021_neu-Microchip
    // ============================================================================= =
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      void SLEEP0 (void)            // Ruhemodus SLEEP0 starten
      {                             //
        MCUCR |= (1<<SM1)|(1<<SE);  // SM1: Power Down, SE: Sleep enable            46
        sei();                      //
        asm volatile ("sleep");     // Inline-Assembler
        MCUCR   &= ~(1<<SM1)|(1<<SE);       // => alten Zustand / zurücksetzen
        
        WDTCR &=   ~(1<<WDE);       // Watchdog Timer Interrupt   D I S able        41
        WDTCR |=    (1<<WDTIE);     // Watchdog Timer Interrupt Enable              41
    
    // - - - - - - - - - - - - - - - -
        return;                          
      }                     // Ende void SLEEP1 (void)   -- Ruhemodus ein, wake up dur
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // ============================================================================= =
    Wird im main aufgerufen :
    Code:
    ..
      SetBit (PORTB, kLED); wms (    5 );   // Port für/mit PB0/rLED
      SLP0init ( );         // Ruhemodus SLEEP0 vorbereiten / initialisieren
      ClrBit (PORTB, kLED); wms (    5 );   // Port für/mit PB0/rLED
    
      while ( 1 )           // Hier folgt das eigentliche Hauptprogramm
      {                     //
        SetBit (PORTB, kLED); wms (   10 );
                            //
        SLEEP0 ( );         // Ruhemodus SLEEP0
                            //
        ClrBit (PORTB, kLED); wms (   10 );       // LED aus
                            //
    //  SLEEP0 ( );         // Ruhemodus SLEEP0
                            //
      }             // Ende while ( 1 )
    ..
    *grübel*
    Ciao sagt der JoeamBerg

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Hallo,

    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.

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

Ähnliche Themen

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

Berechtigungen

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

Solar Speicher und Akkus Tests