| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • You already know Dokkio is an AI-powered assistant to organize & manage your digital files & messages. Very soon, Dokkio will support Outlook as well as One Drive. Check it out today!

View
 

RL mit Teachin der Blinksequenz-dyn Schwelle - LEDonly Version mit AD-Wandlung - für ATtiny13V

Page history last edited by nhedgehog 13 years, 5 months ago

Dies ist ein Versuch, das Schnasemannsche RL weiter zu verbessern:

 

Folgende Probleme traten bei mir auf:
1) Ich konnte trotz verschiedener Messungen nicht die ideale Taschenlampenschwelle (TaLaSchw) finden, die das Ding empfindlich genug zur Auslösung über weite Entfernungen macht und trotzdem nicht zu einer wilden Flackerei in der Dämmerung führt.
2) die bestehende Tagerkennung machte das Licht aus meiner Sicht "träge".
3) Der Programmierplatz im Attiny war schon randvoll.

Lösungen:
In meiner Lösung hab ich versucht, die Vorteile der LDR-Variante mit der LED-only analog-Variante zu verknüpfen.
1) Nach verschiedenen Versuchen zeigte sich, daß die Lichtwerte der ausgemessenen LEDs (LW) sich am ehesten durch eine quadratische Formel ausdrücken lassen: Wert^2/50 oder sowas in der Art. War aber zu speicherintensiv, daher hab ich die TaLaSchw durch Multiplikation des LW mit 1,6 definiert (das sollte man nach eigenem Gusto anpassen) und noch eine extra Dämmerungsschwelle eingefügt. Abhängig von der verwendeten LED Art kann es im Dunkeln zu wilder Flackerei kommen. Dann ist der Wert in der Addition "Schwelle = Schwelle + 4" anzupassen.
2) Falls in 254 aufeinanderfolgenden Meßzyklen der Tag kontinuierlich erkannt wurde, prüft das RL nur noch alle 8 Sekunden ob es Nacht ist. - Code stammt aus der LDR Variante.
3) Das war das größte Problem. Wurde hauptsächlich durch andere Variablendefinitionen erreicht. Nun ist er aber wieder voll.

 

 

Pinbelegung (wie bisher,also):

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.

 

 

Code:

' Version 1.12 03.11.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
' 03.11.10 (nhedgehog) Speicheroptimierung (z.B.Variablen umdefiniert um Speicher zu sparen), Tagerkennung umgebastelt, dynamische TaLaschwelle
' 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 Byte
Dim Wert2 As Byte
Dim Schwelle As Byte
Dim Anzahl As Byte
Dim Runde As Byte
Dim Merker As Byte
Dim Eepromz As Byte
Dim Zaehler As Byte
Dim Tagzaehler As Byte
Dim Teachin As Bit
Dim Entprell As Byte
Dim Result As Byte
Const Dunkelwert = 18 ' Wert, ab dem Nacht erkannt wird (18)
Runde = 0
Portb.1 = 0 'Masse für portb.0

Do
If Tagzaehler >= 254 Then
'( Config Portb.4 = Output 'im Tagmodus alle 8 sek flashen zum Test und Schlafen
Portb.4 = 1
Gosub Warte16ms
Portb.4 = 0
')
Gosub Warte8s 'Energiesparen wenn es hell ist nur alle 8 Sek. die LED checken
Else
Gosub Warte250ms 'im Dunkeln öfter
End If

Gosub Einlesen
Schwelle = 1.6 * Wert1 'Berechnungsformel für Taschenlampenschwelle, je dunkler, je empfindlicher
Schwelle = Schwelle + 4 ' für die kleinen LED's sonst zu empfindlich, die großen ohne

If Wert1 >= 15 Then 'Geflacker bei Dämmerung vermeiden
Schwelle = Schwelle + 8
End If

If Wert1 =< Dunkelwert Then
Tagzaehler = 0 'Tagzähler auf 0 setzen bei ausreichend Helligkeit
If Wert2 >= Schwelle Then
Gosub Blinken
End If
Else
If Tagzaehler =< 254 Then 'verzögerte Tagerkennung, damit die Tala nicht mit der Sonne verwechselt wird
Tagzaehler = Tagzaehler + 1
End If
End If


If Wert1 >= 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
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 5 'Anzahl des vorprogrammierten Blinkens (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
Gosub Warte8s
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_dynamisch.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_dynamisch.hex
reaktivlicht_wdt_teachin_autoend_dynamisch.eep

 

Fuses müssen wie folgt eingestellt sein:

 

Weiteres zu den Fuses auch unter Atmel Mikrocontroller

Comments (0)

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