Hallo,
hier mal etwas Code.
Zuerst die Version mit TXC-IRQ, welche einwandfrei funktioniert:
1 | #define COM_C1 USARTC1 // USART1 von PORTC wird als Interface Bus1
|
2 |
|
3 |
|
4 | mstr_send; // Receive OFF, Sender ON, Datenrichtung=Senden
|
5 | uart_send_cnt = 6; // Anzahl zu sendender zeichen
|
6 | uart_cnt = 0; // Zeichenzähler
|
7 |
|
8 | USART_PutChar(&COM_PB, uart_buffer[uart_cnt++]); // Sende 1.char
|
9 | USART_TxdInterruptLevel_Set(&COM_C1, USART_TXCINTLVL_HI_gc); // Trans-IRO scharf machen
|
10 | ...
|
11 |
|
12 | ...
|
13 | ISR (USARTC1_TXC_vect) // Send IRQ
|
14 | {
|
15 | if (uart_cnt < uart_send_cnt) // Alles gesendet?
|
16 | USART_PutChar(&COM_C1, uart_buffer[uart_cnt++]); // TX Buffer fuellen
|
17 |
|
18 | else{
|
19 | PORTC.OUTCLR = PIN5_bm; // RS485 Datenrichtung Empfang
|
20 | USART_Tx_Disable(&COM_C1); // TX_disable
|
21 | }
|
22 | }
|
Jetzt mit DRE-IRQ, welches nur einmal funktioniert. Dabei sollte immer
wenn das Datenregister leer ist was eingetragen werden und am Schluß
wird dann der TXC-IRQ scharf gemacht, was die RS485-Datenrichtung
umschaltet und den Sender abschaltet.
1 | #define COM_C1 USARTC1 // USART1 von PORTC wird als Interface Bus1
|
2 |
|
3 |
|
4 | mstr_send; // Receive OFF, Sender ON, Datenrichtung=Senden
|
5 | uart_send_cnt = 6; // Anzahl zu sendender zeichen
|
6 | uart_cnt = 0; // Zeichenzähler
|
7 |
|
8 | USART_DreInterruptLevel_Set(&COM_C1, USART_DREINTLVL_HI_gc); // Trans-IRO scharf machen
|
9 |
|
10 | ISR (USARTC1_DRE_vect) // Send IRQ
|
11 | {
|
12 | if (uart_cnt < uart_send_cnt) // Alles gesendet?
|
13 | USART_PutChar(&COM_C1, uart_buffer[uart_cnt++]); // TX Buffer fuellen
|
14 |
|
15 | else{
|
16 | USART_DreInterruptLevel_Set(&COM_C1, USART_DREINTLVL_OFF_gc); // DRE-IRQ sperren
|
17 | USART_TxdInterruptLevel_Set(&COM_C1, USART_TXCINTLVL_HI_gc); // Trans-IRO scharf machen
|
18 | }
|
19 | }
|
20 |
|
21 | ISR (USARTC1_TXC_vect) // Ende des senden
|
22 | {
|
23 | PORTC.OUTCLR = PIN5_bm; // RS485 Datenrichtung Empfang
|
24 | USART_Tx_Disable(&COM_C1); // TX_disable
|
25 | }
|
Also wie gesagt die erste Lösung arbeitet (bis auf die kleinen)
Verzögerungnen durch andere IRQ-Bearbeitung.
Die DRE-Lösung tut es nur bei erstenmal nach einem Reset, danach sendet
der µC nichts mehr????
Ich habe spaßeshalber mal ein Senden im Pollbetrieb gemacht, mit dem
gleichen Ergbnis.
Grüße
Hans-Josef