Forum: Mikrocontroller und Digitale Elektronik Bascom Unterbrechung Befehl


von Rene (Gast)


Lesenswert?

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.

von Dirk M. (avr-nix)


Lesenswert?

INT0, INT1 und andere bei AVR ATMEGA ab 8

von Ulrich (Gast)


Lesenswert?

das Stichwort nennt sich Interupt.

von Rene (Gast)


Lesenswert?

Danke , noch eine Frage, wie würde dann das ganze prgrammiert werden ?

If INT0 = 1 Then ?

von Dirk M. (avr-nix)


Lesenswert?

BASCOM Hilfe - Index-> suche nach INT0 oder Config INT0 und schaue dir
die Beispiele an.
Noch ein TIP: www.rowalt.de

von Hannes L. (hannes)


Lesenswert?

Man kann auch während des Alarms Eingänge "pollen" und darauf
reagieren.

...

von Paul (Gast)


Lesenswert?

...on event....

von Togger (Gast)


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

von Rene (Gast)


Lesenswert?

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 ?

von Rene (Gast)


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.

von Hannes L. (hannes)


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.

...

von Rene (Gast)


Lesenswert?

Wie binde ich das in meine Prozedur ein ? Das wäre ganau das was ich
suche

von Dirk M. (avr-nix)


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

von Rene (Gast)


Lesenswert?

ok, vielen Dank !

von Tino (Gast)


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 ?

von Hannes L. (hannes)


Lesenswert?

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

...

von Peter D. (peda)


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

von Tino (Gast)


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.

von Peter Dannegger (Gast)


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

von Tino (Gast)


Lesenswert?

Der SW-UART läuft erst wenn er abgefragt wird.
Da liegt auch mein Problem.

von Tino (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.