RS422 mit ATmega128 und Winavr

Hallo,

hab da mal eine kleine Verständnisfrage.

Wenn ich bei einer RS422 Schnittstelle den TX nach dem Senden des letzten Bytes meines Datentelegramms deaktivieren will, muss ich das in

Signal (SIG_UART0_TRANS)

oder in

Signal (SIG_UART0_DATA)

machen?

In iom128.h finde ich folgende Tabelle:

... #define SIG_UART0_RECV _VECTOR(18) #define SIG_UART0_DATA _VECTOR(19) #define SIG_UART0_TRANS _VECTOR(20) ...

Im Atmega128 Handbuch steht:

Vector No. 19: USART0, RX USART0 RX complete Vector No. 20: USART0, UDRE USART0 Date Register empty Vector No. 21: USART0, TX USART0 TX complete

im Handbuch wird RESET als Vektor 0 gezählt, in iom128.h fehlt RESET und Vektor 0 ist der INT0 Vektor. Soweit klar, wenn auch etwas verwirrend.

Ich habe nun ein Programm, bei dem die Empfangsroutine folgendermaßen beginnt:

SIGNAL (SIG_UART0_RECV) // Receive-Interrupt { char zeichen; zeichen = UDR0; ... }

Das Programm scheint soweit einwandfrei zu funktionieren.

Die Senderoutine sieht folgendermaßen aus:

SIGNAL (SIG_UART0_TRANS) { // wenn Daten im Buffer sind, ein Byte auf UART0 schreiben if (txdata0.leseindex != txdata0.schreibindex) // wenn Buffer nicht leer UDR0 = txdata0.data[txdata0.leseindex++]; // ein Byte ausgeben und Index inc. else txdata0.leseindex = txdata0.schreibindex = 0; // wenn Buffer leer, beide Indexe auf 0 }

Soweit funktioniert alles einwandfrei. Mein Problem ist nun aber, dass ich nach dem Senden des letzten Bytes den Bustreiber MAX485 für den TX der RS422 Schnittstelle wieder deaktivieren muss. So wie ich das verstehe, kann ich das in SIG_UART0_TRANS machen, wenn ich keine Daten mehr in UDR0 schreiben kann, weil dieser INT ausgelöst wird, wenn der Sender gesendet hat und UDR0 leer ist. Dann wäre es aber ja sinnvoll, die Daten nicht in SIG_UART0_TRANS in UDR0 zu schreiben, sondern in SIG_UDR0_DATA. Oder gibt es da noch einen Pferdefuss?

Gruß

Stefan

Reply to
Stefan Brröring
Loading thread data ...

Stefan Brröring schrieb:

Ja, so macht man es auch normalerweise. Kannst ja auch mal in die UART Lib von Peter Fleury schauen:

formatting link
Gruß Andy

Reply to
Andreas Weber

Hallo Stefan,

Sollte man bei der Entwicklung neuer Programme meiden. Ab AVR-Libc Version 1.4 (Seit Januar in den aktuellen WinAVR Distributionen enthalten) ist die Syntax für Interrupt-Routinen geändert:

A new set of interrupt vector names has been added, where the base name itself is closely derived from Atmel's datasheets and XML files, with _vect appended. E.g. the former SIG_INTERRUPT0 now became INT0_vect. The old names are still available, but their use for new projects is discouraged.

formatting link

Gruß,

Daniel

--
  .~.    Daniel Schramm     Phone: +492316108112  Mail:daniel.schramm@gmx.de
  /V\    Max-Planck-Str. 20 Mobile:+491788839848  ICQ: 35816985
 // \\   44536 Lünen        Fax:   +4923196989961 WWW: pinguin.sauerland.de
/(   )\  Germany
 ^`~'^
Reply to
Daniel Schramm

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.