RS422 mit ATmega128 und Winavr

May 04, 2006 2 Replies

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


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

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 ^`~'^

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required