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