Forum: Compiler & IDEs USART/RS 485-Problem


von xy342 (Gast)


Lesenswert?

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?

von 2ter Gast (Gast)


Lesenswert?

Da dein Code noch nicht alles zeigt, was man wissen müsste, kann man nur 
raten...

a) Ist sichergestellt dass beide (uC und PC) nicht gleichzeitig 
versuchen (siehe b)) zu senden? (Ist die Datei größer als NUM_BYTES)

b) Ich kenne die Hardware nicht, aber die RS485-Transceiver, die ich 
kenne, bzw. benutze haben Pin zum Auswählen, ob gesendet oder empfangen 
werden soll ( du initialisierst ja 3 io pin für die Kommunikation...). 
Wenn dem so ist macht das deine USART nicht für dich. Das muss du dann 
selber machen.

von 2ter Gast (Gast)


Lesenswert?

xy342 schrieb:
> mittles USB to USART-Kabel

Und hätte ich fast überlesen, ein USB to rs485 Kabel wäre auch nicht 
verkehrt :-).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.