• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Reaktives Licht mit Atmel AVR

OP
S

Sir Vivor

Geocacher
Hallo Windi,

Dein 'Filter' ist klasse! Habe ihn noch etwas angepaßt und werde gleich mal das Programm hier für alle einstellen.

Zum Resetproblem:
Tritt das nur auf, wenn der Programmieradapter angeschlossen ist? Oder auch wenn die Schaltung autark arbeitet? Der Tiny hat übrigens einen internen Reset-Pullup. Was benutzt Du als Spannungsversorgung?

Es grüßt...

...Sir Vivor
 

El Achimo

Geocacher
Hi,
schau dir doch mal die Grundschaltung von Microcontroller.Net an:
http://www.mikrocontroller.net/tutorial/equipment
An dem Reset Pin liegt ein 10K Widerstand gegen + und ein 47 pF Kondensator gegen GND. Die Ladezeit des Kondensators beträgt damit 5*R*C=2,35 µs, was einen sicheren Reset gewärleisten sollte.
Viele Grüße,
El Achimo
 

Starglider

Geoguru
Windi schrieb:
Ich habe die LED sehr emfindlich eingestellt mit einer Auswertezeit von 100 ms.
Sobald ich etwas über 1,5 ms raus gehe habe ich einen Dauerblinker,
und bei <1,5ms löst die Schaltung mit der ALDI-LED-Lampe erst bei weniger als 1,5 m aus.
Offenbar habe ich die falschen LEDs.
Was für LEDs benutzt ihr?
 
OP
S

Sir Vivor

Geocacher
Hi,
Starglider schrieb:
Was für LEDs benutzt ihr?
ich benutze diese LED, welche LED benutzt Du?

Das Programm habe ich auf folgende Werte geändert:

- LED-Entladezeit 20 ms
- B<50

Ich habe weiterhin zwecks besserem Verständnis die Variabel 'Hell_dunkel' in 'Led_ladezustand' umbenannt. 'B' habe ich als Byte deklariert und die Zähler-Begrenzung entsprechend heruntergesetzt.

Hier mal das komplette Programm:

Code:
'============================================================
'
' ************************************
' ***                              ***
' *** Reaktiv-Tiny v0.1 24/11/2005 ***
' ***                              ***
' ************************************
'
' µC: ATtiny13
' +Ub: 3,43 V
' I: 58 µA
' Reichweite Dorcy:
' Reichweite 4D-MagLite:
'
'============================================================

$regfile = "ATtiny13.DAT"
$crystal = 113000                                           'Reale Frequenz des internen 128kHz-Oszillators

Config Portb = &B00011000                                   'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111                                          'Pullups zuschalten, außer für Pinb.3 und .4

Stop Adc                                                    'A/D-Wandler abschalten, um Strom zu sparen
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen

Dim A As Byte
Dim B As Byte
Dim Led_ladezustand As Bit
Dim Hell As Bit

Do
    Gosub Led_abfrage
    If Led_ladezustand = 0 Then Hell = 1                    'Bei Licht Merker setzen
    If Hell = 1 And B < 255 Then B = B + 1                  'Wenn Merker gesetzt wurde, Zähler für Lichtdauer erhöhen (bis max. 255)
    If Led_ladezustand = 1 And Hell = 1 And B < 50 Then Gosub Blinken       'Wenn es wieder dunkel ist und der Lichtimpuls nur kurz war, dann blinken
    If Led_ladezustand = 1 Then                             'Bei Dunkelheit Merker und Zähler für Lichtdauer löschen
        Hell = 0
        B = 0
    End If
Loop

Led_abfrage:
    Portb.3 = 0                                             'Portb.3 auf Masse schalten
    Portb.4 = 1                                             'Portb.4 auf +Ub schalten, um die LED zu 'laden'
    Waitus 1                                                'Ladezeit 1 µs, kann ggf. noch verkleinert werden
    Config Portb.4 = Input                                  'Portb.4 nun zwecks Abfrage der LED-Ladung auf 'Eingang' schalten
    Portb.4 = 0                                             'Pullup abschalten, sonst geht's nicht!
    Waitms 20                                               'Entladezeit 20 ms - je kleiner, je unempfindlicher
    Led_ladezustand = Pinb.4                                'Ladezustand einlesen: '1' -> dunkel, '0' -> hell
    Config Portb.4 = Output                                 'Portb.4 wieder auf Ausgang schalten
    Portb.4 = 0                                             'Portb.4 auf Masse schalten
Return

Blinken:
    For A = 1 To 10
        Portb.3 = 1
        Waitms 50
        Portb.3 = 0
        Waitms 500
    Next A
Return

End

Es grüßt...

...Sir Vivor
 

Starglider

Geoguru
Sir Vivor schrieb:
Hi,
Starglider schrieb:
Was für LEDs benutzt ihr?
ich benutze diese LED, welche LED benutzt Du?
Ich habe es hier mit zwei Typen probiert:
Rote mit 1,9 V / 20 mA und blaue mit 2,9 V / 20 mA, alle mit 10...15° Abstrahlwinkel.
Aber mir fiel gerade auf dass du die Schaltung an 3,43 V betreibst und ich mit 5V, vielleicht liegt es daran.

Ich werde mal eine Selbstkalibrierungsroutine ausprobieren, die die Auswertzeit erhöht bis das erste mal "Hell" gemessen wird und den letzten Wert davor speichert. Die Probiererei geht mir nämlich langsam auf den Senkel :wink:
 

Windi

Geoguru
Sir Vivor schrieb:
Tritt das nur auf, wenn der Programmieradapter angeschlossen ist? Oder auch wenn die Schaltung autark arbeitet?
Sieht so aus als ob es am Programmieradapter lag. Ohne geht es.
Ich habe in meiner Not vorher mal versucht das Fusebit 3 auf "Externel Reset Disable" zu setzen. Danach hat der Kaltstart auch mit angeschlossenem Programmieradapter geklappt.
Allerdings hab ich jetzt keinen Zugriff mehr auf den Chip. Der Programmer kann den Chip nicht mehr identifizieren. Hab ich ihn damit jetzt gekillt bzw. dauerhaft gesperrt? Das Programm ist glücklicherweise drin und läuft.
 
OP
S

Sir Vivor

Geocacher
@Starglider:
Deine LED's haben aber ein transparentes bzw. klares Gehäuse? Mit einer blauen dürfte es übrigens bei abnehmender Betriebsspannung etwas eng werden... Die Oszillatorfrequenz des Tiny's ist betriebsspannungsabhängig, damit ändern sich auch die Laufzeiten von Schleifen.

@Windi:
Der Programmieradapter zieht zwischendurch manchmal den Reset-Pin auf Masse (evtl. Problem mit der Leitungslänge -> kürzere Leitungen!) bzw. läßt ihn nach dem Programmieren nicht wieder 'los'. Dagegen hilft ein 10 bis 15 kOhm-Widerstand von Reset an +Ub ( Pin 1 - Pin 8 ). Den brauchst Du aber dann in der späteren, autargen Schaltung nicht mehr! Zum Chip-Problem: Dein Chip sollte an sich nicht kaputt sein, er bekommt jetzt nur dank des 'weg programmierten' Reset-Pins den Reset des Programmieradapters nicht mehr mit... Abhilfe: Du mußt den Tiny im High-Voltage-Modus programmieren und dann das Fuse-Bit wieder zurücksetzen. Ich recherchiere gerade mal zum Thema...
 

Windi

Geoguru
Hab gerade an den Chip die Led mit Vorwiderstand und 2 Batterien gelötet und ein wenig experimentiert.

Vermutlich muss ich das mit der Empfindlichkeit noch optimieren (verringern). Bei bestimmten Lichtverhältnissen hört das Teil nämlich nicht mehr zu blinken auf. Daraus schließe ich das der LED-Ladezustand sich nicht entscheiden kann ob er High oder Low sein will.
 

Starglider

Geoguru
Sir Vivor schrieb:
@Starglider:
Deine LED's haben aber ein transparentes bzw. klares Gehäuse? Mit einer blauen dürfte es übrigens bei abnehmender Betriebsspannung etwas eng werden...
Ja, sie sind transparent. Inzwischen habe ich es mit den roten LEDs hinbekommen, aber die blauen mag er nach wie vor nicht.
 

Windi

Geoguru
Ich habe gerade einen kleinen Reichweitentest durchgeführt.
Mit der Aldi-Funzel habe ich bei mir (in der beleuchteten Straße) eine Reichweite von ca. 75 Metern erreicht.
Ich denke, dass mit einer Mag 4D im dunklen Wald locker über 200 Meter drin sein dürften.

@ Sir Vivor: Hast Du wegen des Umprogrammierens des Fuse-Bits schon was rausbekommen?
 

Monty

Geocacher
Ich habe ein STK500 hier, ich könnte ihn auf jeden Fall wieder reanimieren. Wenn Du ihn mir am Stammtisch mitgibst...
 

Windi

Geoguru
Monty schrieb:
Ich habe ein STK500 hier, ich könnte ihn auf jeden Fall wieder reanimieren. Wenn Du ihn mir am Stammtisch mitgibst...
Ich hab das Teil morgen eh dabei um es den anderen mal zu zeigen. Allerdings komplett verlötet.
Ich hab ja glücklicherweise noch ein paar Chips da. Es ist also nicht sooo dringend.
 

Windi

Geoguru
Windi schrieb:
Ich hab ja glücklicherweise noch ein paar Chips da. Es ist also nicht sooo dringend.
Irgendwas ist jetzt ganz schief gelaufen. Irgendwie habe ich mir gerade 3 Chips unbrauchbar gemacht. Ich verstehe nur nicht wie.
Ich habe einen bereits programmierten Chip umprogrammiert. Danach ließ er sich nicht mehr ansprechen.
Also einen jungfräulichen Chip hergenommen. Bei den Fuses nur geschaut ob er sich ansprechen lässt aber nichts verändert. Dann den Chip programmiert. Wieder tot.
3. Versuch: Neuer jungfräulicher Chip. Fuses diesmal eingestellt (128 kHz, 8 Div off). Programmiert. Tot.
Einen hab ich noch, aber jetzt will ich nicht mehr.
Woran könnte das liegen? Ich habe irgendwie in Verdacht, dass womöglich diese Reset-Fuse aus meinem vorherigen Versuch da irgendwie zugeschlagen hat. Kann diese Fuse programmiert werden ohne dass ich sie händisch einstelle?
In der obersten Zeile vom Sourcecode stand nämlich auf einmal etwas bezüglich Fuses drin. Hab ich sinnvollerweise aber gelöscht und mir nicht gemerkt was es war.

[Edith]
Lag wohl tatsächlich an der obersten Zeile im Sourcecode. Mit dem letzten verbliebenen Chip hat es dann noch geklappt.
 

Windi

Geoguru
Und hier schon wieder eine verbesserte Version des Programms.
Ich habe den Filter noch optimiert nachdem das Licht bei mir bei ungünstigen Lichtverhältnissen dauernd geblinkt hat.
Nachdem ein Lichtwechsel Dunkel-Hell-Dunkel erkannt wurde wird während der abschließenden Dunkel-Phase mehrfach hintereinander der LED-Ladezustand geprüft. Nur wenn er bei den nächsten 5 Zyklen ebenfalls immer dunkel ist wird der Blinker ausgelöst. Ich habe eine hohe Empfindlichkeit und einen Abtastzyklus von 100 ms deshalb teste ich nur auf 5 Zyklen sonst geht der Blinker zu spät an. Bei einem kürzeren Abtastzyklus (20 ms) kann man die Zyklusanzahl auf 25 stellen.

Code:
'============================================================
'
' ************************************
' ***                              ***
' *** Reaktiv-Tiny v0.1 24/11/2005 ***
' ***                              ***
' ************************************
'
' µC: ATtiny13
' +Ub: 3,43 V
' I: 58 µA
' Reichweite Dorcy:
' Reichweite 4D-MagLite:
'
'============================================================

$regfile = "ATtiny13.DAT"
$crystal = 113000                                           'Reale Frequenz des internen 128kHz-Oszillators

Config Portb = &B00011000                                   'Pinb.3 und .4 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100111                                          'Pullups zuschalten, außer für Pinb.3 und .4

Stop Adc                                                    'A/D-Wandler abschalten, um Strom zu sparen
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen

Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim Led_ladezustand As Bit
Dim Hell As Bit
Dim Dunkel As Bit

Do
    Gosub Led_abfrage
    If Led_ladezustand = 0 Then Hell = 1                    'Bei Licht Merker setzen
    If Hell = 1 And B < 255 Then B = B + 1                  'Wenn Merker gesetzt wurde, Zähler für Lichtdauer erhöhen (bis max. 255)
    If Led_ladezustand = 1 And Hell = 1 And B < 30 Then     'Wenn es wieder dunkel ist dann nachsehen für wie lange
       Dunkel = 1                                           'Merker Setzen
       For C = 0 To 5                                       'LED-Zustand mehrmals abfragen
         Gosub Led_abfrage
         If Led_ladezustand = 0 Then Dunkel = 0             'Wenn wieder Hell dann Dunkel-Merker löschen
       Next B
       If Dunkel = 1 Then Gosub Blinken                     'Wenn Dunkel-Merker gesetzt blinken
    End If


    If Led_ladezustand = 1 Then                             'Bei Dunkelheit Merker und Zähler für Lichtdauer löschen
        Hell = 0
        B = 0
    End If
Loop

Led_abfrage:
    Portb.3 = 0                                             'Portb.3 auf Masse schalten
    Portb.4 = 1                                             'Portb.4 auf +Ub schalten, um die LED zu 'laden'
    Waitus 1                                                'Ladezeit 1 µs, kann ggf. noch verkleinert werden
    Config Portb.4 = Input                                  'Portb.4 nun zwecks Abfrage der LED-Ladung auf 'Eingang' schalten
    Portb.4 = 0                                             'Pullup abschalten, sonst geht's nicht!
    Waitms 100                                              'Entladezeit 100 ms - je kleiner, je unempfindlicher
    Led_ladezustand = Pinb.4                                'Ladezustand einlesen: '1' -> dunkel, '0' -> hell
    Config Portb.4 = Output                                 'Portb.4 wieder auf Ausgang schalten
    Portb.4 = 0                                             'Portb.4 auf Masse schalten
Return

Blinken:
    For A = 1 To 10
        Portb.3 = 1
        Waitms 10
        Portb.3 = 0
        Waitms 100
    Next A
Return

End
 

kapege.de

Geocacher
Windi schrieb:
Lag wohl tatsächlich an der obersten Zeile im Sourcecode. Mit dem letzten verbliebenen Chip hat es dann noch geklappt.
<Spaß ein>
Ja, Windi, eine Zeile mit dem Befehl "... then goto Hell" (dann fahr zur Hölle) sollte man vermeiden. :twisted: :twisted: :twisted:
<Spaß aus>
Tolle Schaltung die ihr da entwickelt! Leider kann ich sie mir heute auf dem Stammtisch nicht anschauen, weil ich da arbeiten muss. Bringst du deinen Blinker auch nochmal zum Weihnachtsstammtisch mit?
 
OP
S

Sir Vivor

Geocacher
Windi schrieb:
@ Sir Vivor: Hast Du wegen des Umprogrammierens des Fuse-Bits schon was rausbekommen?
Ja, habe ich. Bei der 'High-Voltage'-Programmierung werden während der Programmierung 12 V an den Reset-Pin gelegt. Das geht mit dem 'Low-Cost-Programmieradapter' logischerweise nicht. Abhilfe: Du baust Dir einen etwas verbesserten Adapter (z.B. die 8-Pin-Version aus diesem Beispiel) oder nimmst das Angebot von Monty an. Die Fuse-Bits sind halt nicht ohne...! ;-)

Windi schrieb:
[Edith]
Lag wohl tatsächlich an der obersten Zeile im Sourcecode. Mit dem letzten verbliebenen Chip hat es dann noch geklappt.
Äh? Du hast die Fuses anders gesetzt und programmiert und das hat 'etwas' in den Sourcecode geschrieben??? Something strange is going on... Das verstehe ich nun wirklich nicht. Was stand denn da? Bascom sollte veränderte Fuse-Bits nicht als neuen 'Default'-Wert übernehmen!

Zum eigentlichen Programm:
Ich denke nicht, daß es sinnvoll ist, die LED auf total-extrem-hyperempfindlich einzustellen. Dann reicht nämlich bereits die kleinste Lichtmenge (z.B. Vollmond, ein in der Nähe vorbeifahrendes Auto oder der sich entzündende Pups eines Eichhörnchens), um Deinen 'Filter' ganz arg auf die Probe zu stellen und ggf. auszutricksen. Mein Vorschlag wäre: Eine ausreichenden Empfindlichkeit einstellen (z.B. mit der Dorcy 30 - 50 m und der 2D-Mag 150 m) und dann Deinen 'Filter' mit einer möglichst kurzen Reaktionszeit (1 s) darauf anpassen. In der letzten von mir veröffentlichten Version scheinen mir die Werte schon fast ideal. Wird aber noch Outdoor getestet. Deine jetzige Verbesserung scheint mir nämlich auf den ersten Blick nur eine Ausbremsung bzw. Verzögerung zu sein, da der Filter eben schon auf kleinstes Störlicht zu empfindlich reagiert. Aber schau'n mer mal...

Bei mir steht übrigens als nächstes der Teach-In-Modus auf dem Zettel.

EDIT:

By the way: Müßte es am Ende der neuen Schleife nicht 'Next C' heißen statt 'Next B'?

Viele Grüße,

Sir Vivor
 

Bara68

Geocacher
Windi schrieb:
Bei bestimmten Lichtverhältnissen hört das Teil nämlich nicht mehr zu blinken auf. Daraus schließe ich das der LED-Ladezustand sich nicht entscheiden kann ob er High oder Low sein will.
Das Verhalten habe ich bei Dämmerung erwartet und deshalb einen Schritt weitergedacht:

Bara68 schrieb:
Ihr wollt, dass bei Dämmerung die LED nicht aktiv wird? Dazu muss eine 3. Abfrage mit einer anderen Lichtempfindlichkeit hinzugefügt und richtig ausgewertet werden.
Du musst also die Änderung der Helligkeit zwischen zwei Messungen richtig auswerten! Bei Dämmerung, am Tag oder in der Nacht ist die klein und mit einer Taschenlampe groß.
 

Windi

Geoguru
Sir Vivor schrieb:
Äh? Du hast die Fuses anders gesetzt und programmiert und das hat 'etwas' in den Sourcecode geschrieben??? Something strange is going on... Das verstehe ich nun wirklich nicht. Was stand denn da? Bascom sollte veränderte Fuse-Bits nicht als neuen 'Default'-Wert übernehmen!
Ja, aber genau so war es. In der ersten Zeile stand dann etwas drin sogar mit Kommentar (so ähnlich wie "Stellen Sie sicher das Ihr Prozessor diese Fuses unterstützt").

Sir Vivor schrieb:
Ich denke nicht, daß es sinnvoll ist, die LED auf total-extrem-hyperempfindlich einzustellen. Dann reicht nämlich bereits die kleinste Lichtmenge (z.B. Vollmond, ein in der Nähe vorbeifahrendes Auto oder der sich entzündende Pups eines Eichhörnchens), um Deinen 'Filter' ganz arg auf die Probe zu stellen und ggf. auszutricksen. Mein Vorschlag wäre: Eine ausreichenden Empfindlichkeit einstellen (z.B. mit der Dorcy 30 - 50 m und der 2D-Mag 150 m) und dann Deinen 'Filter' mit einer möglichst kurzen Reaktionszeit (1 s) darauf anpassen. In der letzten von mir veröffentlichten Version scheinen mir die Werte schon fast ideal. Wird aber noch Outdoor getestet. Deine jetzige Verbesserung scheint mir nämlich auf den ersten Blick nur eine Ausbremsung bzw. Verzögerung zu sein, da der Filter eben schon auf kleinstes Störlicht zu empfindlich reagiert. Aber schau'n mer mal...
Ich will das Licht halt für eine möglichst hohe Reichweite einsetzen und das geht halt nur mit einer hohen Empfindlichkeit. Dabei ist mir halt aufgefallen dass der LED_Ladezustand bei mittelmäßiger aber gleichbleibender Beleuchtung mal 1 und mal 0 ausgibt. Ob und welche Parameter jemand bei seinem Blinker einstellt bleibt jedem selber überlassen. Ich probier es jetztz mal mit dieser Variante.
Wenn ich wieder ein paar funktionierende Tinys habe mache ich mal den Vergleichstest in freier Natur.

Sir Vivor schrieb:
By the way: Müßte es am Ende der neuen Schleife nicht 'Next C' heißen statt 'Next B'?
Du hast natürlich recht. Den Compiler scheint es aber nicht zu jucken.

Ich werd dann wohl die "blockierten" Tinys heute abend mal Monty zum Stammtisch mitbringen.
 

Windi

Geoguru
Sir Vivor schrieb:
Und, hat Monty die kleinen 'Leichen' in Empfang genommen? :lol:
Jawoll hat er. Jetzt muss ich nur noch bis zum nächsten Stammtisch warten bis ich sie wiederbekomme. Glücklicherweise haben wir schon in 3 Wochen unsere Weihnachtsfeier. Ich werd mir aber noch einen großen Schwung bestellen.
Das Reaktivlicht hat übrigens am Stammtisch großen Anklang gefunden.
 
Oben