schnasemann
Geocacher
So, die Damen und Herren, hier die fertige funktionierende Version mit Teachin.
Gelernt wird folgendermaßen:
Am Tag Pin 5 und 6 brücken, bis Standardblinksequenz (10x Blinken) ausgegeben wird.
Während dem Blinken die Brücke entfernen.
Nach Ende des Blinkens mit Brücke Blinksequenz einlernen. Wenn man fertig ist, oder 32s erreicht wurden, wird Standardblinksequenz ausgegeben, danach das Eingelernte.
Will man wieder die Standard-Blinksequenz ausgeben, einfach - wie oben - am Tag brücken, bis Blinksequenz ausgegeben wird. Danach immer noch brücken. Nun wird 2x Standardblinksequenz ausgegeben und nach 8s die nun ausgewählte Sequenz (eben das Standardblinken) erneut angezeigt.
Ich hätte gerne noch eine Möglichkeit reingebaut, dass man das Ausgeben der eingelernten Sequenz stoppen kann, wenn man fertig ist. Leider komme ich bei meiner versuchten Lösung aber beim compilieren immer auf 104% und wüsste nicht, wo ich einsparen soll (evtl. in der Entprellroutine). Gedacht war das so, dass man bei der Ausgabe der eingelernten Sequenz nochmal brückt. Dabei wird dann im Eeprom wieder das magic Byte (siehe Quelltext) geschrieben und das wird später als Abbruchkriterium der EEpromzählschleife verwendet. Aber, wie geschrieben, brauche ich dafür zu viel Code.
So, und hier die geistigen Ergüsse, vielleicht kanns ja jemand brauchen:
Grüße,
schnasemann
Gelernt wird folgendermaßen:
Am Tag Pin 5 und 6 brücken, bis Standardblinksequenz (10x Blinken) ausgegeben wird.
Während dem Blinken die Brücke entfernen.
Nach Ende des Blinkens mit Brücke Blinksequenz einlernen. Wenn man fertig ist, oder 32s erreicht wurden, wird Standardblinksequenz ausgegeben, danach das Eingelernte.
Will man wieder die Standard-Blinksequenz ausgeben, einfach - wie oben - am Tag brücken, bis Blinksequenz ausgegeben wird. Danach immer noch brücken. Nun wird 2x Standardblinksequenz ausgegeben und nach 8s die nun ausgewählte Sequenz (eben das Standardblinken) erneut angezeigt.
Ich hätte gerne noch eine Möglichkeit reingebaut, dass man das Ausgeben der eingelernten Sequenz stoppen kann, wenn man fertig ist. Leider komme ich bei meiner versuchten Lösung aber beim compilieren immer auf 104% und wüsste nicht, wo ich einsparen soll (evtl. in der Entprellroutine). Gedacht war das so, dass man bei der Ausgabe der eingelernten Sequenz nochmal brückt. Dabei wird dann im Eeprom wieder das magic Byte (siehe Quelltext) geschrieben und das wird später als Abbruchkriterium der EEpromzählschleife verwendet. Aber, wie geschrieben, brauche ich dafür zu viel Code.
So, und hier die geistigen Ergüsse, vielleicht kanns ja jemand brauchen:
Code:
' Version 1.00 30.10.2009
' (c) geoclub & schnasemann
' Teachin Möglichkeit bei Tag und Brücken der Pins 5 und 6.
' Während Blinken Brücke entfernen, nach Blinkende mit Brücken von Pin 5 & 6 Muster einlernen
' Löschen und Umschalten auf Standardblinken durch Brücken der Pins über das Blinkende hinaus
$regfile = "ATtiny13.DAT"
$crystal = 128000 'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 10 'default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 20 'default use 40 for the frame
$eeprom 'the following DATA lines data will go to the EEP file
Data &H55 , &H55
$data
Stop Ac
Config Portb = &B11101110 'Portb.4 und Portb.0 auf 'Eingang' schalten
Portb = &B00000001 'keine Pullups zuschalten, nur PB0
Wdtcr = &B11010100 'Watchdog auf 250ms einstellen
Enable Interrupts
Config Adc = Single , Prescaler = Auto , Reference = Internal 'Referenzspannung des Adc Auf "Internal" = 1,1 V
Dim Wert1 As Word
Dim Wert2 As Word
Dim Schwelle As Word
Dim Anzahl As Byte
Dim Runde As Byte
Dim Merker As Byte
Dim Eepromz As Byte
Dim Zaehler As Byte
Dim Teachin As Bit
Dim Entprell As Byte
Dim Result As Byte
Const Dunkelwert = 18 ' Wert, ab dem Nacht erkannt wird
Const Hub = 10 ' Hub, der eine Taschenlampe erkennt
Runde = 0
Portb.1 = 0 'Masse für portb.0
Do
Gosub Warte250ms
Gosub Einlesen
Schwelle = Wert1 + Hub 'Schwelle heller als Signal festlegen, je kleiner desto empfindlicher
If Wert1 < Dunkelwert And Wert2 >= Schwelle Then 'Dunkelschwelle festlegen, je kleiner desto dunkler
Gosub Blinken
End If
If Wert1 >= Dunkelwert And Wert2 >= Dunkelwert Then 'bei Tag oder Dauerlicht
Teachin = Pinb.0
If Teachin = 0 Then ' Teachin beginnt
Gosub Blitz
Teachin = Pinb.0 ' nicht mehr gedrückt, dann einlernen
If Teachin = 1 Then
Config Portb.4 = Output
Portb.4 = 0
For Eepromz = 1 To 63
Merker = 0
For Zaehler = 1 To 8 'bitzähler
Result = 0
Rotate Merker , Left
For Entprell = 1 To 5
If Entprell > 1 Then
Gosub Warte16ms
End If
Teachin = Pinb.0
If Teachin = 0 Then
Result = Result + 1
Portb.4 = 1
Else
Portb.4 = 0
End If
Next Entprell
If Result > 2 Then
Merker = Merker + 1
End If
Next Zaehler
Writeeeprom Merker , Eepromz
Next Eepromz
Gosub Blitz
Else ' Teachin immer noch gedrückt
Merker = &B01010101 ' Magic byte schreiben, damit Programmierung löschen
Writeeeprom Merker , 1
Gosub Warte250ms
Gosub Warte250ms
Gosub Warte250ms
Gosub Warte250ms
Gosub Blitz
Gosub Blitz
Gosub Warte8s
End If
Gosub Blinken
Else
Runde = Runde + 1
Gosub Warte8s
End If
End If
If Runde >= 8 Then ' alle gute Minute einmal blitzen am Tag
'( Config Portb.4 = Output
Portb.4 = 1
Gosub Warte16ms
Portb.4 = 0 ')
')
Runde = 0
End If
Wert1 = Wert2 'Wert2 nach Wert1 verschieben
Loop
Blitz: 'LED getaktet blinken lassen
Config Portb.4 = Output
Portb.4 = 0
For Anzahl = 1 To 10
Portb.4 = 1
Gosub Warte16ms
Portb.4 = 0
Gosub Warte250ms
Next Anzahl
Return
Einlesen:
Start Adc
Config Portb.4 = Output 'LED "entladen"
Portb.4 = 0
Gosub Warte16ms
Config Portb.4 = Input
Portb.4 = 0
cbi adcsra,7 'ADEN = 0
Gosub Warte16ms
sbi adcsra,7 'ADEN = 1
Wert2 = Getadc(2) 'Spannung der LED messen
Stop Adc
Return
Blinken:
Config Portb.4 = Output
Portb.4 = 0
For Eepromz = 1 To 63
Readeeprom Merker , Eepromz 'Byte lesen aus Eeprom
If Merker = &B01010101 Then
Gosub Blitz
Exit For
End If
For Zaehler = 1 To 7 ' ansonsten bitweise schieben
If Merker > 127 Then ' und blinken
Portb.4 = 1
Gosub Warte64ms
Portb.4 = 0
Else
Gosub Warte64ms ' oder Pause
nop
nop
nop
nop
End If
Rotate Merker , Left
Next Zaehler
Next Eepromz
Return
Warte8s:
Wdtcr = &B11110001 'Watchdog auf 8s einstellen
Reset Watchdog
Powerdown
Return
Warte16ms:
Wdtcr = &B11010000 'Watchdog auf 16ms einstellen
Reset Watchdog
Powerdown
Return
Warte64ms:
Wdtcr = &B11010010 'Watchdog auf 64ms einstellen
Reset Watchdog
Powerdown
Return
Warte250ms:
Wdtcr = &B11010100 'Watchdog auf 250ms einstellen
Reset Watchdog
Powerdown
Return
End
Grüße,
schnasemann