Hallo, ich benötige einen Befehl, der es ermöglicht, eine Prozedur in Bascom noch während der Abarbeitung zu verlassen sobald sich eine Bedingung ( Eingang ) geändert hat. Hintergrund: Alarmanlage die ich während des Alarm jederzeit unterbrechen möchte.
Danke , noch eine Frage, wie würde dann das ganze prgrammiert werden ? If INT0 = 1 Then ?
BASCOM Hilfe - Index-> suche nach INT0 oder Config INT0 und schaue dir die Beispiele an. Noch ein TIP: www.rowalt.de
Man kann auch während des Alarms Eingänge "pollen" und darauf reagieren. ...
Hi Rene, wenn ich dich richtig verstehe, dann suchst du einen Befehl der dir den Abbruch einer Schleife bzw. eines Unterprogramms ermöglicht!? Stichwort ist: EXIT Es gibt "Exit Do", "Exit For" .... Schau mal in die Bascom Hilfe, da ist es erklärt. lg Ralf
Interrupt kenne ich schon, aber bei Bascom stehe diesbezüglich nichts im Index sonst würde ich hier bestimmt nicht fragen . Aber von "pollen" hab ich noch nichts gehört. Befehl ?
Hallo Ralf, erstmal danke ! Die Prozedur ist simpel: Sie läuft genau 30s durch und springt dann wieder ins Hauptprogramm. Aber ich möchte während dieser Prozedur einen Eingang bzw. eine Variable immer abfragen um diese (den Alarm) sofort zu beenden.
"Pollen" ist regelmäßiges Abfragen eines Zustandes innerhalb eines Programms. Es ist das Gegenteil vom "Wecken lassen" via Interrupt. Pollen bzw. Polling ist also kein "reserviertes Schlüsselwort" einer Programmiersprache, sondern eine Vorgehensweise sich ändernde Zustände per Programm zu erfassen. ...
Wie binde ich das in meine Prozedur ein ? Das wäre ganau das was ich suche
Help->index->index-> on intx und config intx Ausschitt Example: Enable Interrupts Enable Int0 'enable the interrupt On Int0 Label2 Nosave 'jump to label2 on INT0 Do 'endless loop nop Loop End Label2: Dim A As Byte If A > 1 Then Return 'generates a RET because it is inside a condition End If Return 'generates a RETI because it is the first RETURN Return 'generates a RET because it is the second RETURN
Mich plagt ein ähnliches Problem. Ich möchte einen Inputbefehl abbrechen wenn ein Pin geändert wird und wieder ins Hauptprogramm zurückkehren. Den Interupt will ich jetzt probieren aber ich komme nicht damit klar was mit den Subroutinen geschieht. Ich springe ja von Eingabeunterprogramm in die Iterruproutine und will von dort wieder ins Hauptprogramm springen. Meine Meinung ist das ich da noch irgendwas machen muß denn 2x Gosub ohne 2xReturn dürfte doch irgendwo einen Stapel zum ü+berlaufen bringen oder irre ich da ?
Warum willst du INPUT abbrechen?? Prüfe doch lieber vorher die U(S)ART, ob ein neues Byte vorhanden ist und lies es nur ein, wenn es auch da ist. Dafür hat die U(S)ART doch die entsprechenden Steuerbits (siehe Datenblatt). ...
Das Problem bei der µC-Programmierung ist ja, daß man dort kein Multitasking-OS hat. D.h. wenn man irgendwo auf etwas wartet, dann wird dort auch echte CPU-Zeit vernichtet und kein anderer Prozeß kann was machen. Die Lösung ist daher, alle Funktionen abweisend zu programmieren. Also nicht: warte bis das Ereignis eintritt. sondern: solange das Ereignis noch nicht eingetreten ist, gehe zurück zur Mainloop. Wenn man so programmiert, gibt es plötzlich gar keine derartigen Probleme mehr. Man hat dann einfach entsprechende Routinen, die erst dann weitermachen, wenn das gewünschte Ereignis eingetreten ist. Und solange keines der Ereignissse eintritt, ruft die Mainloop sie ständig hintereinander auf. Im Prinzip ist das Polling und man kann so auf beliebig viele Ereignisse pollen. Ist das Ereignis eine Zeit, die ablaufen soll, nimmt man dafür einen Timerinterrupt (z.B. 1ms), der dann die Zeitvariable runterzählt bis sie auf 0 ist, d.h. es sind auch beliebig viele Zeitvariablen möglich. Wichtig ist nur, daß man es konsequent macht, d.h. auch wirklich an jeder Wartestelle, damit nirgendwo die CPU verhungern kann. Hat eine Funktion mehrere Wartestellen, läßt man einfach ein Zählbyte mitlaufen, damit dann beim nächsten Durchlauf genau an die richtige Wartestelle verzweigt werden kann. In C gibts für Verzweigungen z.B. die switch-Anweisung. Peter
Da stimme ich dir voll zu aber mit einem Tiny26 und Softuart ist das nicht einfach. Mit Inkey komme ich zwar Programtechnisch super hin aber es gehen Zeichen verloren wenn ich jedes einzeln einlesen will. Nehme ich dagegen einen Input dann kommen alle Zeichen an aber ich kann die Routine nicht mehr verlassen. Vorher nachsehen bringt mir nichts denn ich muß 14 Zeichen am Stück übertragen und ohne Puffer könnte ich mittendrinn hängen bleiben. Ich bin mit allem Fertig nur komme ich einfach nicht aus dem Input hinaus. Hab schon daran gedacht den Interrupt so zu nutzen das der Chip einfach neu gestartet wird wenn man den Stecker rauszieht aber da bin ich auch noch nicht soweit das ich es verstehe.
@Tino, dazu müßte man wissen, wie unter Bascom eine SW-UART programmiert ist. Wenn es da eine Endloswarteschleife auf das Startbit ist, d.h. ohne Interrupts, dann hast Du schlechte Karten und mußt es selber machen. Für einen SW-UART-Receiver braucht man den Capture-Interrupt, um den Beginn des Startbits zu erkennen und dann einen Compare-Interrupt, um die einzelnen Bits abzufragen. Den anderen Compare-Interrupt nimmt man für den Transmitter. Dann kann man in den Interrupts auch noch Puffer einrichten und dann mit einem Flag der Mainloop signalisieren, daß etwas empfangen wurde, bzw. das Senden fertig ist. Bei hohen Baudraten müssen die Interrupts aber wohl in Assembler geschrieben werden. Peter
Der SW-UART läuft erst wenn er abgefragt wird. Da liegt auch mein Problem.
Ich hab es geschafft und den Fehler gefunden der bei Inkey gestört hat. Die Anzeigen auf dem LCD haben zuviel Zeit gekostet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.