Hallo Forum.
Ich habe mir gedacht, daß es geschickt wäre wenn man dem RL (LDR)
die Anzahl der Auslösungen entlocken könnte. Auch ist es von Vorteil, die
Auslöseschwelle von Außen ändern zu können, ohne jedesmal neu zu
programmieren. Gerade beim Verstecken eines RL ist es gut zu wissen,
wie es sich so in dieser Umgebung verhält, und auch das Ansprechverhalten
ohne Laptop ändern zu können. Wenn man die Werte hat, kann man ja ein
fertig programmiertes RL in die Bäume setzen.
Habe mir folgendes überlegt: wenn Pin6 auf Masse gelegt wird,
wird erst die Anzahl der Auslösungen, dann die Schwelle ausgeblinkt.
Damit man das vom "normalen" geblinke unterscheiden kann, kommt
als erstes und als letztes, sowie zwischen den Werten jeweils ein langer Blink.
Wenn Pin7 an Masse gelegt wird, so wird die Auslöseschwelle um eins erhöht,
gleichzeitig ein kurzer Blink ausgegeben.
Prinzipiell funktioniert das auch, aber den Pin7 muß man immer 2mal nach
Masse tippen. Wenn man das nur einmal tut, so leuchtet die LED und geht nicht
wider aus. Das Auslesen der Werte funktioniert jedoch problemlos.
Vielleicht kann ja von Euch jemand den Fehler finden, ich habe keinen Plan.
Viele Grüße,
Obelix77
Prog.
' ********************************************************
' *** ***
' *** Tiny-Reaktivlicht mit LDR und A/D-Wandler ***
' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***
' *** ***
' ********************************************************
$regfile = "ATtiny13.DAT"
$crystal = 16000 'Frequenz des internen Oszillators
$hwstack = 4 'hardwarestack herabsetzen damit genÄugend variablen zur verfÄugung stehen
Config Adc = Single , Prescaler = Auto
Config Portb = &B00001001 'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0 'AusgÄange auf Low setzen
Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
Wdtcr = &B11010011 'Watchdog definieren: 0.125 Sekunden, Interrupt auslÄosen, kein Reset
Enable Interrupts 'Interrupts freigeben
'je grÄo¼er der Schwellwert, desto unempfindlicher
Const Tagschwelle = 800 'Schwellwert fÄur Schlafmodus
Dim A As Byte
Dim Schwelle 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
Dim Zaehler As Byte
Dim Frage As Byte
Dim Schwellfrage As Byte
Zaehler = 0
Schwelle = 10
Do
Reset Watchdog
Powerdown 'prozessor bremsen da sonst lichtÄanderung nicht erkannt wird
Config Portb.1 = Input
Portb.1 = 1
Frage = Pinb.1
If Frage = 0 Then
Gosub Auslesen
Else
End If
Reset Watchdog
Powerdown
Config Portb.2 = Input
Portb.2 = 1
Schwellfrage = Pinb.2
If Schwellfrage = 0 Then
Gosub Aendern
Else
End If
Reset Watchdog
Powerdown
Start Adc 'A/D-Wandler starten
Ldr = Getadc(2) 'Helligkeitswert einlesen
Stop Adc 'A/D-Wandler zum Stromsparen wieder stoppen
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 ÄAnderung Dunkel->Hell: Blinken
End If
If Ldr > Tagschwelle Then 'prÄufen ob helligkeit Äuber 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:
Zaehler = Zaehler + 1 'LED blinken lassen
For A = 0 To 10
Portb.3 = 1
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Next A
Alt = 1023 'DoppelauslÄosung verhindern
Return
Auslesen:
Portb.3 = 1
Waitms 900
Portb.3 = 0
Waitms 1500
For A = 1 To Zaehler
Portb.3 = 1
Waitms 300
Portb.3 = 0
Waitms 500
Next A
A = 0
Waitms 900
Portb.3 = 1
Waitms 900
Portb.3 = 0
Waitms 1500
For A = 1 To Schwelle
Portb.3 = 1
Waitms 300
Portb.3 = 0
Waitms 500
Next A
A = 0
Waitms 900
Portb.3 = 1
Waitms 900
Portb.3 = 0
Waitms 1500
Return
Aendern:
Schwelle = Schwelle + 1
Pinb.3 = 1
Waitms 80
Pinb.3 = 0
Waitms 300
Return
Pause:
Wdtcr = &B11110001 'Watchdog auf 8 Sekunden stellen
Reset Watchdog
Powerdown
Wdtcr = &B11010011 'Watchdog wieder auf 0,125 Sekunden zurÄuckstellen
Return
Ich habe mir gedacht, daß es geschickt wäre wenn man dem RL (LDR)
die Anzahl der Auslösungen entlocken könnte. Auch ist es von Vorteil, die
Auslöseschwelle von Außen ändern zu können, ohne jedesmal neu zu
programmieren. Gerade beim Verstecken eines RL ist es gut zu wissen,
wie es sich so in dieser Umgebung verhält, und auch das Ansprechverhalten
ohne Laptop ändern zu können. Wenn man die Werte hat, kann man ja ein
fertig programmiertes RL in die Bäume setzen.
Habe mir folgendes überlegt: wenn Pin6 auf Masse gelegt wird,
wird erst die Anzahl der Auslösungen, dann die Schwelle ausgeblinkt.
Damit man das vom "normalen" geblinke unterscheiden kann, kommt
als erstes und als letztes, sowie zwischen den Werten jeweils ein langer Blink.
Wenn Pin7 an Masse gelegt wird, so wird die Auslöseschwelle um eins erhöht,
gleichzeitig ein kurzer Blink ausgegeben.
Prinzipiell funktioniert das auch, aber den Pin7 muß man immer 2mal nach
Masse tippen. Wenn man das nur einmal tut, so leuchtet die LED und geht nicht
wider aus. Das Auslesen der Werte funktioniert jedoch problemlos.
Vielleicht kann ja von Euch jemand den Fehler finden, ich habe keinen Plan.
Viele Grüße,
Obelix77
Prog.
' ********************************************************
' *** ***
' *** Tiny-Reaktivlicht mit LDR und A/D-Wandler ***
' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***
' *** ***
' ********************************************************
$regfile = "ATtiny13.DAT"
$crystal = 16000 'Frequenz des internen Oszillators
$hwstack = 4 'hardwarestack herabsetzen damit genÄugend variablen zur verfÄugung stehen
Config Adc = Single , Prescaler = Auto
Config Portb = &B00001001 'Pinb.3 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0 'AusgÄange auf Low setzen
Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
Wdtcr = &B11010011 'Watchdog definieren: 0.125 Sekunden, Interrupt auslÄosen, kein Reset
Enable Interrupts 'Interrupts freigeben
'je grÄo¼er der Schwellwert, desto unempfindlicher
Const Tagschwelle = 800 'Schwellwert fÄur Schlafmodus
Dim A As Byte
Dim Schwelle 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
Dim Zaehler As Byte
Dim Frage As Byte
Dim Schwellfrage As Byte
Zaehler = 0
Schwelle = 10
Do
Reset Watchdog
Powerdown 'prozessor bremsen da sonst lichtÄanderung nicht erkannt wird
Config Portb.1 = Input
Portb.1 = 1
Frage = Pinb.1
If Frage = 0 Then
Gosub Auslesen
Else
End If
Reset Watchdog
Powerdown
Config Portb.2 = Input
Portb.2 = 1
Schwellfrage = Pinb.2
If Schwellfrage = 0 Then
Gosub Aendern
Else
End If
Reset Watchdog
Powerdown
Start Adc 'A/D-Wandler starten
Ldr = Getadc(2) 'Helligkeitswert einlesen
Stop Adc 'A/D-Wandler zum Stromsparen wieder stoppen
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 ÄAnderung Dunkel->Hell: Blinken
End If
If Ldr > Tagschwelle Then 'prÄufen ob helligkeit Äuber 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:
Zaehler = Zaehler + 1 'LED blinken lassen
For A = 0 To 10
Portb.3 = 1
Reset Watchdog
Powerdown
Portb.3 = 0
Reset Watchdog
Powerdown
Next A
Alt = 1023 'DoppelauslÄosung verhindern
Return
Auslesen:
Portb.3 = 1
Waitms 900
Portb.3 = 0
Waitms 1500
For A = 1 To Zaehler
Portb.3 = 1
Waitms 300
Portb.3 = 0
Waitms 500
Next A
A = 0
Waitms 900
Portb.3 = 1
Waitms 900
Portb.3 = 0
Waitms 1500
For A = 1 To Schwelle
Portb.3 = 1
Waitms 300
Portb.3 = 0
Waitms 500
Next A
A = 0
Waitms 900
Portb.3 = 1
Waitms 900
Portb.3 = 0
Waitms 1500
Return
Aendern:
Schwelle = Schwelle + 1
Pinb.3 = 1
Waitms 80
Pinb.3 = 0
Waitms 300
Return
Pause:
Wdtcr = &B11110001 'Watchdog auf 8 Sekunden stellen
Reset Watchdog
Powerdown
Wdtcr = &B11010011 'Watchdog wieder auf 0,125 Sekunden zurÄuckstellen
Return