www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18f4550 USART


Autor: Steff (Gast)
Datum:

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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steff schrieb:

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

Müsste wohl ein Ausgang sein, zum Senden.

Autor: Timo P. (latissimo)
Datum:

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

Autor: Steff (Gast)
Datum:

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

Autor: Timo P. (latissimo)
Datum:

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

Autor: Steff (Gast)
Datum:

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

Autor: Zwirbeljupp (Gast)
Datum:

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

Autor: Steff (Gast)
Datum:

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

Autor: Steff (Gast)
Datum:

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

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.