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

3 identische Reaktivlichter laufen nicht synchron?!?

rumo&rala

Geocacher
Moin,

für eine Station habe ich 3 identische Reaktivlichter mit identischem Programm gebaut, die an einer Stromquelle hängen.
Wenn ich sie nun anschließe laufen die Reaktivlichter alle unterschiedlich schnell ?!?!
d.h. sie gehen noch alle gleichzeitig an, danach gibt es ein lustiges Geblinke und kein gemeinsamer Rhytmus, wie ich es mir vorgestellt habe.

Dass die Attinys ohne Quarz nicht soooo genau sind, war mir schon klar, aber gibt das wirklich so krasse Unterschiede?

Hier nochmal der Test-Code (nicht sehr schön, ist ja nur zum Testen):
Code:
'============================================================
'
' ********************************************************
' ***                                                  ***
' ***    Tiny-Reaktivlicht mit LDR und A/D-Wandler     ***
' *** mit Watchdog-Energiesparmodus und Tagabschaltung ***
' *** Ausgabe von Morsesignalen beim Anleuchten        ***
' ***                                                  ***
' ***      erstellt von Windi für www.geoclub.de       ***
' ***                   04.01.2008                     ***
' ***                                                  ***
' ********************************************************
'
' µC: ATtiny13V
' +Ub: 3,00 V
' I: 17 µA im Leerlauf (Nachtbetrieb)
' I: 5 µA bei Tagabschaltung
' Reichweite: 650 m mit Maglite 5D
'
'============================================================

$hwstack = 20                                               'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny13.DAT"
$crystal = 128000                                           'Frequenz des internen Oszillators




Config Adc = Single , Prescaler = Auto
Config Portb = &B00001100                                   'Pinb.2,3,auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0                                                   'Ausgänge auf Low setzen
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen

Wdtcr = &B11010011                                          'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts                                           'Interrupts freigeben

Const Schwelle = 40                                         'je größer der Schwellwert, desto unempfindlicher
Const Tagschwelle = 800                                     'Schwellwert für Schlafmodus
Const Zwangsimpuls = 37                                     'LED-Impuls tagsüber (5 minuten) alle X Schlafyklen (á ca. 8 Sekunden)

Dim A As Byte                                               'Variablen definieren
Dim Tagzaehler As Byte
Dim Schlafzaehler As Byte
Dim Ldr As Integer                                          '0 = Dunkel, 1023 = Hell
Dim Alt As Integer
Dim Merker As Integer
Dim Zeichen As String * 1

Do
Reset Watchdog
Powerdown                                                   'prozessor bremsen da sonst lichtänderung nicht erkannt wird
Start Adc                                                   'A/D-Wandler starten
Ldr = Getadc(2)                                             'Helligkeitswert einlesen
Stop Adc                                                    'A/D-Wandler zum Stromsparen wieder stoppen
Merker = Ldr - Alt                                          'Unterschied zwischen letzter und aktueller Messung ermitteln
Alt = Ldr                                                   'letzten LDR-Wert sichern
If Merker > Schwelle Then Gosub Morsen                      'Bei großer Änderung Dunkel->Hell: Blinken
If Ldr > Tagschwelle Then                                   'prüfen ob helligkeit über tagschwelle liegt
   If Tagzaehler < 255 Then                                 'int-variable geht nur bis 255
      Tagzaehler = Tagzaehler + 1
   End If
Else
   Tagzaehler = 0                                           'wenn wieder dunkel tagzähler löschen
End If

If Tagzaehler > 200 Then Gosub Pause                        'wenn mehr als x zyklen hell dann schlafmodus

Loop


Pause:
Wdtcr = &B11110001                                          'Watchdog auf 8 Sekunden stellen
Reset Watchdog
Powerdown
Wdtcr = &B11010011                                          'Watchdog wieder auf 0,125 Sekunden zurückstellen
Schlafzaehler = Schlafzaehler + 1                           'merken wie oft Schlafmodus durchlaufen wurde
If Schlafzaehler = Zwangsimpuls Then                        'als Funktionskontrolle tagsüber keine LED auslösen
  ' Portb.3 = 1
   Reset Watchdog
   Powerdown
   Portb.3 = 0
   Schlafzaehler = 0
End If
Return

Morsen:
Alt = 1023                                                  'Doppelauslösung verhindern

Wdtcr = &B11010011
Portb = &B00001100                                          ' ,2,3 an
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Portb = &B00000000                                          'aus
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown

Portb = &B00001100                                         ' ,2,3 an
Reset Watchdog
Powerdown
Portb = &B00000000                                          'alle aus
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown

Portb = &B00001100                                          ' ,2,3 an
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Portb = &B00000000                                          'aus
Reset Watchdog
Powerdown
Wdtcr = &B11010011                                          'Watchdog wieder auf 0,125 Sekunden zurückstellen
Return

End

Ich bin ein wenig schockiert über die Unterschiede. Ich hoffe ihr könnt mir helfen, sonst muss ich mir was anderes einfallen lassen.

Gruß,

Lorenz
 

maierkurt

Geowizard
Ein Blick ins Datenblatt verrät mir: Im Auslieferungszustand hat der RC-Oszillator eine Genauigkeit von +-10%, man kann ihn kalibrieren und dann auf plus/minus 2 Prozent bringen.
Ich weiß ja nicht was du vor hast, aber egal wie "genau" die drei Taktquellen auch sind: Nach einer Gewissen Zeit laufen sie IMMER auseinander.
Da muss du dir eine Synchronisation einfallen lassen. Z.B. ein Reaktivlicht hat eine IR-Diode und sendet Pulse aus, die anderen beiden Lichter empfangen den Puls und blinken dann entsprechend.
 

Kappler

Geowizard
Oder du baust dir zur Takterzeugung jeweils einen Quarz ein. Das kostet nicht viel (1 Quarz und 2 Kondensatoren - weit unter 1 Euro) und dürfte ausreichende Genauigkeit bringen.
 

peter51d

Geocacher
Mal ganz blöd gefragt, du sagst sie hängen alle an der selben Spannungsquelle. Das heist dann ja, das sie mit zwei Adern untereinander verbunden sein müssen. Was würde den dagegen sprechen, nur ein RL zu nehmen und einfach drei LEDs anzuschliessen?
Die laufen dann ganz ohne weiter Klimmzüge immer und unter allen Umständen absolut syncron.
Ich kenne deinen Aufbau ja nicht aber ob ich über die zwei Adern jetzt die Speisespannung für ein RL laufen lasse oder daran eine LED anschliesse, die ihre Spannung vom Tiny bekommt sollte egal sein.
 
OP
R

rumo&amp;rala

Geocacher
Was würde den dagegen sprechen, nur ein RL zu nehmen und einfach drei LEDs anzuschliessen?

Hatte ich, aber da es sich bei den LEDs um Highpower-LEDs handelt, kommt da ein Attiny nicht mit klar. Daher dieser Umweg über 3 Attinys. Außerdem hatte ich die Schaltungen hier schon liegen ;)

Hmpf,

das mit den Dioden ist dann doch etwas kompliziert für diesen Zweck.
Dann doch lieber das Quarz.
Dummerweise hat der attiny13 nur einen Pin dafür, also (so habe ich gelesen) kann man nur einen Quarzoszillator verwenden.

Leider hab ich sowas noch nie gemacht. Hat das schon mal jemand beim Reaktivlicht gemacht?
Oder kann mich jemand mit Informationen versorgen wie man sowas macht:
Sowohl Hardware-, als auch Software-seitig.

Gruß,

Lorenz
 

maierkurt

Geowizard
rumo&rala schrieb:
Hatte ich, aber da es sich bei den LEDs um Highpower-LEDs handelt, kommt da ein Attiny nicht mit klar. Daher dieser Umweg über 3 Attinys. Außerdem hatte ich die Schaltungen hier schon liegen ;)
Das ist doch Blödsinn. Welche Highpower-LEDs sollen das denn sein? Wieviel Strom benötigen die denn?
Laut Datenblatt:
Datasheet schrieb:
DC Current per I/O Pin ............................................... 40.0 mA
DC Current VCC and GND Pins ................................ 200.0 mA
Entweder schafft der Tiny13 es alle drei LEDs zu versorgen, oder er ist schon mit einer einzigen überlastet.
 

peter51d

Geocacher
Ich hätte jetzt einen MOSFET vorgeschlagen. z.B. IRLU2905. ist auf jeden Fall schon mal günstiger als ein Tiny und kaum teurer als drei Quarze.
Damit sollte das Stromproblem erledigt sein.
Zur Not und mit einem Kühlkörper ( wenn es nur ein paar mal blinken soll sicherlich auch ohne Kühlkörper) gingen dann sogar 20 von diesen LEDs
Die kleineren in Bunt so wie so.
Ich würde es mir überlegen, ob ich mir die Arbeit mit den Quarzen machen würde, zumal auch damit keine hundert prozentige gewähr für eine dauerhafte Syncronität gegeben ist. Auch Quarze sind nie alle gleich und haben eine Toleranz.

Was mir gerade einfällt. Warum nimmst du nicht eien Tiny als Master und lässt ihn die anderen ansteuern.
OK, du brauchst eine Ader mehr und die Programmierung der "Save" Tiny müsste geändert werden,aber das währe es dann auch schon.
Die "Slaves" müsten ja nur eine Handvoll Code bekommen, so in der Art:

if pinb.0=1
then portb.1=1
else portb.1=0
end if

Das drumherum habe ich jetzt mal nicht mitgeschrieben.

Die Stromspar Geschichte bekommt man da auch noch irgendwie mit rein, z.B. mit einem pininterupt oder was in der Richtung. Aber wenn ich das so sehe, würde ich doch eher einen Transistor oder MOSFET nehmen.
Braucht weniger Gehirnschmalz.

Just my 2 ct.
 
OP
R

rumo&amp;rala

Geocacher
Das ist doch Blödsinn. Welche Highpower-LEDs sollen das denn sein? Wieviel Strom benötigen die denn?
Ich hab das Datenblatt nicht zur Hand, aber ich glaube es waren 500mA :D
Es muss eine große Reichweite erreicht werden (mehrere Kilometer) und da habe ich alte Cree-Leds ausgegraben, mit denen ich mal ne Taschenlampe gebaut habe...

Und jetzt kommts:
Auch wenn der ein oder andere jetzt eine elektronische Gänsehaut bekommt.
Ich habe um auf eine vernünftige Stromstärke zu bekommen, je LED 2 Pins kombiniert...
Auch wenn das nicht besonders schön ist. Es funktioniert.

Also an den Slave hab ich auch schon gedacht, nur die Idee mit den Dioden war mir zu kompliziert. Direkt ist natürlich viel einfacher. Da ich die Schaltungen schon da habe, ist das wahrscheinlich der beste Weg. Danke für den Input!

Wie man nen Quarz in das Reaktivlicht einbaut, würde mich trotzdem noch interessieren. Für eine andere Station wäre das interessant.

Gruß,
Lorenz
 

peter51d

Geocacher
Äm, du hast das Datenblatt des Tiny aber schon gesehen oder. 500mA kann er nicht, egal wie viele Ports du zusammen schaltest. Er kann 40maA pro Port aber max 200mA gesammt. Bei zwei Ports wären das max 80mA, also auch noch meilen von deinen 500mA entfernt. Ich würde dir raten doch Transistoren oder TTL taugliche MOSFETs einzusetzen.
 

maierkurt

Geowizard
rumo&rala schrieb:
Ich hab das Datenblatt nicht zur Hand, aber ich glaube es waren 500mA :D
Glauben kann man gut in der Kirche, hier zählen aber nur Fakten.
Wie willst du denn den Vorwiderstand passend berechnen, wenn du gar nicht weißt, wie viel Strom die LED braucht und vor allem auch VERTRÄGT?

rumo&rala schrieb:
Und jetzt kommts:
Auch wenn der ein oder andere jetzt eine elektronische Gänsehaut bekommt.
Ich habe um auf eine vernünftige Stromstärke zu bekommen, je LED 2 Pins kombiniert...
Auch wenn das nicht besonders schön ist.
Gänsehaut trifft es nicht so ganz, eher Hände-über-dem-Kopf-zusammenschlagen.
rumo&rala schrieb:
Fragt sich nur wie lange.
Wenn wirklich die 500mA benötigt werden, dann schließe 3 MOSFETs an einen tiny13, z.B. den LR024N.
rumo&rala schrieb:
Wie man nen Quarz in das Reaktivlicht einbaut, würde mich trotzdem noch interessieren. Für eine andere Station wäre das interessant.

Gruß,
Lorenz
Steht auch im Datenblatt.
 
OP
R

rumo&amp;rala

Geocacher
Naja irgendwie funktioniert es zufriedenstellend und es war ne schnelle Lösung.

Ich probier grad das mit Master und Slave, aber irgendwie wollen die Sklaven nicht.
Ich befürchte ich hab es mir etwas zu einfach gemacht. Kann sich mal jemand den Code anschauen?

Code:
$hwstack = 20                                               'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny13.DAT"
$crystal = 128000                                           'Frequenz des internen Oszillators




'Config Adc = Single , Prescaler = Auto
Config Portb = &B00001100                                   'Pinb.2,3 auf 'Ausgang', Rest auf 'Eingang' schalten
Config Pinb.1 = Input                                       'Pinb.1 nochmal auf Eingang :)
Portb = 0                                                   'Ausgänge auf Low setzen
Stop Ac                                                     'Analog-Komparator abschalten, um Strom zu sparen

Wdtcr = &B11010011                                          'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset
                                                    '

Reset Watchdog
Powerdown

Do

If Pinb.1 = 0 Then
Portb.2 = 1
Portb.3 = 1
Else
Portb.2 = 0
Portb.3 = 0
End If


Loop


End

Vielen Dank für die Unterstützung!
 

maierkurt

Geowizard
Stelle dir doch mal folgendes vor:
Du liegst im Bett, schläfst richtig fest und hast den Wecker für 7 Uhr gestellt.
Jetzt kommt schon um 6:55 eine Fee und kitzelt mit einer Feder an deinem Fuß (Portb.1).
Ob du davon wirklich wach wirst? Wohl nicht. Dann klingelt der Wecker um sieben, du wirst wach, die Fee mit der Feder ist aber schon wieder weg.
Den zweiten Fehler im Programm kannst du selber suchen.
 
OP
R

rumo&amp;rala

Geocacher
@maierkurt:
Wie dir sicher schon aufgefallen ist, bin ich ein Elektronik-Anfänger.
Also bitte drücke dich entsprechend aus.
Ich brauche jemand der mir bei der Problemlösung hilft. Wenn mein Problem nicht deinem Niveau entspricht, hast du auch die Möglichkeit nicht zu antworten.

Bitte nur noch hilfreiche Kommentare!

ach ja es muss natürlich
Code:
If Pinb.1 = 1 Then
Portb.2 = 1
Portb.3 = 1
Else
Portb.2 = 0
Portb.3 = 0
End If
heißen.

Trotzdem ist der Wurm drin. Muss ich mit Interrupt arbeiten?
 

peter51d

Geocacher
Was erwartest du den jetzt von den Usern dieses Forums?
Eine fertige Lösung für dein Problem?
Ist hier schon mehrfach gepostet worden. Schnell, einfach, sicher, anfängertauglich.
Nimm einen Transistor oder MOSFET und du hast alles was du brauchst.
Warum muss es denn unbedingt die Lösung mit drei einzelnen RL's sein?
Weil sie nunmal da sind? Dann lege dir doch einfach zwei an die Seite für später mal. Fressen auch bestimmt kein Brot. Da bin ich mir sicher, ich habe selber noch welche liegen.

Eine extra für dich gefertigte Lösung wir dir hier nur in den seltensten Fällen jemand servieren.
Es sei denn, jemand hat gerade extreme Langeweile.
Man bekommt Tips und Infos zu seinen Problemen um sie dann zu lösen und wenn man einen Schritt weiter ist und wieder Probleme auftauchen fragt man halt noch mal. Aber man sollte schon auch eine gewisse Eigeninitiative zeigen.

Du möchtest hilfe zu deinem Problem, maierkurt hat sie dir doch schon gegeben. Ok, er hat sich vielleicht etwas "ungeschickt" ausgedrückt, aber genau dein Problem beschrieben.
Das du es aber offensichtlich nicht verstanden hast, legt die Vermutung nahe, das du dich so gut wie noch gar nicht mit der Materie beschäftigt hast. Stichwort: Watchdog. Den ganz so einfach wie du es dir gemacht hast, ist es dann doch nicht. In zwei Sätzen: der Tiny schläft und der "Wátchdog" weckt ihn und nach der Arbeit geht der Tiny wieder schlafen. Wenn die Tinys aber unterschiedlich aufwach Zeitpunkte haben, werden sie sich nie unterhalten können.

Mein Ansatz wäre wenn überhaupt ein Pininterupt. Bin aber bestenfalls ein fortgeschrittener Anfänger. Nur damit ist es halt nicht getan. Das Hauptprogramm muss auch noch entsprechend angepasst werden, damit die "Slaves" nichts verpassen.

Mal schnell ein RL zusammen zu löten ist das eine, den Programmcode dann für sich selber anzupassen schon etwas ganz anderes.

Ich würde dir empfehlene dich erst mal mit den Grundlagen zu beschäftigen. Ein RLCode ist schon etwas komplexer.

Was mich noch interresieren würde, warum muss man das RL über mehrer Km sehen können?
Antriggern dürfte aus einer solchen Entfernung kaum möglich sein.

Ich hoffe ich bin dir nicht zu sehr auf den Schilps getreten und wünsch dir noch viel Erfolg.
 

radioscout

Geoking
Bitte nicht vergessen: dies ist das kleine, friedliche Elektronik-Board.

Willst Du wirklich einen uC als Treiber einsetzen?
Welchen Vorteil außer "ist hier vorhanden" siehst Du in dieser Lösung?
Was außer "muß evtl. bestellt werden" spricht gegen einen Transistor?
 

peter51d

Geocacher
@radioscout

Sollte ich mich im Ton vergriffen haben oder sollte es so rüber gekommen sein, was es nicht sollte, entschuldige ich mich dafür.
 

maierkurt

Geowizard
rumo&rala schrieb:
@maierkurt:
Wie dir sicher schon aufgefallen ist, bin ich ein Elektronik-Anfänger.
Also bitte drücke dich entsprechend aus.
Jetzt hatte ich mir so eine Mühe mit der kleinen Geschichte gegeben. :roll:

rumo&rala schrieb:
ach ja es muss natürlich
Code:
If Pinb.1 = 1 Then
Portb.2 = 1
Portb.3 = 1
Else
Portb.2 = 0
Portb.3 = 0
End If
heißen.
Oh, diesen Fehler habe ich übersehen.

Was mich nervt ist soetwas: Da wollte ich schon fast nicht mehr weiterlesen.
Code:
Config Portb = &B00001100                                   'Pinb.2,3 auf 'Ausgang', Rest auf 'Eingang' schalten
Config Pinb.1 = Input                                       'Pinb.1 nochmal auf Eingang :)
Zweimal auf Eingang setzten? Soll soetwas besonders witzig sein?
Wenn BASCOM es schon zur Verfügung stellt, warum dann nicht:
Code:
Config Pinb.1 = Input 
Config Pinb.2 = Output 
Config Pinb.3 = Output
So siehst du auf einen Blick, wie die Pins konfiguriert sind.

romu&rala schrieb:
Bitte nur noch hilfreiche Kommentare!
Die wirst du von mir garantiert nicht bekommen, solange du mir nicht gesagt hast, was du da genau für eine LED verbaut hast. Ist ein Datenblatt vorhanden?
Sonst schustern wir nur an irgendwelchen Sympthomen herum, warum "da der Wurm drin ist"
 
OP
R

rumo&amp;rala

Geocacher
So bevor das ausufert:

peter51d schrieb:
Das du es aber offensichtlich nicht verstanden hast, legt die Vermutung nahe, das du dich so gut wie noch gar nicht mit der Materie beschäftigt hast. Stichwort: Watchdog. Den ganz so einfach wie du es dir gemacht hast, ist es dann doch nicht. In zwei Sätzen: der Tiny schläft und der "Wátchdog" weckt ihn und nach der Arbeit geht der Tiny wieder schlafen. Wenn die Tinys aber unterschiedlich aufwach Zeitpunkte haben, werden sie sich nie unterhalten können.
Ja mit dem watchdog hab ich mich noch nicht beschäftigt, aber was ist daran so schwer das explizit zu sagen?!
Auch habe ich mich mit der Master/Slave-Geschichte noch nicht beschäftigt und darum interessiert es mich! Genau deswegen beschäftige ich mich ja damit.

Als Reaktion darauf eine Geschichte zu schreiben, anstatt das Problem beim Namen zu nennen finde ich total daneben.
Als Quereinsteiger in die Thematik, ohne große Vorkenntnisse tastet man sich halt immer weiter heran und kommt ständig an stellen, wo man Wissen braucht, das mann nicht hat. Darum habe ich gefragt und ich habe keine Komplettlösung verlangt.

maierkurt schrieb:
Was mich nervt ist soetwas: Da wollte ich schon fast nicht mehr weiterlesen.
Es ist doch egal, ob der Pin zweimal auf Eingang geschaltet ist. Die erste Zeile stammt halt noch aus nem anderen Programm und ich hab das einfach nicht geändert. Aber wenn du schon genervt bist, antworte doch einfach nicht!

maierkurt schrieb:
romu&rala hat geschrieben:
Bitte nur noch hilfreiche Kommentare!

Die wirst du von mir garantiert nicht bekommen, solange du mir nicht gesagt hast, was du da genau für eine LED verbaut hast. Ist ein Datenblatt vorhanden?

Ich habe bereits geschrieben, dass ich sie nicht mehr habe.

Transistor/Mosfet, habe ich nicht da. Klar ist die Lösung einfacher, aber nicht um das Problem heute oder morgen zu lösen. Trotzdem werde ich mich damit beschäftigen, wenn ich Zeit habe.

Also ich danke für die hilfreichen Anregungen. Aber bedenkt bitte, dass es hier Anfänger gibt, die ihren "Wissens-Schwerpunkt" nicht in der Elektronik haben und keiner ist gezwungen zu antworten oder zu helfen wenn er schon "genervt" vom Anfänger-Code ist.

@Radioscout: bitte schließe den Thread.
 
Oben