' ********************************************************
' *** ***
' *** 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.