Forum: Mikrocontroller und Digitale Elektronik ARM LPC2134 Uart Empfangsprobleme


von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

Hallo,
ich arbeite mit einem LPC2134 mit einer RS485-Schnittstelle.
Habe Probleme mit void receive():Bei Emfang von Byte leuchtet die
receive-Lämchen nicht, d.h. das Byte nicht empangen wird.
void transmit(void) funktioniert.
Ideen?
Vielen Dank imm Voraus.

Mit dieser Zuweisung wird doch aus dem UART Byte geholt und damit auch
gelesen. Also das Lämchen muss doch kurz aufleuchten.  (x = U0RBR);
Auf dem Modul sind UARTS ich sende von einem zum anderem über RS485



/*************** System Initialization ***************/

void Initialize (void)
{
  PINSEL0  =  0x00050005;    /*Enable TxD1,TxD0,RxD1,RxD0*/
  IODIR0  =  0x10400410;    /*OUT: RTS0_P0.4, RTS1_P0.14,
COM1_P0.22,COM0_P0.28*/
  IOSET0  =  0x10400010;    /*LOW auf 0 COM = 0(RS485), RTS0=0(Sender)*/
  IOCLR0  =  0x00000000;    /*HIGH auf 1 RTS1=1(Empfänger)*/

  U1LCR    =  0x83;    /*8 bits, 1 stopbit, no Parity, enable DLAB*/
  U1DLM    =  0x01;    /*9600 Baud Rate, 55.296.000 PCLK*/
  U1DLL    =  0x68;    /*360dez=0x0168*/
  U1LCR    =  0x03;    /*disable DLAB*/
  U1FCR    =  0x01;    /*enable UART1-FIFO*/

  U0LCR    =  0x83;    /*8 bits, 1 stopbit, no Parity, enable DLAB*/
  U0DLM    =  0x01;    /*9600 Baud Rate, 55.296.000 PCLK*/
  U0DLL    =  0x68;    /*360dez=0x0168*/
  U0LCR    =  0x03;    /*disable DLAB*/
  U0FCR    =  0x01;    /*enable UART1-FIFO*/
}



/* Write character to Serial Port    */

void transmit(void)              /*while ist eine Warteschleife*/
{
     while (!(U1LSR & 0x20));
    (U1THR = 0x89);
}

/* Read character from Serial Port    */

unsigned char x;

void receive(void)
{
  while ((U0LSR & 0x01));
   (x = U0RBR);

}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was soll "das Receive-Lämchen" sein?

Warum verwendest du gleich zwei serielle Schnittstellen?

Das solltest Du Dir nochmal ansehen:
1
void transmit(void)              /*while ist eine Warteschleife*/
2
{
3
     while (!(U1LSR & 0x20));
4
    (U1THR = 0x89);
5
}

Diese Funktion gibt immer denselben Wert aus, ist das sinnvoll? Was 
sollen die Klammern um die Zeile mit der Zuweisung an U1THR?

Deine "Empfangsroutine" ist auch merkwürdig; warum wird das empfangene 
Zeichen in einer globalen Variablen abgelegt und nicht als Rückgabewert 
zurückgegeben?

von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

Danke für die schnelle Antwort
Ich bin ein Anfänger und arbeite mich ein. Das Lämpchen leuchtet denke 
ich wenn was versand bzw. empfangen wird. Vielleicht ist auch irgendein 
Port falsche gesetzt. Ich fins nicht.

Ich sende Zeichen von UART1 und empfange dieses Zeichen auf UART0.

void transmit(void)
{
     while (!(U1LSR & 0x20));
    U1THR = 0x89;
}

so die Klammern sind weg.
Ich will auch nur ein Zeichen senden und mit dem anderem UART empfangen.

meinst du so?
void receive(void)
{
  while ((U0LSR & 0x01));
   return (U0RBR);

}
allerdings bekomme ich von Keil uVersion folgende Meldung:
Initialize.c(58): error:  #118: a void function may not return a value

von Sergey S. (Firma: ARM LPC2134, uVision3, in C) (serik00)


Lesenswert?

hat sich erledigt.

ich habe die PINS falsch gesetzt:

  IOSET0  =  0x10400010;    /*LOW auf 0 COM = 0(RS485), RTS0=0(Sender)*/
  IOCLR0  =  0x00000000;    /*HIGH auf 1 RTS1=1(Empfänger)*/


richtig wäre:
  IOCLR0  =  0x10400010;
  IOSET0  =  0x00000400;

von gast (Gast)


Lesenswert?

I würde umbedingt mal ein C Tutorial lesen


meinst du so?
void receive(void)
{
  while ((U0LSR & 0x01));
   return (U0RBR);

}
allerdings bekomme ich von Keil uVersion folgende Meldung:
Initialize.c(58): error:  #118: a void function may not return a value



dann wird das klar sein.

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.