Hallo danke für die Hilfe hat leider nicht den gewünschten Erflog gebracht !!
Hallo danke für die Hilfe hat leider nicht den gewünschten Erflog gebracht !!
Geändert von hunikuni (02.06.2012 um 21:18 Uhr)
Ich weiß zwar nicht ob darin das Problem liegt, aber in diesem Teils des Codes fallen zwei Dinge auf:
1. Wenn Du in der ersten Zeile die Variable Hallimpuls auf 0 setzt, brauchst D zwei Zeilen später nicht abzufragen, ob sie auch tatsächlich 0 istCode:Led: Hallimpuls = 0 On Int0 Zaehlen If Hallimpuls = 0 Then Toggle Portd.1
(das ist aber nur ein "Schönheitsfehler" und dürfte keine Fehlfunktionen nach sich ziehen)
2. Das Statement "On Int0 Zaehlen" sollte vor die Hauptschleife, denn es muss nur ein einziges mal deklariert werden, welche ISR beim entsprechenden Interrupt ausgeführt werden soll.
Wenn Du damit erreichen wolltest dass der Interrupt0 als solches aktiviert werden soll, wäre "Enable Int0" der richtige Befehl. Erst nach dieser Anweisung ist der Interrupt "scharf".
Außerdem sehe ich das gleiche Problem wie Tido: Das Unterprogramm LED wird nach jeweils 10 Hallsensor-Impulsen gleich wieder aufs neue ausgeführt, weil die Bedingung "Stunde = 0 und Minute = 1 (bzw. 3) ja weiterhin erfüllt ist.
Dank für die Antwort.
Ich dachte Timer läuft weiter und Bedingung Stunde = 0 Minute =1 bzw 3 ist nur einmal erfüllt ist.Außerdem sehe ich das gleiche Problem wie Tido: Das Unterprogramm LED wird nach jeweils 10 Hallsensor-Impulsen gleich wieder aufs neue ausgeführt, weil die Bedingung "Stunde = 0 und Minute = 1 (bzw. 3) ja weiterhin erfüllt ist
Natürlich ist die Bedingung nur "einmal" erfüllt -aber das für eine ganze Minute lang! Und während dieser Zeit wird die Hautschleife schätzungsweise ein paar Millionen male durchlaufen, und jedes mal wird das Unterprogramm ausgeführt!
Und der Timer läuft sowieso weiter...
Danke, aber dann müsste das Led sofort wieder anfangen zu leuchten und nicht aus bleiben ??? Habe ja das Problem dass es ausgeht und nach der definierten Zeit ( hier 3. Minute )nicht wieder an geht !! Oder habe ich einen Denkfehler ??? Werde wahrscheinlich umdrehungsabhängige Motorenabschaltung aufgeben und zeitgesteuterte verwenden.
Das wäre aber schade, denn (fast) jede Aufgabe lässt sich in Bascom realisieren!Werde wahrscheinlich umdrehungsabhängige Motorenabschaltung aufgeben
Vielleicht beschreibst Du nochmal etwas genauer, was denn genau passieren soll? Bislang ist zwar von einem Motor, dann aber wieder von an- und ausgehenden LEDs die Rede - und die Bedeutung der 1 und 2 Minuten (die manchmal ja auch 3 sein können) erschließt sich auch noch nicht so ganz...
Ich will einen Uhrenbeweger steuern. D.h. Die Uhren brauchen eine bestimmte Anzahl an Umdrehungen z.B 650/ Tag in ca. 6 Drehperioden zeitlich unregelmässig aufgeteilt über den Tag. Z.B. Stunde 00 Minute 1 - Motor starten 108 Umdrehungen Motor aus. Dann z.B. Stunde = 3 Minute = 0 Motor an 108 Umdrehungen Motor aus . Stunde = 4 Minute = 8 ........ Danke für Deine Mühe !!!
Ausserdem sollte er auch noch die Drehrichtung Nach jeder Periode, als Periode 1 108* links . Periode 2 108* rechts usw. Wahrscheinlich für einen Anfänger wie mich zu komplex. Wollte zweite sub mit anderer Drehrichtung schreiben.
Das gezeigte Verhalten rührt daher, da die LED nicht über Reset im Else-Zweig ausgeschaltet wird, sondern über Toggle, da nach 10 Impulsen die Sub verlassen, aber sofort erneut angesprungen wird. Bei diesem zweiten Mal wird also die LED ausgeschaltet. Da aber wahrscheinlich dann keine Hallimpulse mehr kommen, hängt es von da an in der Do/Loop und kann natürlich auch nicht auf die dritte Minute reagieren. Du kannst das überprüfen, indem Du nach Ablauf der ersten Minute genügend Hallimpulse erzeugst, damit die Loop verlassen wird. Danach wirst Du sehen, dass die LED bei Minute 3 angeht. Der Fehler wäre Dir einfacher klar geworden, wenn Du statt Toggle ein Set verwendet hättest.
Danke für eure Mithilfe. Ich Glaube jetzt funktionietrs. Habe folgende Ergänzungen und Umstellungen vogenommen:
Code:'Bascom Hallsensor test $regfile = "m328pdef.dat" $crystal = 20000000 'Quarzfrequenz $hwstack = 32 $framesize = 64 $swstack = 32 On Int0 Zaehlen 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 And Sekunde = 0 Then Gosub Led ' 2. Minute If Stunde = 0 And Minute = 3 And Sekunde = 1 Then Gosub Led Loop Led: Hallimpuls = 0 If Hallimpuls = 0 Then Portd.1 = 1 Do Idle Loop Until Hallimpuls = 10 Else Portd.1 = 0 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
Dank eurer Tips scheint es zu funktionieren !!![]()
Lesezeichen