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):
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
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