LED Anode an Pin3, LED Kathode an Pin 4 (GND). Batterie + an Pin 8, Batterie - an Pin 4.
Brückmöglichkeit (zum Einlernen) zwischen Pin 5 und 6 (gute Kontaktiermöglichkeit kann man bei einer einfachen Feder-IC-Fassung durch Hochbiegen der Fassungsbeinchen erreichen - mit Schraubenzieher einfach brückbar).
Ganz unten ist die hier angezeigte Datei noch einmal zum Download und Einstellungen der Fuses.
Um den unten angezeigten Quellcode in den attiny13v rein zu bekommen, muss Optimize als Option beim Compiler eingeschaltet sein. Ansonsten wird Bascom beim kompilieren '101% flash used' und Fehler wie '...Program will overwrite bootloader ...' und '... Code does not fit into target chip...' anzeigen. Das Programm unten kompiliert (mit optimierung) auf '99% flash used', es ist also nicht viel Speicher über. Einschalten läßt sich die Optimierung unter 'Options -> Compiler -> Output -> [x] Optimize code -> Ok'.
Außerdem muß das generierte '.eep'-File ins EEPROM des Tiny geschrieben werden.
' Version 1.11 28.02.2010
' (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
' changelog
' 31.10.09 Rundenblinker in die Dunkelphasenerkennung verschoben
' 03.11.09 Rundenzähler aus, Hub auf 14 gesetzt
' 07.11.09 Version 1.10. automatisches Erkennen des Programmierendes
' 28.02.10 Version 1.11, Bugfix Ausgabezähler Schieben
$regfile = "ATtiny13.DAT"
$crystal = 128000 'Reale Frequenz des internen 128kHz-Oszillators
$hwstack = 10 'default use 32 for the hardware stack
$swstack = 20 '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 &B00000000
Data &B01010101
$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 = 14 ' 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
Runde = 0
For Eepromz = 1 To 62
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
Runde = Eepromz ' Merken, wann als Letztes eine "1" getastet wurde
End If
Next Zaehler
Writeeeprom Merker , Eepromz
Next Eepromz
If Runde < 62 Then
Incr Runde
Merker = &B01010101 ' Zum Schluss magic byte an das Ende schreiben
Writeeeprom Merker , Runde
End If
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
'(
If Runde >= 4 Then ' alle gute 1/2 Minute einmal blitzen am Tag
Config Portb.4 = Output
Portb.4 = 1
Gosub Warte16ms
Portb.4 = 0
Runde = 0
End If
')
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 62
Readeeprom Merker , Eepromz 'Byte lesen aus Eeprom
If Merker = &B01010101 Then
If Eepromz = 1 Then
Gosub Blitz
End If
Exit For
End If
For Zaehler = 1 To 8 ' 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
Und weil manche Probleme damit haben, das mit Drag & Drop zu kompilieren, hier das ganze noch einmal als Datei: reaktivlicht_wdt_teachin_autoend.bas
Und hier das Gleiche als Hex-File und EEPROM-File zum direkten Flashen. An Fuses muss interner 128kHz Oszillator, kein WDT eingestellt sein: reaktivlicht_wdt_teachin_autoend.hex reaktivlicht_wdt_teachin_autoend.eep
Fuese müssen wie folgt eingestellt sein:
Weiteres zu den Fuses auch unter Atmel Mikrocontroller
Comments (1)
schnasemann said
at 11:10 am on Feb 28, 2010
Heute den Code nochmal von einem kleinen Bug befreit (Ausgabezähler war nur auf 7 statt auf 8)
You don't have permission to comment on this page.