Hallo,
ich benötige Hilfe bei meinem kleinen Programm.
Das soll folgende Funktion haben:
Sobald Licht auf den LDR fällt, soll der Portb.3 für 3 sec auf
1 Signal gehen, danach 5 sec Pause, bevor der Port b.0 auch
für 3 sec auf 1 Signal geht.
Anschließend soll für 10 min nichts passieren, (im Programm hier
nur für 20sec. Pause zum testen).
Anschließend sollen dann noch einmal die Ausgänge wie oben schalten.
Im Prinzip läuft das Programm, aber mit den Zeiten komme ich nicht
klar. Obwohl ich die Zeiten noch erhöht habe, ändert sich die Zeit
an den Ausgängen nicht wirklich.
Außerdem möchte ich Zwangsimpuls raushaben. Leider weiß ich nicht,
welche Stelle ich da wirklich anfassen muß. Ich habe jetzt den Zähler
in der Schleife einfach auf Null gesetzt.
Die Hardware ist ähnlich wie beim reaktivem Licht, nur sitzt anstelle der
LED ein 2,5 Volt Relais.
Ich würde mich echt freuen, wenn einer sich das Programm mal
anschauen würde.

Danke und Gruß
Markus
Code:
' µC: ATtiny13V
' +Ub: 3,00 V
' I: 17 µA im Leerlauf (Nachtbetrieb)
' I: 5 µA bei Tagabschaltung
' Reichweite: 650 m mit Maglite 5D
'
'============================================================
$regfile = "ATtiny13.DAT"
$crystal = 16000 'Frequenz des internen Oszillators
$hwstack = 22 'hardwarestack herabsetzen damit genügend variablen zur verfügung stehen
Config Adc = Single , Prescaler = Auto
Config Portb = &B00001001 'Pinb.0 Und 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 = 50 '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 Ldr As Integer '0 = Dunkel, 1023 = Hell
Dim Alt As Integer
Dim Merker As Integer
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 Blinken '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
Blinken: 'Ansteuerung Signale zum Gerät
Portb.3 = 1 'Gerät 1 Ein Signal
Waitms 3000 'für 3000ms
Portb.3 = 0
Waitms 5000 '5000ms Pause
Portb.0 = 1 'Gerät 2 Start Signal
Waitms 3000 ' für 3000ms
Portb.0 = 0
Waitms 4000 ' 20 sec. Pause
Waitms 4000
Waitms 4000
Waitms 4000
Waitms 4000
Portb.0 = 1 'Gerät 1 Aus Signal
Waitms 3000 'für 1000ms
Portb.0 = 0
Waitms 9000 '9000ms Pause
Portb.3 = 1 'Gerät 2 Aus Signal
Waitms 3000 ' für 3000ms
Portb.3 = 0
Reset Watchdog
Powerdown
Alt = 1023 'Doppelauslösung verhindern
Return
Pause:
Wdtcr = &B11110001 'Watchdog auf 8 Sekunden stellen
Reset Watchdog
Powerdown
Wdtcr = &B11010011 'Watchdog wieder auf 0,125 Sekunden zurückstellen
Schlafzaehler = Schlafzaehler + 0 'merken wie oft Schlafmodus durchlaufen wurde
If Schlafzaehler = Zwangsimpuls Then 'als Funktionskontrolle tagsüber LED auslösen
Reset Watchdog
Powerdown
Schlafzaehler = 0
End If
Return
End