Get your own free workspace
View
 

Reaktivlicht Programmcode Beispiel 1 - 10 kurze Antworten

Page history last edited by JP 2 years, 4 months ago

Hier ein Beispielcode für 10 kurze Blinkzeichen.

In der Zeile

Blinken: 'LED blinken lassen

For A = 1 To 10 ' Wie oft Blinken? (hier 10x)

kann die Anzahl der Blinkzeichen geändert werden.

 


 

' ********************************************************
' *** ***
' *** Tiny-Reaktivlicht mit LDR und A/D-Wandler ***
' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***
' *** ***
' ********************************************************
'
' Schaltplan
' Vcc: 2xAA (2x1,5v)
'
' +-----------------+
' LDR ---------- | |
' | -|PB5* Vcc|---|--- +|- -+
' + ---|----|PB3 PB2|- | | |
' | +----|PB4 PB1|- | |
' LED | +-|GND PB0|---+ |
' rt 4M7 | ---------- |
' | | | |
' 47 | | |
' +----+--+------------------------+


$regfile = "ATtiny13.DAT"
$crystal = 16000 'Frequenz des internen Oszillators
$hwstack = 22 '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 (900 für alte LDRs)
Const Zwangsimpuls = 8 'LED-Impuls tagsüber alle X Schlafzyklen (je 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
' Nächste Zeile 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
' Nächste Zeile 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ähler löschen
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 'Wie oft Blinken? (hier 10x)
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

Hier der obige Code als Bascom Datei zum Download: Reaktivlicht_Programmcode_Beispiel-1_10_kurze_Antworten.bas

 

Comments (0)

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