Forum: Mikrocontroller und Digitale Elektronik PIC USART: rcreg leer


von Dario A. (v-d)


Lesenswert?

Hallo

Ich möchte Zeichen vom PC auf den PIC übertragen und da an LED's 
ausgeben.
Leider ist das RCREG Register immer leer.

Weiss jemand weiter?

Freundliche Grüsse und Danke



#include <pic18.h>


void init (void)
{
  /* PortE (X4) */

  TRISE=0x00;          // PORTE = Output (Data Direction Register)
  LATE=0x00;          // Data Outpt Register
  PORTE=0x00;          // Clear PORTE

  /* PortC (X7) */

  TRISC=0xFF;          // PORTC = Input

  /* PortF (X2) */

  TRISF=0xFF;          // PORTF = Input

  /* Init USART */

  SYNC=0;            // asynchronous mode
  SPEN=1;            // set serial port enable bit
  BRGH=1;            //
  BRG16=1;          // enable BRGH
  SPBRG=520;          // Baudrate = 19200

  /* USART reception */

  RCIE=1;            // enables the USART receive Interrupt
  RX9=0;            // 8bit
  CREN=1;            // continuos receive enable bit

  /* USART transmission */

  TXIE=1;            // enables the USART transmit Interrupt
  TXEN=1;            // continuos receive enable bit

  /* Interrupts */

  PEIE=1;            // enable Peripheral Interrupt
  GIE=1;            // enable all Interrupts
}


void main (void)
{
  init();
  while(1);

}


void interrupt isr (void)
{

  GIE=0;            // disable all Interrtupts

  if (RCIF)
  {
    PORTE=RCREG;        // USART value to output

  }

  GIE=1;            // enable all Interrupts
}

von picbastler (Gast)


Lesenswert?

SPBRG=520;          // Baudrate = 19200
kommt mir komisch vor. Ich dachte, das wäre nur 8 Bit groß.

von dario a. (Gast)


Lesenswert?

noch was: der Interrupt wird ausgeführt. dies kann ich überprüfen wenn 
ich im Interrupt eine Zahl anstelle von RCREG rausschreibe..

von dario a. (Gast)


Lesenswert?

ist im datenblatt des PIC18f6680 so ersichtlich.auf seite 237.
und das signal habe ich auch mit dem K.O. gemessen.. bei einer Baudrate 
von 19200 ergibt sich eine zeit von 52us.

Der Fehler muss irgendwo im RCREG liegen..

von picbastler (Gast)


Lesenswert?

Das ist ja schon mal ne heiße Spur. Jetzt könntest du untersuchen, 
welches Flag gesetzt ist, und ggf. warum.

von dario a. (Gast)


Lesenswert?

Das RCIF Flag muss ja gesetzt sein damit der Interrupt ausgeführt wird.
Welche anderen Flags können dann RCREG noch beeinflussen?

von dario a (Gast)


Lesenswert?

mit der baudrate ist auch alles in Ordnung.

noch weitere Ideen?!

von Zwirbeljupp (Gast)


Lesenswert?

Wenn Du an einem Port den Zustand der Pins ändern möchtest, solltes Du 
grundsätzlich das LATx-Register beschreiben.

von Zwirbeljupp (Gast)


Lesenswert?

Ach nochwas:
warum sendest Du im Interrupt das empfangene Zeichen nicht einfach 
zurück an den PC? Dann siehst Du doch sofort, wo es hakt.

von dario a. (Gast)


Lesenswert?

du meinst das RCREG ins TXREG schreiben oder wie?

von dario a. (Gast)


Lesenswert?

habs zurück an den PC gesendet und erhalte immer EXAKT das, was ich 
sende.

der fehler muss beim RCREG liegen, kann ihn mir aber nicht erklären..

von Zwirbeljupp (Gast)


Lesenswert?

> du meinst das RCREG ins TXREG schreiben oder wie?
Super Idee, oder nich?

Aber:
> mit der baudrate ist auch alles in Ordnung.
> ist im datenblatt des PIC18f6680 so ersichtlich.auf seite 237.
Das sehe ich anders.
Du hast einen 8-Bit-PIC, Du kannst also keinen 16-Bit-Register mit einem 
Schwung beschreiben (es sei denn, Dein Compiler, den wir nicht kennen, 
bietet hier ein Macro). Das Baudratenregister ist aber ein 
16-Bit-Register (bestehend aus SPBRG und SPBRGH), also solltest Du die 
520 auch entsprechend gerecht auf beide Register aufteilen.

Solltest Du den C18 verwenden, so ist SPBRG definitiv als 8-Bit-Register 
definiert und von den 520 werden nur die ersten 8 Bit in SPBRG 
übernommen.
Auszug aus p18f6680.h:
1
extern volatile near unsigned char       SPBRG;

von Dario A. (v-d)


Angehängte Dateien:

Lesenswert?

Zwirbeljupp schrieb:
>> du meinst das RCREG ins TXREG schreiben oder wie?
> Super Idee, oder nich?
>
> Aber:
>> mit der baudrate ist auch alles in Ordnung.
>> ist im datenblatt des PIC18f6680 so ersichtlich.auf seite 237.
> Das sehe ich anders.
> Du hast einen 8-Bit-PIC, Du kannst also keinen 16-Bit-Register mit einem
> Schwung beschreiben (es sei denn, Dein Compiler, den wir nicht kennen,
> bietet hier ein Macro). Das Baudratenregister ist aber ein
> 16-Bit-Register (bestehend aus SPBRG und SPBRGH), also solltest Du die
> 520 auch entsprechend gerecht auf beide Register aufteilen.
>
> Solltest Du den C18 verwenden, so ist SPBRG definitiv als 8-Bit-Register
> definiert und von den 520 werden nur die ersten 8 Bit in SPBRG
> übernommen.
> Auszug aus p18f6680.h:
>
1
> extern volatile near unsigned char       SPBRG;
2
>

danke für deine antwort

da hast du recht. ja ich verwende den C18.habs jetzt aufgeteilt,
aber es hat auch vorher funktioniert, habs ja mit dem KO gemessen.

bei einer Baudrate von 19200--> t=1/baudrate=52us


auf dem bild sieht man schön wie die Daten übertragen werden.


und auch das rücksenden funktionert(auch mit dem KO gemessen)

nur das ausgeben der Daten an dem Port funktioniert nicht.

von Dario A. (v-d)


Lesenswert?

es funktioniert!

habe das RCREG ausgelesen und direkt zurückgesendet,
somit war dann nichts mehr im RCREG als ich es ein zweites mal auslesen 
wollte um am Port auszugeben =)

vielen dank an alle

Gruss und einen schönen Abend

von Maik W. (werner01)


Lesenswert?

dreh doch mal PORTE=RCREG um und mach mal RCREG=LATE draus?

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.