www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom Unterbrechung Befehl


Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk Milewski (avr-nix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
INT0, INT1 und andere bei AVR ATMEGA ab 8

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das Stichwort nennt sich Interupt.

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke , noch eine Frage, wie würde dann das ganze prgrammiert werden ?

If INT0 = 1 Then ?

Autor: Dirk Milewski (avr-nix)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...on event....

Autor: Togger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Rene (Gast)
Datum:

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

Autor: Dirk Milewski (avr-nix)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, vielen Dank !

Autor: Tino (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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).

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tino (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tino (Gast)
Datum:

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

Autor: Tino (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab es geschafft und den Fehler gefunden der bei Inkey gestört hat.

Die Anzeigen auf dem LCD haben zuviel Zeit gekostet.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.