Forum: Mikrocontroller und Digitale Elektronik PIC18f4550 USART


von Steff (Gast)


Lesenswert?

Hallo,
habe versucht mit meinem Pic 18f4550 über RS232 zu senden und bekomm es 
trotz vieler anleitungen und datenblätter nicht hin vielleicht kann mir 
hier einer helfen!!!

Ich habe ein OLIMEX Board mit 20MHz Quartz und Programmer.
Ich kann meine uart sim. über MPLAB aber nach dem es auf dem Chip ist 
nicht empfangen.

Hier mal der code:

#include <p18cxxx.h>


#pragma config FOSC = HS //Osci
#pragma config PWRT=ON //Power-up timer
#pragma config WDT=OFF //watchdogtimer
#pragma config PBADEN=ON //POTRB A/D Eingänge
#pragma config LVP=OFF // Single Supply ICSP
#pragma config ICPRT = ON //ICPORT enabled
#pragma config BOR = OFF

#define TAKT 20000000
#define BAUD 9600

unsigned char ch='a';

void InitUsart(void) {


  TRISCbits.TRISC6 = 1;//RC6 als Eingang,TX senden


  TRISCbits.TRISC7 = 1;//RC7 als Eingang,RX empfangen
  // Für Empfang
  RCSTA = 0b10010000; //Seriell ein,8Bit,dauerbetrieb

  // Senden
  TXSTA = 0b00100100;//8Bit,async,hohe Baudr.


  SPBRG = TAKT/(16*BAUD)-1;//Taktrate aus Baudratenregister


}
void  WriteByte(unsigned char byte) {

  // warten bis register leer
  while(!PIR1bits.TXIF);

  // senden
  TXREG = byte;

}


Vielleicht sieht jemand meinen Fehler... habe den rest des Programms 
weggelassen weil dort nur endlos in die WriteByte funktion gesprungen 
wird...

Danke
Steff

von Severino R. (severino)


Lesenswert?

Steff schrieb:

>   TRISCbits.TRISC6 = 1;//RC6 als Eingang,TX senden

Müsste wohl ein Ausgang sein, zum Senden.

von Timo P. (latissimo)


Lesenswert?

Würd ich auch sagen.

Wobei :

TRISCbits.TRISC6 = 1;//RC6 als Eingang,TX senden

eine ziemlich wirr aussehende Zeile ist. Wie wäre es mit:

TRISC |= 0b.01000000;

oder

TRISC |= (1<<6);

von Steff (Gast)


Lesenswert?

Danke für die Antworten.

Im Datenblatt steht
bit SPEN (RCSTA<7>) must be set (= 1)
bit TRISC<7> must be set (= 1)
bit TRISC<6> must be set (= 1)

Die Beschreibung der PINs habe ich aus einem Buch für PIC 18 
Programmierung... hierbei kann man die Bits einzeln aufrufen... auch 
hier steht beide müssen auf 1 stehen.

von Timo P. (latissimo)


Lesenswert?

Läuft das Programm, ich meine hast du einen Heartbeat programmiert?

Ne LED oder nen oszi dran und du siehst ob der code läuft. Dann am 
besten den Heartbeat in der Senderoutine unterbringen, so siehst du, ob 
der code wenigstens richtig ausgeführt wird.
Dann ist es wohl die configuration der UART.


Oder simulierst du AUSSCHLIEßLICH?
Wenn du die Möglichkeit hast, den Controller zu flashen, TU ES!

von Steff (Gast)


Lesenswert?

Ja ich habe eine statusLED ich sehe auch wenn ich verzögerung rein nehme 
das er immer wieder in die sendefunktion springt.


Mir ist aufgefallen das mein TRISC sich nach dem ausführen von
RCSTA = 0b10000100;
auf 0x80 ändert, dann ist aber TRISC6 = 0 und nicht 1....
finde aber nichts darüber im datenblatt...

von Zwirbeljupp (Gast)


Lesenswert?

> Mir ist aufgefallen das mein TRISC sich nach dem ausführen von
> RCSTA = 0b10000100;
> auf 0x80 ändert, dann ist aber TRISC6 = 0 und nicht 1....
Logisch, denn das EUSART-Modul wird den Pin C6 automatisch als Ausgang 
konfigurieren.

> finde aber nichts darüber im datenblatt...
Seite 239:
"Note: The EUSART control will automatically
reconfigure the pin from input to output as
needed."

Schreib doch mal testweise statt der Baudratenberechnungsformel die 
konkreten Werte in die Register. In Deinem Fall müsste das wie folgt 
aussehen:
SPBRG = 129;
SPBRGH = 0;

Wenn es aber ohnehin in der SIM läuft, könnte es dann auch ein 
Hardware-Problem sein? Schonmal an RC6 ein Oszi drangehalten?

von Steff (Gast)


Lesenswert?

Ok danke für die Antworten !!!

Werde mal in die UNI laufen und das probieren. Habe schon probiert deci 
statt der Formel zu nehmen oder hex in binär werte zu ändern aber da es 
an den Inhalten der Register nichts ändert kann es wohl nur noch ein 
Fehler auf der Platine sein.
Habe mir extra ein Board gekauft da mit ich nicht selber beim Löten 
Fehler mache aber man ist leider nich sicher....

von Steff (Gast)


Lesenswert?

Problem gelöst ...kann geschlossen werden :)

Beschriftungsfehler auf dem Board, da her RX und TX vertauscht
Pic hält externen Osci für 48MHz und nicht für 20MHz -> PLL richtig 
einstellen

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.