' ********************************************************
' *** ***
' *** 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 (2)
kopito said
at 8:48 am on May 15, 2012
Hallo an alle Forumsteilnehmer.
Ich bin ein Geocacher Spanisch und interessiere mich für die Herstellung von reaktiven Lichter LDR.
Ich habe bereits die ersten von ihnen geplant mit dem Code aus dem Wiki-Link.
Ich habe einen Zweifel: Das Ergebnis ist eine blinkende LED, die etwa 4 Sekunden dauert und es blinkt (10) mit einem kurzen Intervall zwischen ihnen. Fast kontinuierlich.
Was muss ich im Quellcode ändern, um die Zeit zwischen den Blitzen zu erhöhen?
Die Anzahl der Blitze scheinen Recht (10), aber ich möchte die Gesamtlänge von ihnen zu erhöhen.
Ich hoffe, Ihre Hilfe.
Regards,
Rafa
Trushoo bei geocaching.com
upigors said
at 12:37 pm on Nov 19, 2012
change this:
For A = 1 To 10
Portb.3 = 1
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Next A
to this:
For A = 1 To 10
Portb.3 = 1
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Next A
or change the watchdog parameter : Wdtcr = &B11010011 to Wdtcr = &B11010100.......xxxxxxxxx101................xxxxxxxxxxxx110............
You don't have permission to comment on this page.