Get your own free workspace
View
 

Reaktivlicht Programmcode LDR

Page history last edited by stonewood 2 years, 3 months ago

 

' ********************************************************

' *** ***

' *** Tiny-Reaktivlicht mit LDR und A/D-Wandler ***

' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***

' *** ***

' ********************************************************

 

$regfile = "ATtiny13.DAT"

$crystal = 116000 'Frequenz des internen Oszillators

$hwstack = 2 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen

 

Config Adc = Single , Prescaler = Auto

' 2 alternativen: LDR fest auf Vcc, oder auf PB0

'Config Portb = &B00001000                                   'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten

Config Portb = &B00001001                                   'Pinb.3 auf 'Ausgang' (LED), Pinb.0 auf 'Ausgang' (LDR-Versorgung), Rest auf 'Eingang' schalten

Portb = 0 'Ausgänge auf Low setzen

Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen

Wdtcr = &B11010011 'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset

Enable Interrupts 'Interrupts freigeben

 

Const Schwelle = 50 'je größer der Schwellwert, desto unempfindlicher

Const Tagschwelle = 800 'Schwellwert für Schlafmodus

Const Zwangsimpuls = 8 'LED-Impuls tagsÄuber alle X Schlafzyklen (a ca. 8 Sekunden)

Dim A As Byte 'Variablen definieren

Dim Tagzaehler As Byte

Dim Schlafzaehler As Byte

Dim Ldr As Integer '0 = Dunkel, 1023 = Hell

Dim Alt As Integer

Dim Merker As Integer

 

Do

  Reset Watchdog

  Powerdown 'prozessor bremsen da sonst lichtänderung nicht erkannt wird

' Auskommentieren wenn LDR fest auf Vcc

  Portb.0 = 1                                               'LDR-Stromversorgung ein 

  Start Adc 'A/D-Wandler starten

  Ldr = Getadc(2) 'Helligkeitswert einlesen

  Stop Adc 'A/D-Wandler zum Stromsparen wieder stoppen

' Auskommentieren wenn LDR fest auf Vcc

  Portb.0 = 0                                               'LDR-Stromversorgung aus              

  Merker = Ldr - Alt 'Unterschied zwischen letzter und aktueller Messung ermitteln

  Alt = Ldr 'letzten LDR-Wert sichern

  If Merker > Schwelle Then

    Gosub Blinken 'Bei großer Änderung Dunkel->Hell: Blinken

  End If

  If Ldr > Tagschwelle Then 'prüfen ob helligkeit über tagschwelle liegt

    If Tagzaehler < 255 Then 'int-variable geht nur bis 255

      Tagzaehler = Tagzaehler + 1

    End If

  Else

    Tagzaehler = 0 'wenn wieder dunkel tagzÄahler lÄoschen

  End If

  If Tagzaehler > 200 Then

    Gosub Pause 'wenn mehr als x zyklen hell dann schlafmodus

  End If

Loop

 

Blinken: 'LED blinken lassen

  For A = 1 To 10

    Portb.3 = 1

    Reset Watchdog

    Powerdown

    Portb.3 = 0

    Reset Watchdog

    Powerdown

  Next A

  Alt = 1023 'Doppelauslösung verhindern

Return

 

Pause:

  Wdtcr = &B11110001 'Watchdog auf 8 Sekunden stellen

  Reset Watchdog

  Powerdown

  Wdtcr = &B11010011 'Watchdog wieder auf 0,125 Sekunden zurückstellen

  Schlafzaehler = Schlafzaehler + 1 'merken wie oft Schlafmodus durchlaufen wurde

  If Schlafzaehler = Zwangsimpuls Then 'als Funktionskontrolle tagsüber LED auslösen

' wenn kein Zwangsimpuls gewünscht einfach die folgenden 4 Zeilen auskommentieren

    Portb.3 = 1

    Reset Watchdog

    Powerdown

    Portb.3 = 0

' ende Zwangsimpuls schalten

    Schlafzaehler = 0

  End If

Return

 

End

Comments (0)

You don't have permission to comment on this page.