mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage zu seriellem Interrupt


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich bin ein ziemlicher Anfänger zum Thema AVR-Programmierung. Ich will
ein kleines Testprogramm zum seriellen Interrupt schreiben, doch es
funzt nicht. Immer wenn ich Daten sende, bleibt er im Interrupt hängen
(wie Endlosschleife). Muss ich irgendwas spezielles senden, oder wie
geht das genau? Gibt es vielleicht ein Tutorial zu diesem Thema?

Ich verwende einen ATmega8 in Verbindung mit Bascom.

Hier das kleine Programm, das ich verwende:

$regfile = "m8def.dat"
$crystal = 4000000
$baud = 19200

Dim I As Byte

Ddrb = &B11111111

On Urxc Test
Enable Urxc
Enable Interrupts

I = 0
Portb = 255

Do
I = I + 1

Loop

Test:
  Print I
  Print "OK"
Return


Vielen Dank für Eure Hilfe!!

mfg
Andy

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, dass das Verwenden des UART-Sendeinterrupts nur Sinn macht,
wenn man die Ausgabe über einen Sende-Ringbuffer organisiert. Dann ist
der Interrupt (UDRE) hilfreich, um (ohne Verzögerung) das nächste Byte
aus dem Sende-Ringbuffer ins UDR zu schreiben.
Mit dem TXC-Interrupt kann man dann UART deaktivieren, da jetzt auch
das letzte Bit der Übertragung raus ist.

Ich selbst nutze diese (TX-) Interrupts aber nicht, da die UART-Ausgabe
bei mir mit über den LCD-Treiber erfolgt und somit vom Timer-Interrupt
erledigt wird.
(http://www.hanneslux.de/avr/stopuhr/index.html)

Auch der Empfangs-Interrupt (RXC) macht nur in Verbindung mit einem
Empfangs-Ringbuffer Sinn. Im RXC-Interrupt kopiert man nur das
empfangene Byte in den Empfangsbuffer und teilt dem Hauptprogramm durch
setzen einer Boolschen Variable mit, dass neue Daten da sind.

Ich kann mir aber nicht vorstellen, dass all diese UART-Unterrupts
unter BASCOM sinvoll verwendet werden können, dazu ist der
BASCOM-Programmierer viel zu weit von der Hardware entfernt. Um das zu
nutzen, müsstest du schon auf C oder besser ASM umsteigen.

...

Autor: Andy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Danke für die Antwort.
Ich habe nun ein Beispielprogramm im Bascom-Ordner gefunden mit dem
ser. Interrupt. Dieses funktioniert zwar, ich habe aber noch eine
Frage:
Und zwar habe ich ein Lauflicht programmiert, bei dem man über RS232
die Geschwindigkeit ändern kann. Nur habe ich das Problem, dass bei dem
Programm mit dem Interrupt nur das letzte Zeichen, dass über die
Serielle gesendet wurde angenommen wird. Wenn ich z.B. 45ms einstelle,
kommt nur der 5er an, d.h. es werden 5ms eingestellt. Dann habe ich das
Programm ohne Interrupt probiert; da kommt die ganze Zahl an.
Ich will aber nicht ohne Interrupt arbeiten, da ich sonst immer das
Schleifenende abwarten muss, bevor die neue Geschwindigkeit übernommen
wird.

Ich habe beide Dateien angehängt.

Ich danke schon im Voraus für eure Hilfe!!!!


mfg
Andy

Autor: Andy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, habe die falsche Datei erwischt.

Autor: Andy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und hier die zweite Datei

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
- Du nutzt die Variable P für die Wartezeit.
- P ist als Integer deklariert, hat also den Wertebereich von 16 Bit.
- Die Übertragung der Werte über UART erfolgt aber in ASCII.
- Dabei kann eine Zahl 1..5 Ziffern lang sein.
- Du brauchst also eine Kennung, an der das Ende der Ziffernfolge
  erkannt wird.
- Dazu bietet sich das Steuerzeichen für 'nächste Zeile' an, also
  chr$(13) oder chr$(13)+Chr$(10)
- Du kannst also deinen String solange mit Ziffern füllen, bis das
  Steuerzeichen auftritt, dann den String zur Zahl umwandeln (VAL
  sieht zwar sehr einfach aus, beschert dem AVR aber eine Menge
  Arbeit), als Wartezeit P übernehmen und den String löschen.

...

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.