- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 14

Thema: ATtiny13 - Wie Sleep beenden ohne externes Signal

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #7
    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

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

Labornetzteil AliExpress