Werbung
so hoff ich hab dich richtig verstanden
int0 routine in der schleife!
und init fürn interrupt is auch wieder drinnen
----------------------
also fürs verständnis bei programmstart wird der interrupt sozusagen freigeschalten bzw initaliert damit er überhaupt anwählbar ist
und in der schleife wird er immer abgefragt
aber wird er jetzt immer abgefragt?!
dachte int0 gibt bei jedem signal selbst zur int0 routine weils ja ein interrupt ist?!
könnt ja dann auch gleich nen eingang die ganze zeit abfragen und erhöhen lassen oder ist das zu unsicher bezüglich der frequenz?!
---------------------
mfgCode:$regfile = "m8def.dat" $baud = 9600 $crystal = 8000000 Config Pinb.1 = Input Config Pinb.2 = Output Dim Irq0 As Word Irq0 = 0 On Int0 Irq0 Enable Int0 Config Int0 = Rising Enable Interrupts Do Irq0: Incr Irq0 Return Abfrage: 'hier wird abgefragt ob eine taste gedrückt ist If Pinb.1 = 1 Then ' wenn pinb.1 gedrückt dann in die Rauf routine Goto Rauf Else Reset Pinb.2 Goto Abfrage End If Rauf: Set Pinb.2 'motor fährt rauf If Irq0 > 800 Then Reset Pinb.2 'wenn 800 impulse ereicht sind dann stop TIMER0 Else Goto Rauf End If Loop
Und geht das Program im Simulator? Schätze mal nicht ausprobiert.
Wenn ich Prozessor bin, starte ich in der ersten Zeile, laufe weiter komme dann irgendwie auf die Routine :
Do
Irq0:
Incr Irq0
Return
Nur, wohin soll ich dann springen wenn ich Return gefunden habe, Return bedeutet: springe zurück an die nächste Anweisung nach dem Aufruf, (steht im Stack), nur mich hat niemand aufgerufen, also steht nichts im Stack.....
also stop ich die Prorammausführung, bzw springe nach Nirwana...
deshalb gehört die IRQ-Routine, wie alle Unterprogramme hinter, bzw. nach dem Hauptprogram im Code
aber mach dich nicht fertig, das übt, und das vergißt man dann auch nicht so schnell wieder.![]()
ok stimmt return ist das fehl am platz
war da glaub ich zu schnell
jetzt müsst der interrupt aber funktionieren?!Code:$regfile = "m8def.dat" $baud = 9600 $crystal = 8000000 Config Pinb.1 = Input Config Pinb.2 = Output Dim Irq0 As Word Irq0 = 0 On Int0 Irq0 Enable Int0 Config Int0 = Rising Enable Interrupts Do Irq0: Incr Irq0 Abfrage: 'hier wird abgefragt ob eine taste gedrückt ist If Pinb.1 = 1 Then ' wenn pinb.1 gedrückt dann in die Rauf routine Goto Rauf Else Reset Pinb.2 Goto Abfrage End If Rauf: Set Pinb.2 'motor fährt rauf If Irq0 > 800 Then Reset Pinb.2 'wenn 800 impulse ereicht sind dann stop TIMER0 Else Goto Rauf End If Loop
noch ne frage die ich vorher vergessen hab
wo simulierst du das ganze
gibts da ein eigenes programm oder geht das auch mit Bascom
wo ich dann taster und zb leds für die ausgänger hab?!
großes dank an euch!!!
mfg
Nee, Return ist schon nicht schlechtDie Interuptroutine steht insgesamt falsch.
Den Simulator findest du als 4tes Icon neben dem Fernglas.
Das ist das Werkzeug schlechthin, das mußt du benutzen, läuft es im Simulator, läuft es auch im wirklichem Leben, meistens.
Beachte: Ports, LCD usw findest du oben in der Zusatzauswahl. Damit mußt du dich auskennen lernen.
Schonmal aufgemerkt: Ports nur in den grünen LED's betätigen, und das Ergebniss dessen, nur im Einzelschritt ist "DIRECKT" im Sprungverhalten des Codes erkennbar.
So, das mußt du erst einmal ausprobieren. Nimm aber Codes die funktionieren, sonst verwirt dich noch ALLES.
Simulator ist ein MUSS, das Werkzeug schlechthin !!!!
hy ich nochmals
hab schon wieder das gefühl einen funktionstüchtigen code produziert zu haben, hab mich nochmal im datenblatt schlau gemacht
hab mal die ein/ausgänge auf die pinc verlegt
und pind2 also int0 (was eh so is, aber bisschen neu)
hab alle teile vom code übersichtlichkeitshalber total getrennt, is glaub ich so einfacher & richtiger?!
hab das ganze auch getestet springt richtig
also vom programmablauf richtig
meine einzige sorge der irq0:
also bei jeden interrupt also impuls auf pind.2 erhöht irq0 um 1 bis irq0 800 erreicht hat und springt zum sprung halt!? würd das so passen?!
hier mal der aktuelle code
Code:$regfile = "m8def.dat" $baud = 9600 $crystal = 8000000 Config Pinc.1 = Input Config Pinc.2 = Output Config Pind.2 = Input Dim Irq0 As Word '' Interrupt Int0 config On Int0 Irq0 Config Int0 = Rising Enable Int0 Enable Interrupts Do ''abfrage ob taste gedrückt Abfrage: If Pinc.1 = 1 Then Goto Rauf Else Goto Halt End If Loop '' bei interrupt auf pinb.2 dann erhöhen bis 800 erreicht ist Irq0: Incr Irq0 If Irq0 > 800 Then Goto Halt Else Goto Rauf End If '' wenn 800 impulse ereicht dann motor stopp Halt: Reset Pinc.2 Return '' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft weiter Rauf: Set Pinc.2 Return![]()
danke fürs durchschauen
eventuell werd ich das ganze für die funktion runter morgen erweitern.
Simulator benutzt? ----> dann hättest du Fehler bemerkt.
Setze mal vor '' wenn 800 impulse ereicht dann motor stop
ein Return
und
ersetze mal Goto mit Gosub
dann läuft das Program wenigstens, ob es deine Aufgabe richtig abarbeitet:::![]()
![]()
Simulieren Simulieren
Nachtrag:
Habe mal durchsimuliert, IRQ0 >1 gesagt, funzt, nur würde ich diesen Vergleich in die Hauptschleife legen, und nicht in die IRQ-Routine zumal die Variable ja auch nirgendwo wieder zu 0 gemacht wird.
schau mir das ganze nochmal an
aber bei goto hat der simulater bei mir zumindest funktioniert und is vom hauptprogramm in die rauf oder halt routine gesprungen?!
oder hab ich was falsch gmacht
bei timer hab ich nicht wirklich gwußt wie ich den testen kann
gibt es dafür ne abhilfe in bascom?!
mfg
piri
Dein Programm hat aber nur einen Durchlauf gemacht und ist dann stehen geblieben. Normalerweise muss ein Programm in einem Microcontroller eigentlich immer irgend etwas machen und sollte nie stehen bleiben.Zitat von lowtzow
Ein Return-Befehl macht übrigens nur nach einem Gosub einen Sinn, nicht nach einem Goto.
danke an die vielen nützlichen zeit, hab in kürzerster zeit schon eine menge über Bascom & mega8 gelernt)))
hab das programm nochmals ein wenig verändert, und zwar hab ich mir den tipp mit irq abfrage ins hauptmenü zu herzen genommen, macht eigentlich auch mehrs sinn das der mega8 ständigt schaut ob 800 impulse erreicht sind und nicht nur nach einem int0 impuls
hier mal version neu
hab es auch simuliert, hat zwar einige zeit gedauert bis ich die sache mit int0 simulieren draußen hatte, aber! es funktioniert!Code:$regfile = "m8def.dat" $baud = 9600 $crystal = 8000000 Config Pinc.1 = Input Config Pinc.2 = Output Config Pind.2 = Input Dim Irq0 As Word '' Interrupt Int0 config On Int0 Irq0 Config Int0 = Rising Enable Int0 Enable Interrupts Do ''abfrage ob taste gedrückt & Kontrolle ob irq0 noch nicht über 800 Abfrage: If Pinc.1 = 1 Then Gosub Rauf Else End If If Irq0 > 800 Then Gosub Halt End If Loop '' bei Int0 wird irq0 um 1 erhöht Irq0: Incr Irq0 Return '' wenn 800 impulse ereicht dann motor stopp Halt: Reset Pinc.2 Irq0 = 0 Return '' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft weiter Rauf: Set Pinc.2 Return
hab es testweise 800 durch 5 ersetzt und siehe da es funktioniert nach den impulsen wird irq0 gesetzt sonst is ja blöd wenn irq0 ins endlose zählt und nach tastendruck immer gleich wieder stopt.
so werd mich demnächst ans zamstöpseln der teile machen
motor mit gabellichtschranke & mega8 hab ich ja schon
muss mir nur anschaun wie ich die teile am besten beschalte
mfg
piri
Lesezeichen