Hallo!
Ich möchte über einen AXmega X128A1 (auf einem CrumbX128A1-Modul)
einzelne Zeichen, welche ich über USB (mittles USB to USART-Kabel) an
den mC schicke, mit den im C-File definierten Zeichen vergleichen und
bei Gleichheit über RS 485 diese Zeichen an den PC weiterschicken.
Das Vergleichen der Zeichen funktioniert (LED leuchtet), allerdings
bekomme ich beim Auslesen der über RS 485 zurückgeschickten Zeichen ein
falsches über PuTTY angezeigt (für z.B. 'A' ein '_').
Wenn ich über Python die RS 485 auslese, bekomme ich für 'A' ein '\x00'.
Verwendet wird AVRStudio 4.
Hier die Initialisierung des RS 485 USART:
1 | //**********************************************************************
|
2 | //USART RS485 (PORT E)
|
3 | //**********************************************************************
|
4 | // PD3 (TX) as output
|
5 | USART_PORT_485.DIRSET = PIN3_bm;
|
6 |
|
7 | USART_PORT_485.DIRSET = PIN1_bm;
|
8 | USART_PORT_485.OUTSET = PIN1_bm;
|
9 |
|
10 | // PD2 (RX) as input
|
11 | USART_PORT_485.DIRCLR = PIN2_bm;
|
12 |
|
13 |
|
14 | // Use USARTE0 and initialize buffers
|
15 | USART_InterruptDriver_Initialize(&USART_data_485, &USART_485, USART_DREINTLVL_LO_gc);
|
16 |
|
17 | // USARTE0, 8 Data bits, No Parity, 1 Stop bit
|
18 | USART_Format_Set(USART_data_485.usart, USART_CHSIZE_8BIT_gc,
|
19 | USART_PMODE_DISABLED_gc, false);
|
20 |
|
21 | // Enable RXC interrupt
|
22 | USART_RxdInterruptLevel_Set(USART_data_485.usart, USART_RXCINTLVL_LO_gc);
|
23 |
|
24 | // Baudrate select = (1/(16*(((I/O clock frequency)/Baudrate)-1)
|
25 | // = 12
|
26 |
|
27 | USART_Baudrate_Set(&USART_485, 12 , 0);
|
28 |
|
29 | /* Enable both RX and TX. */
|
30 | USART_Rx_Enable(USART_data_485.usart);
|
31 | USART_Tx_Enable(USART_data_485.usart);
|
und hier die while(1)-Schleife:
1 | i = 0;
|
2 | while(1)
|
3 | {
|
4 | while (i < NUM_BYTES)
|
5 | {
|
6 | if (USART_RXBufferData_Available(&USART_data))
|
7 | {
|
8 | receiveArray[i] = USART_RXBuffer_GetByte(&USART_data);
|
9 | i++;
|
10 | }
|
11 | }
|
12 |
|
13 | // Test to see if sent data equals received data
|
14 |
|
15 | TransferError = false;
|
16 | for(i = 0; i < NUM_BYTES; i++)
|
17 | {
|
18 | if (receiveArray[i] != sendArray[i])
|
19 | {
|
20 | TransferError = true;
|
21 | }
|
22 | }
|
23 |
|
24 | if(TransferError)
|
25 | {
|
26 | // No light
|
27 | LEDPORT.OUT = 0xFF;
|
28 | }
|
29 | else
|
30 | {
|
31 | for (int i=0; i<NUM_BYTES; i++)
|
32 | {
|
33 | while( (USART_485.STATUS & USART_DREIF_bm) == 0 ) {}
|
34 | USART_485.DATA = receiveArray[i];
|
35 | }
|
36 |
|
37 | // Light
|
38 | LEDPORT.OUT = 0x00;
|
39 | }
|
40 | }
|
Hat jemand nen Tipp?