-
Finde Fehler nicht
Hallo ich habe kleines Bascom Progamm geschrieben und finde den Fehler nicht. Ich habe an ein Baby Orangutanboard einen Hallsensot an Int0 angeschlossen. Nach Minute 1 fängt LED zu leuchten an und schaltet wie gewünscht nach 10 Sensorimpulsen ab. Das LED sollte aber nach Minute 2 wieder anfangen zu leuchten, aber hier liegt das Problem. Bin Anfänger und befürchte ich habe eien Denkfehler. Ausserden ist die Timereistellung auch noch nicht richt , eine Minute dauert mit dieser Einstellung nur ca 30 sec. Aber das ist nicht so wild :confused::confused:
Code:
'Bascom Hallsensor test
$regfile = "m328pdef.dat"
$crystal = 20000000 'Quarzfrequenz
$hwstack = 32
$framesize = 64
$swstack = 32
Config Pind.1 = Output
'Timer und der Teiler festlegen 10ms
Config Timer0 = Timer , Prescale = 1024
On Timer0 Timer_irq
Const Timervorgabe = 175
Config Int0 = Rising
Enable Int0
Enable Interrupts
Dim Hallimpuls As Integer
Dim Cnt As Byte
Dim Sekunde As Byte
Dim Minute As Byte
Dim Stunde As Byte
Dim Sekunde_last As Byte
Hallimpuls = 0
Stunde = 0
Minute = 0
Sekunde = 0
Enable Timer0
Do
' 1. Minute
If Stunde = 0 And Minute = 1 Then Gosub Led
' 2. Minute
If Stunde = 0 And Minute = 3 Then Gosub Led
Loop
Led:
Hallimpuls = 0
On Int0 Zaehlen
If Hallimpuls = 0 Then
Toggle Portd.1
Do
Idle
Loop Until Hallimpuls = 10
Else
Reset Portd.1
End If
Return
Zaehlen:
Incr Hallimpuls
Return
Timer_irq:
Timer0 = Timervorgabe
Incr Cnt
If Cnt = 50 Then
Portb.6 = 0
End If
If Cnt = 100 Then
Portb.6 = 1
Sekunde = Sekunde + 1
If Sekunde = 60 Then
Sekunde = 0
Minute = Minute + 1
If Minute = 60 Then
Minute = 0
Stunde = Stunde + 1
If Stunde = 24 Then
Stunde = 0
End If
End If
End If
Cnt = 0
End If
Return
Ich hoffe jemand kann mir helfen !!!
-
Zitat:
Zitat von
hunikuni
Code:
' 1. Minute
If Stunde = 0 And Minute = 1 Then Gosub Led
' 2. Minute
If Stunde = 0 And Minute = 3 Then Gosub Led
Minute = 3 ???
Punkt 2: Ersetz mal:
If Cnt = 100 Then durch If Cnt = 200 Then
-
Danke für die schnelle Antwort !! cnt auf 200 funktioniert gut. Aber mein Hauptproblem, daß das Led nach 2 Minuten nicht wieder das Leuchten beginnt besteht weiter. !!!
-
Du schreibst ja auch if minute = 3 und nicht if minute= 2...
-
Hab ich auch auf 2 geändert, fängt aber weder nach 2 noch nach 3 Minuten an zu leuchten.
-
Das liegt daran, dass dein Programm in der 2. Do-Loop-Schleife hängt.
Erklärung folgt:
Nach deinen 10 Impulsen wird die Sub LED verlassen. Da deine Bedingung "if stunde=0 and minute=1" im nächsten Programmdurchlauf wieder war ist, springt er wieder zu LED.
Dort macht er dir mit "toggle LED" die LED aus und wartet auf 10 Impulse (die die ihm nicht gibst, da du auf minute=2 wartest).
-
Versuch mal:
Code:
'Bascom Hallsensor test
$regfile = "m328pdef.dat"
$crystal = 20000000 'Quarzfrequenz
$hwstack = 32
$framesize = 64
$swstack = 32
Config Pind.1 = Output
'Timer und der Teiler festlegen 10ms
Config Timer0 = Timer , Prescale = 1024
On Timer0 Timer_irq
Const Timervorgabe = 175
Config Int0 = Rising
Enable Int0
Enable Interrupts
Dim Hallimpuls As Integer
Dim Cnt As Byte
Dim Sekunde As Byte
Dim Minute As Byte
Dim Stunde As Byte
Dim Sekunde_last As Byte
Dim Minute_last as Byte
Hallimpuls = 0
Stunde = 0
Minute = 0
Sekunde = 0
Enable Timer0
Do
If Stunde = 0 And Minute <> Minute_last Then Gosub Led
Loop
Led:
Hallimpuls = 0
Portd.1 = 1'LED an
On Int0 Zaehlen
Do
Idle
Loop Until Hallimpuls = 10
Portd.1 = 0'LED aus
minute_last = minute
Return
Zaehlen:
Incr Hallimpuls
Return
Timer_irq:
Timer0 = Timervorgabe
Incr Cnt
If Cnt = 50 Then
Portb.6 = 0
End If
If Cnt = 100 Then
Portb.6 = 1
Sekunde = Sekunde + 1
If Sekunde = 60 Then
Sekunde = 0
Minute = Minute + 1
If Minute = 60 Then
Minute = 0
Stunde = Stunde + 1
If Stunde = 24 Then
Stunde = 0
End If
End If
End If
Cnt = 0
End If
Return
Löst zwar wahrscheinlich dein Problem, hat aber weitere Fallstricke.
-
Danke werd ich morgen ausprobieren. Wollte aber am ende der Entwicklung Motoren zu einer bestimmten Zeit (z.B 1h23m)einschalten und nach einer Bestimmten Anzahl an Umdrehungen ( z.B. 20) wieder ausschalten, nach einer bestimmten Zeit ( z.B. 3h56) wieder einschalten und nach 20 Umdrehungen wieder ausschalten usw...
-
Dann setz dir in der Sub ne Variable auf 1 und lösche sie in der irq wieder, wenn sich die minute ändert. Und den "gosub" führst du nur aus wenn variable=0. So ist sichergestellt, dass die sub nur einmal pro minute aufgerufen wird.
-
Hallo danke für die Hilfe hat leider nicht den gewünschten Erflog gebracht !!