www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA16 UART Interrupt künstlich auslösen


Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich verwende den ATMEGA16. Nun möchte ich das Senden von Daten über die 
serielle Schnittstelle zum Computer per Interrupt lösen. Die zu 
sendenden Daten lege ich in einem Buffer ab. Sobald Daten in diesem 
Buffer sind, möchte ich den Interrupt aktivieren.
Das Problem ist nun, dass ich (bis anhin) zuerst "von Hand" ein Byte 
schreibe (mit UDR = 5;) und erst dann wird der erste Intrrupt ausgelöst. 
(ist ja auch logisch).
Meine frage ist nun, kann ich denn Interrupt selber (also 
softwaremässig) auslösen? Mein erster Ansatz war, im UCSRA das TXC Bit 
zu setzen, das funktioniert aber nicht, da es nur gelöscht werden kann.
mit freundlichen Grüssen
chrigu

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

In Assembler wäre eine Möglichkeit , die Interruptroutine beim ersten 
mal per 'call' aufzurufen. Aber es sieht nicht so aus, als ob du in 
Assembler programmierst.

MfG Spess

Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein ich programmiere in C ;)

Autor: Thomas L. (tom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine Vorgehensweise ist nicht ganz logisch.
Du legst also Daten in einem Buffer ab, was hindert dich darauf, sofort 
die Daten rauszuschreiben, sobald sie vorliegen?
Wann ist denn der Zeitpunkt an dem du "den IRQ aktivieren" möchtest? 
Zeitlich gesteuert?

Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Daten sollen sofort raus. Aber damit ein Interrupt ausgelöst wird, 
muss 1 Byte gesendet werden (soweit mein Wissensstand zur Zeit ist). Mit 
anderen Worten: wenn ich den Interrupt aktiviere, dann werden noch keine 
Daten gesendet, da kein Interrupt ausgelöst werden kann.
Muss ich jetzt manuell das erste Byte senden damit dann der Rest der 
Interrupt übernimmt?
mfg
chrigu

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst das Bit UDRE nicht zu setzten, es ist nach dem Reset schon 
gesetzt.

Und wenn Du das letzte Byte sendest, disablest Du den Interrupt, dann 
ist es fürs nächste Senden auch gesetzt.

Das macht jeder so.


Peter

Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das wird möglicherweise das Problem sein. Denn ich verwende den TX 
Complete Interrupt, und nicht den USART Data Register Emtpy Interrupt.
Leider verstehe ich den unterschied auch nicht ganz!

Autor: Thomas Finke (thomas-hn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> In Assembler wäre eine Möglichkeit , die Interruptroutine beim ersten
> mal per 'call' aufzurufen.

Alternativ könntest Du den Inhalt der ISR nicht direkt in diese 
schreiben, sondern in eine Funktion welche in der ISR aufgerufen wird. 
Diese Funktion kannst du nämlich dann auch von Hand aufrufen.

Gruß,

Thomas

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@OP:
Schau dir mal die Lib von http://jump.to/fleury (UART-Lib für AVR-GCC) 
an.
Da geht es so:
- Immer wenn Daten zum senden in den Puffer geschrieben werden, wird 
der UDRE-Interrupt aktiviert.
- die UDRE-ISR schaut jedes mal nach, ob noch mehr gesendet werden soll:
  - wenn ja: wird das Byte ins UDR geschrieben
  - wenn nicht: wird der UDRE interrupt abgeschaltet
( Optional : der TXC-Interrupt kann anschließend z.b. bei 
Halb-duplex den sender abstellen )

hth. Jörg

Autor: chrigu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jörg,
du hast den Knoten in meinem Knopf gelöst, ich war einfach auf der 
falschen Fährte!
mfg
chrigu

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.