www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC USART: rcreg leer


Autor: Dario A. (v-d)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: picbastler (Gast)
Datum:

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

Autor: dario a. (Gast)
Datum:

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

Autor: dario a. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: picbastler (Gast)
Datum:

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

Autor: dario a. (Gast)
Datum:

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

Autor: dario a (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit der baudrate ist auch alles in Ordnung.

noch weitere Ideen?!

Autor: Zwirbeljupp (Gast)
Datum:

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

Autor: Zwirbeljupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dario a. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du meinst das RCREG ins TXREG schreiben oder wie?

Autor: dario a. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Zwirbeljupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
extern volatile near unsigned char       SPBRG;

Autor: Dario A. (v-d)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
>
> extern volatile near unsigned char       SPBRG;
> 

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.

Autor: Dario A. (v-d)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maik Werner (werner01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dreh doch mal PORTE=RCREG um und mach mal RCREG=LATE draus?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.