Ach herje, manchmal ist man auch echt blind.
Das hab ich jetzt in meinem Code geändert.
Leider funktioniert es immernoch nicht, das Fehlerbild hat sich allerdings geändert.
Jetzt wartet er nach der ersten Ausgabe zwar auf ein Signal, gibt dann allerdings wieder die ersten Daten aus.
Also liegt der Schluß nahe, dass er gar nicht in die 60sek-Schleife geht, sondern direkt wieder zum Start.
Irgendwo ist noch der Wurm drin. Hier noch mal mein "zusammen-geschusterter" Code in ganzer Länge:
Code:
$hwstack = 20 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
$regfile = "ATtiny24.DAT"
$crystal = 128000 'Frequenz des internen Oszillators
Config Adc = Single , Prescaler = Auto
Config Portb = &B00000111 'Pinb.0-2 auf 'Ausgang', Rest auf 'Eingang' schalten
Config Porta = &B10001011 'Pina.0+1+3+7 auf 'Ausgang', Rest auf 'Eingang' schalten
Portb = 0 'Ausgänge auf Low setzen
Porta = 0
Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
Wdtcsr = &B11010011 'Watchdog definieren: 0.125 Sekunden, Interrupt auslösen, kein Reset
Enable Interrupts 'Interrupts freigeben
Const Schwelle = 100 'je größer der Schwellwert, desto unempfindlicher
Const Tagschwelle = 800 'Schwellwert für Schlafmodus
Const Zwangsimpuls = 8 'LED-Impuls tagsüber alle X Schlafyklen (á ca. 8 Sekunden)
Dim A As Byte 'Variablen definieren
Dim Tagzaehler As Byte
Dim Schlafzaehler As Byte
Dim Sekundenzaehler As Byte 'sekundenzähler
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
Waitms 1
Ldr = Getadc(2) 'Helligkeitswert einlesen
Waitms 1
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:
Wdtcsr = &B11110001 'Watchdog auf 8 Sekunden stellen
Reset Watchdog
Powerdown
Wdtcsr = &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 LED auslösen
'Porta.5 = 1
Reset Watchdog
Powerdown
'Porta.5 = 0
Schlafzaehler = 0
End If
Return
Morsen:
Restore Daten 'Am Beginn der Daten anfangen
Alt = 1023 'Doppelauslösung verhindern
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Do
Reset Watchdog
Powerdown
Read Zeichen
Wdtcsr = &B11010101 'Watchdog auf 0,5s stellen
If Zeichen = "0" Then Gosub P0 'schreibt 0 ins Display
If Zeichen = "1" Then Gosub P1 'schreibt 1 ins Display
If Zeichen = "2" Then Gosub P2 'schreibt 2 ins Display
If Zeichen = "3" Then Gosub P3 'schreibt 3 ins Display
If Zeichen = "4" Then Gosub P4 'schreibt 4 ins Display
If Zeichen = "5" Then Gosub P5 'schreibt 5 ins Display
If Zeichen = "6" Then Gosub P6 'schreibt 6 ins Display
If Zeichen = "7" Then Gosub P7 'schreibt 7 ins Display
If Zeichen = "8" Then Gosub P8 'schreibt 8 ins Display
If Zeichen = "9" Then Gosub P9 'schreibt 9 ins Display
If Zeichen = " " Then Gosub Leer 'Pause = Leerzeichen
If Zeichen = "Start" Then Gosub Pstart 'startet das Intro
If Zeichen = "C" Then Gosub C 'schreibt C ins Display
Wdtcsr = &B11010011 'Watchdog wieder auf 125ms stellen
If Zeichen = "S" Then Gosub Schleife 'spring in die Schleife
If Zeichen = "X" Then Return
Loop
Schleife: '60 sek Schleife
Wdtcsr = &B11010101 'Watchdog auf 0,5s stellen
Do 'do schleife
Start Adc 'A/D-Wandler starten
Waitms 1
Ldr = Getadc(2) 'Helligkeitswert einlesen
Waitms 1
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 Morsen2 'Bei großer Änderung Dunkel->Hell:morsen2
Reset Watchdog
Powerdown
Sekundenzaehler = Sekundenzaehler + 1 'zählt alle halbe sekunde
If Sekundenzaehler < 120 Then Return 'nach 60sekunden ist schluss
Loop
Wdtcsr = &B11010011 'Watchdog wieder auf 125ms stellen
Return
Morsen2:
Restore Daten2 'Am Beginn der Daten anfangen
Alt = 1023 'Doppelauslösung verhindern
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Do
Reset Watchdog
Powerdown
Read Zeichen
Wdtcsr = &B11010101 'Watchdog auf 0,5s stellen
If Zeichen = "0" Then Gosub P0 'schreibt 0 ins Display
If Zeichen = "1" Then Gosub P1 'schreibt 1 ins Display
If Zeichen = "2" Then Gosub P2 'schreibt 2 ins Display
If Zeichen = "3" Then Gosub P3 'schreibt 3 ins Display
If Zeichen = "4" Then Gosub P4 'schreibt 4 ins Display
If Zeichen = "5" Then Gosub P5 'schreibt 5 ins Display
If Zeichen = "6" Then Gosub P6 'schreibt 6 ins Display
If Zeichen = "7" Then Gosub P7 'schreibt 7 ins Display
If Zeichen = "8" Then Gosub P8 'schreibt 8 ins Display
If Zeichen = "9" Then Gosub P9 'schreibt 9 ins Display
If Zeichen = " " Then Gosub Leer 'Pause = Leerzeichen
If Zeichen = "Start" Then Gosub Pstart 'startet das Intro
If Zeichen = "C" Then Gosub C 'schreibt C ins Display
If Zeichen = "W" Then Gosub Lang 'lange Pause
Wdtcsr = &B11010011 'Watchdog wieder auf 125ms stellen
If Zeichen = "X" Then Return
Loop
P0:
Porta = &B10001011
Portb = &B00000110
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
P1:
Porta = &B00001010
Portb = &B00000000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
P2:
Porta = &B10000011
Portb = &B00000101
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
P3:
Porta = &B10001011
Portb = &B00000001
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
P4:
Porta = &B00001010
Portb = &B00000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
P5:
Porta = &B10001001
Portb = &B00000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
P6:
Porta = &B10001001
Portb = &B00000111
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
P7:
Porta = &B00001011
Portb = &B00000000
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
P8:
Porta = &B10001011
Portb = &B00000111
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
P9:
Porta = &B10001011
Portb = &B00000011
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
Leer:
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Return
Lang:
Wdtcsr = &B11110001 'Watchdog auf 8 Sekunden stellen
Reset Watchdog '1
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog
Powerdown
Reset Watchdog '2
Powerdown
Wdtcsr = &B11010011
Return
Pstart:
Wdtcsr = &B11010011 'Watchdog auf 125ms
Porta = &B00000001 'schlange umlauf 1x
Portb = &B00000000
Reset Watchdog
Powerdown
Porta = &B00000010
Portb = &B00000000
Reset Watchdog
Powerdown
Porta = &B00000000
Portb = &B00000001
Reset Watchdog
Powerdown
Porta = &B00000000
Portb = &B00000100
Reset Watchdog
Powerdown
Porta = &B10000000
Portb = &B00000000
Reset Watchdog
Powerdown
Porta = &B00001000
Portb = &B00000000
Reset Watchdog
Powerdown
Porta = &B00000000
Portb = &B00000001
Reset Watchdog
Powerdown
Porta = &B00000000
Portb = &B00000010
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
C:
Porta = &B10000001
Portb = &B00000110
Reset Watchdog
Powerdown
Portb = 0
Porta = 0
Return
End
Daten:
Data "Start"
Data "5" , "2" , " " , "1" , "1" , " " , "1" , "2" , "3" , " "
Data "1" , "0" , " " , "1" , "2" , " " , "1" , "2" , "3" , "Start"
Data "S" , "X"
Daten2:
Data "Start"
Data "C" , "1" , "Start" , "W"
Data "C" , "1" , "Start" ,
Data "X"
Ich hoffe ihr könnt ihr mir helfen
Danke