Bascom Unterbrechung Befehl

Gast #231269
Lesenswert?

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
Gast #231271
Lesenswert?

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.
#231272
Lesenswert?

"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.

...
#231274
Lesenswert?

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
Gast #231276
Lesenswert?

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 ?
#231278
Lesenswert?

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
Gast #231279
Lesenswert?

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.
Gast #231280
Lesenswert?

@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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren