torama
Geocacher
Hallo, ich habe wohl einen Bug im Code, aber kann ihn nicht richtig
lokalisieren. Grob baut der Code auf dem BASCOM auf lt. reaktivlicht.de
Die Eule soll nach dem kurzen Anleuchten 7x Blinken und wenns dunkel
bleibt auch 7x wiederholen. Es funktioniert auch ABER
nach ca. 2 Tagen hängt sich die Eule auf und reagiert nicht mehr und
jetzt nach 1 Woche funktioniert sie wieder von alleine. Ich vermutete
einen Überlauf oder so aber wo ?
Bitte kann mal einer checken?
Der Code ist wie gesagt abgewandelt aus dem
Backbuch für Reaktivlichter und die Variablen habe ich dann natürlich so
belassen wie sie heißen.
Der Code funktioniert ja auch nur eben mal so 2 Tage und dann erst
wieder nach ner Woche.
Da die Helligkeit mit einer LED gemessen wird, war meine Vermutung, dass
es evtl. bei Temperaturen um 0°C eine Kennlinienverschiebung gibt, aber
naja...
lokalisieren. Grob baut der Code auf dem BASCOM auf lt. reaktivlicht.de
Die Eule soll nach dem kurzen Anleuchten 7x Blinken und wenns dunkel
bleibt auch 7x wiederholen. Es funktioniert auch ABER
nach ca. 2 Tagen hängt sich die Eule auf und reagiert nicht mehr und
jetzt nach 1 Woche funktioniert sie wieder von alleine. Ich vermutete
einen Überlauf oder so aber wo ?
Bitte kann mal einer checken?
Code:
' **********************************************
' ***
' *** Nachteule
' ***
' **********************************************
$regfile = "ATtiny13.DAT"
$crystal = 16000 'Frequenz des internen Oszillators
Config Portb = &B00011001 'Pinb.3,4 und .5 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = &B11100110 'Pullups zuschalten, außer für Pinb.3,4 und .5
Stop Adc 'A/D-Wandler abschalten (Strom sparen)
Stop Ac 'Analog-Komparator abschalten (Stromsparwilli)
Wdtcr = &B11010101 'Watchdog definieren: 0.5 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts 'Interrupts freigeben
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim Led_ladezustand As Bit
Dim Hell As Bit
Dim Hell_2 As Byte
Do
Gosub Led_abfrage
If Led_ladezustand = 0 Then
Hell = 1
If B = 0 Then
Gosub Blinken 'Schon mal erstes Mal Blinken
End If
End If
If Hell = 1 And B < 255 Then
B = B + 1 'Wenn Merker gesetzt wurde, Zähler für Lichtdauer erhöhen (bis max. 255)
End If
If B > 200 Then
Gosub Abschalten 'Tagabschaltung
End If
If Led_ladezustand = 1 And Hell = 1 And B < 30 Then 'Wenn es wieder dunkel ist und der Lichtimpuls nur kurz war
Hell_2 = 0 'zweiten Hell-Merker setzen
For C = 0 To 3 'und 5 mal afragen
Gosub Led_abfrage
If Led_ladezustand = 0 Then
Hell_2 = Hell_2 + 1 'ob es auch wieder dunkel ist
End If
Next C
If Hell_2 = 0 Then
Gosub Blinken 'erst dann blinken
End If
Hell = 0
B = 0
End If
If Led_ladezustand = 1 Then 'Bei Dunkelheit Merker und Zähler für Lichtdauer löschen
Hell = 0 'damit sich das Programm nicht aufhängt
B = 0
End If
Loop
Led_abfrage:
Reset Watchdog
Powerdown
Portb.3 = 0
Portb.4 = 1 'Portb.4 auf +Ub schalten, um die LED zu 'laden'
Waitus 1 'Ladezeit, 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 4000
Led_ladezustand = Pinb.4 'Ladezustand einlesen: '1' -> dunkel, '0' -> hell
Config Portb.4 = Output 'Portb.4 wieder auf Ausgang schalten
Portb.4 = 0
Reset Watchdog
Powerdown
Return
Blinken:
For A = 1 To 7
'Portb.3 = 1
Portb.0 = 1 ' 2. Auge mitleuchten
Reset Watchdog
Powerdown
'Portb.3 = 0
Portb.0 = 0 ' 2. Auge mitleuchten
Reset Watchdog
Powerdown
Next A
Return
Abschalten:
Wdtcr = &B11110001
Reset Watchdog
Powerdown
Wdtcr = &B11010101
Return
End
Der Code ist wie gesagt abgewandelt aus dem
Backbuch für Reaktivlichter und die Variablen habe ich dann natürlich so
belassen wie sie heißen.
Der Code funktioniert ja auch nur eben mal so 2 Tage und dann erst
wieder nach ner Woche.
Da die Helligkeit mit einer LED gemessen wird, war meine Vermutung, dass
es evtl. bei Temperaturen um 0°C eine Kennlinienverschiebung gibt, aber
naja...