von Hubert Freisinger, OE3FHA
'
'############################################################################
'# Dämmerungsschalter mit Einknopfbedienung, Serviceroutine für #
'# Lampenwartung und Sperrzeit mit Schaltuhreingang #
'############################################################################
'
'Funktionsablauf nach dem Start: Schaltausgang wird entsprechend dem
' gespeicherten Schwellwert in Verbindung mit
' einem Algorithmus der Mengenlehre und einer
' optional angeschlossenen Schaltuhr überwacht.
'
'Funktionen:
'
'1.) Taste T 1x drücken: LED gelb an, wenn keine weitere Aktion
' nach ca. 2 Sek. wieder Normalbetrieb (LED grün an)
'
'2.) Taste T innerhalb von 2 Sek. 2x drücken: momentaner Helligkeitswert
' wird als Schaltpunkt im EEPROM
' gespeichert (LED grün wieder an)
'
'3.) Serviceroutine1: Leuchtenreparatur kann erfolgen,
' Taste T 1x länger 3 Sek. drücken,
' Relais permanent aus, LED rot aus,
' LED grün/gelb blinkt langsam
'
'4.) Serviceroutine2: Kontrolle der Beleuchtung auf Funktion,
' Taste T 1x drücken,
' Relais permanent an, Led rot an,
' LED grün/gelb blinkt schnell
'
'5.) Taste T 1x drücken, zurück zum Normalbetrieb
'
'
' Schaltausgang/LED rot PB0, Pin5
' Taste für Eingabe PB1, Pin6
' 24 Stunden Timerport PB2, Pin7
' LDR/Phototransistor PB3, Pin2
' Eingabeanzeige LED grün/gelb PB4, Pin3
'
'
' FUSES im Auslieferzustand
'
'############################################################################
'Anweisungen für den Kompiler
$regfile = "attiny13A.dat" 'Prozessortyp
$crystal = 1200000 'Takt 1,2MHz
$hwstack = 8 'Speicherreservierung
$swstack = 15
$framesize = 10
'Definition der Variablen
Dim Dw As Word 'Dunkelwert
Dim Ew As Byte 'Ereigniswert
Dim Hw As Word 'Hellwert
Dim Z As Word 'Schleifenzähler
Dim Uinput As Word 'ADC Wert
Dim Ueeprom As Word 'Gespeicherter Wert
'Konfiguration der Register
Config Adc = Single , Prescaler = Auto 'Configuration des ADC
Uinput = Getadc(3)
Stop Ac 'Switch off the power to the Analog Comparator
Reset Acsr. Acbg 'Disable Analog Comparator Bandgap Select
Ddrb = &B0001_0001 'konf Port's B auf > 0=Eingabe 1=Ausgabe 'Output B.0
Portb = &B0000_0000 'konf Port's B auf 0 oder 1
Pinb = &B0000_1010 'konf Pin's B auf 1 oder 0 (PullUp Widerstände)
$eeprom 'initialisiere EEPROM
Ldr: 'Definition Speicher im EEPROM, ADC-Daten
Data 1 , 2
$data 'zurück zur Datendefinition
'Warten bis LDR-Spannung stabil (Parallel-C 0,1µ geladen) und Schaltuhr bereit
Wait 1
'Begin des Programmablauf ###################################################
Vergleich:
Readeeprom Ueeprom , Ldr 'Schwellwert aus EEPROM lesen
Uinput = Getadc(3) 'Pin 2 LDR Wert abfragen
If Ueeprom < Uinput And Pinb.2 = 1 Then Portb.0 = 1 'nach Stromausfall neu vergleichen, ist Timer ON/OFF?
'Messroutine, feststellen der Helligkeit am LDR
Messen:
Portb.4 = 1 'LED grün ON/gelb OFF
Dw = 0 'Dunkelwert
Hw = 0 'Hellwert
For Z = 1 To 30000 'Zeitschleife ca. 90sek
Uinput = Getadc(3) 'Pin 2 LDR Input
Debounce Pinb.1 , 0 , Prefatch 'Pin 6 Taste T schließer gegen GND
If Uinput > Ueeprom Then Dw = Dw + 1 'gemessene Dunkelwerte
If Uinput < Ueeprom Then Hw = Hw + 1 'gemessene Hellwerte
Waitms 3
Next Z
'Messung bewerten
If Dw = 0 Or Hw = 0 Then Goto Entscheidung 'Messwert eindeutig, weiter
If Dw > 0 And Hw > 0 Then Ew = Ew + 1 'Messwert nicht eindeutig, zurück zum Messen
If Ew => 3 Then Goto Entscheidung '3x nicht eindeutig trotzdem weiter
Goto Messen
'Auswertung des Mittelwert in Verbindung mit dem Timerport (Schaltuhr)
Entscheidung:
Ew = 0 'Nicht-Eindeutigkeitszähler auf 0
If Dw < Hw Then Portb.0 = 0 'Pin 5 Schaltausgang=0
'Ist Timereingang 0 oder 1
If Pinb.2 = 0 Then Portb.0 = 0 'Sperre durch Schaltuhr
If Dw > Hw And Pinb.2 = 1 Then Portb.0 = 1 'Freigabe durch Schaltuhr oder Jumper
Goto Messen
'Unterroutinen ###############################################################
'Momentanen ADC-Wert als Trigger speichern oder Serviceroutine schalten
'----------------------------------------------------------------------
'Taste innerhalb 2 Sek. nochmals drücken = Schaltschwelle speichern
'Taste T länger als 3 Sek. gedrückt halten ist Serviceroutine1
Prefatch:
Portb.4 = 0 'LED grün OFF/gelb ON
For Z = 1 To 60000 'Zeitschleife ca. 2sek
Debounce Pinb.1 , 0 , Eichen 'Schaltschwelle speichern
Next Z
If Pinb.1 = 0 Then Goto Service1
Goto Messen
'Servicestufe 1, Schaltausgang PortB.0 auf 0 setzen und warten auf Tastendruck
Service1:
Portb.0 = 0
Do
Toggle Portb.4 'LED grün/gelb langsames Blinken
Debounce Pinb.1 , 0 , Service2
Waitms 300
Loop
'Servicestufe 2, Schaltausgang PortB.0 auf 1 setzen und warten auf Tastendruck
Service2:
Portb.0 = 1
Do
Toggle Portb.4 'LED grün/gelb schnelles Blinken
Debounce Pinb.1 , 0 , Service2a
Waitms 100
Loop
'Schaltausgang PortB.0 auf 0 setzen und zurück zur Messroutine
Service2a:
Portb.0 = 0
Goto Vergleich
'Routine zum Einspeichern der Schaltschwelle
Eichen:
Writeeeprom Uinput , Ldr 'Wert in EEPROM speichern
Goto Vergleich