Forum: Mikrocontroller und Digitale Elektronik PIC18F USART Problem


von Walter F. (Firma: SPS) (iwfm)


Lesenswert?

Hallo Zusammen,
Ich hänge nun schon den 3ten Tag an meinem USART Problem des PIF18F24 
und bin am verzweifeln. Ich habe recht viel Erfahrung mit uControllern 
aber jetzt stehe ich am "Schlauch".

Meine PIC24F Testumgebung:
MPLAB, ICD3, ext. 16MHz Oscillator
Alles läuft soweit einwandfrei, kann auch an den Port Pins wakeln.


MEIN PROBLEM LIEGT BEIM USART (1):
- Habe die notwendige Initialisierung mindestens 10 mal peinlich genau 
kontrolliert und dabei auch unterschiedliche Beispiele aus www studiert:

Die Initialisierung
TXSTA1:    TXEN=1, TX9=0, SYNCH=0, BRGH=1
RCSTA1:    SPEN=1
BAUDCON1:  0x40
SPBRG1:    0x8A

NICHTS GEHT RAUS. Das TRMT (Transmit Emty) zeigt nur vor dem ersten 
Beschreiben des TXREG1 "Emty" an, dann nicht mehr.
An der TX1 Leitung rührt sich natürlich auch nichts.

Wer hat ein ähnliches Problem erlebt?
Kann mir jemand weiter helfen?

Vielen Dank
Walter

von Chris B. (dekatz)


Lesenswert?

Walter F. schrieb:
> an meinem USART Problem des PIF18F24

Welcher PIC den genau? PIC18F24 gibt es mehrere...
PIC18F24K20, PIC18F24K22, PIC18F24J50, PIC18F24J11,....

Walter F. schrieb:
> Meine PIC24F Testumgebung:

PIC24 wäre aber eine ganz andere "Baustelle"!?

von Walter F. (Firma: SPS) (iwfm)


Lesenswert?

Hallo Chris,
habe mich vertan. Ursprünglich wollte ich einen PIC24F einsetzten. Ich 
brauche aber dessen Performance nicht. Deshalb verfalle ich automatisch 
mal in die Vergangenheit. Programmiere gerne Assembler, der klopft mir 
dann immer so schön auf die Finger.....

Also es ist ein PIC18F26K22. Ansonsten bin ich ganz begeistert von den 
Features; mein erster PIC.

Viele Grüße aus München
Walter

von B. S. (bestucki)


Lesenswert?

Läuft der PIC soweit oder sind die Configuration Bits falsch eingestellt 
(Watchdog eingeschaltet, falscher Oszillator ausgewählt). Wurde der 
Tx-Pin auch als Ausgang konfiguriert?
Ich habe gerade erst gestern Nacht eine UART-Bibliothek in C für PIC18 
Controller geschrieben. Kann dir noch ein paar Infos geben wenn ich 
wieder zu Hause bin.

PS: Poste doch mal deinen Code, dann geht die Fehlersuche schneller.

von Walter F. (Firma: SPS) (iwfm)


Angehängte Dateien:

Lesenswert?

Hallo be stucki,
vielen Dank für Deine Antwort.
Blöde Frage von mir: bestückst Du auch?

Die Quelldatei im Anhang, hoffentlich klappt es.
Die DO´s arbeiten einwandfrei.

Habe ne lange Nacht gehabt, Doku gewälzt usw.
Muss was saublödes sein. Ich schätze das hängt an meiner noch immer 
mangelhaften System-Struktur-Kenntnissen mit dem PIC zusammen.

Bin so froh wenn ich da weiterkomme!

Viele Grüße aus München
Walter

von Chris B. (dekatz)


Lesenswert?

LoadBaudRateReg1
    MOVLW   H'00'
    MOVWF  SPBRGH1
    MOVLW  H'8A'
    MOVWF  SPBRG1    ;Baud Rate Generator for 115.200 Baud
LoadBaudRateContrReg1
    MOVLW   B'01000000'
    MOVWF  BAUDCON1

Also SPBRGH1:SPBRG = 0x008a = 138, der passt zu den Tabellen 16.5 für 
115.2kb, SYNC=0, BRGH1=1, BRG16=1 - OK

BAUDCON1 initialisierst du mit B'01000000' - also ist dort BRG16=0, 
sollte aber 1 sein !

Die ganze CONFIG-Geschichte habe ich jetzt nicht nachgelesen was da 
Default-Einstellungen sind.
Damit das ganze auch wirklich mit 64MHz läuft, würde ich auf jeden Fall 
die PLL definitv einschalten (OSCTUNE.PLLEN = 1).

(habe leider keinen passenden Chip hier um das zu testen)

von Chris B. (dekatz)


Lesenswert?

btw: Um Klarheiten bezüglich der Konfiguration des Kontrollers zu 
bekommen, soll/kann man die Templates von MICROCHIP verwenden (z.B. 
18F26K20TEMP.ASM) und diese anpassen und mit eigenem Code "füllen".
Dort sind die CONFIG-Register vorgegeben (welche man gegebenfalls 
anpasst), Grundprogramm für Interruptvektoren mit der notwendigen 
Registersicherung/Wiederherstellung, etc...

Eine Angabe wie:

MOVLW   B'00001111'
MOVWF  30001H

sagt mir NICHTS und ist nebenbei eine eher ungewöhliche Art und Weise!
Nachsehen im DB hilft natürlich weiter. Nur gibt es da noch ein Dutzend 
weitere CONFIG-Register und welchen Defaultwert haben diese??

Oder wurden ein paar CONFIG-Register von der IDE aus eingestellt, wenn 
ja, woher soll man das wissen wenn nicht dokumentiert ;-)

von B. S. (bestucki)


Lesenswert?

Walter F. schrieb:
> Blöde Frage von mir: bestückst Du auch?
Nur meine eigenen Leiterplatten :)

Hier mal einen Teil meines Codes:
1
void UARTinit(void){
2
  SPBRG=0x0A; // 115.2kBaud bei fosc=20MHz (effektiv 113.6kBaud)
3
  TXSTAbits.BRGH=1; // High speed mode
4
  TXSTAbits.SYNC=0; // Asynchronous mode
5
  RCSTAbits.SPEN=1; // Enable serial port
6
  TXSTAbits.TXEN=1; // Enable transmit
7
}
8
9
10
void UARTsend(uint8_t data){
11
  while(!TXSTAbits.TRMT);
12
  TXREG=data;
13
}

Der Code läuft momentan auf einem PIC18F452, sollte aber auch für andere 
PIC18 funktionieren. Beim Initialisieren der USART sollte (muss evt. 
sogar?) eine bestimmte Reihenfolge eingehalten werden, wie die einzelnen 
Register beschrieben werden. Dies steht irgendwo im Datenblatt in einem 
grauen Kasten im Kapitel USART (hab die Seitenzahl vergessen).

Chris B. schrieb:
> Die ganze CONFIG-Geschichte habe ich jetzt nicht nachgelesen was da
> Default-Einstellungen sind.
Wenn du die Configuration-Bits meinst:
- Oszillator auf RC
- Watchdog eingeschaltet auf 1:128
- VBOR eingeschaltet auf 2V
Um so die wichtigsten zu nennen.

Alle anderen Register im Controller werden standardmässig mit 0 
initialisiert, es gibt jedoch aus Ausnahmen die mit 1 initialisiert 
werden (z.B. TRIS-Register) oder undefiniert sind. Grundsätzlich so, 
dass jegliche Peripherie ausgeschatet ist und du nichts kaputt machen 
kannst. Steht alles im Datenblatt.

von B. S. (bestucki)


Lesenswert?

Nachtrag:
Hab gerade deine I/O Konfiguration angeschaut (TRIS-Register). Setze den 
Tx-Pin (RC6) auf Ausgang. Ohne jetzt nachgelesen zu haben behaupte ich 
mal, dass die Richtung nicht von der USART definiert wird.

von Walter F. (Firma: SPS) (iwfm)


Lesenswert?

Hi Chris,
ich hab's gefunden.
Der Code ist OK, nur die Art und Weise wie ich das dann verifiziert habe 
nicht.

Mit dem EMU da in Single Step über die UART-Ausgabe zu gehen 
funktioniert natürlich nicht. Da läuft dann der Prozessor gerade 150nS 
dann steht das Ganze wieder im "Halt" und das wars.
Dann sieht man auch nie das TXEMTY Bit und nix geht raus
Jetzt stehen die Bits wie ne Eins am TX Ausgang.
Diesen Fehler habe ich vor 20 Jahren schon einmal gemacht, aber leider 
vergessen. Wollte wohl auch zu gründlich verifizieren
Mensch, bin ich froh. Wollte schon Busfahrer werden!

Aber ganz was anderes:
Ich bin sehr Hardwarenah und habe mit C (leider) nichts am Hut. Wir 
suchen (gegen Bezahlung natürlich) jemanden der in C gut ist und eine 
Seite C-Code mit Mathe drin in einen PIC32F26 Assemblercode (das dann 
als Unterprogramm aufrufbar ist) umsetzt.
Eingangsvariable 1x 11-Bit.
Ausgang Wert A: von 0x80 bis 0xff
Ausgang Wert B: von 0x00 bis 0xod
Das Ganze klingt wohl seltsam, aber die Werte benötigt ein 
Schrittmotorcontroller zur Rampenberechnung. Es ist alles gut 
dokumentiert, der Quellcode in C (ATMELuP 1 Seite) ist auch als Datei 
vorhanden.

Haste da Lust auf ein paar Mäuse?

Gruß
Walter

von Walter F. (Firma: SPS) (iwfm)


Lesenswert?

Hi,
vielen Dank auch für Deine Unterstützun.
Ich habs gefunden. das war nicht der Code, der ist OK. Es war der EMU.
Da darf man nicht im Single-Step rüber, denn der uP ist da nur ganz kurz 
am werkeln und wird gleich wieder abgewürgt. Dann kann natürlich nichts 
rausgehen.
Ich wette, da sind schon etliche reingefallen.

Viele Grüße aus München
Walter

von jkghj (Gast)


Lesenswert?

be stucki schrieb:
> Nachtrag:
> Hab gerade deine I/O Konfiguration angeschaut (TRIS-Register). Setze den
> Tx-Pin (RC6) auf Ausgang. Ohne jetzt nachgelesen zu haben behaupte ich
> mal, dass die Richtung nicht von der USART definiert wird.

Im Datenblatt steht explizit, dass der auf 1 gesetzt werden muss 
(Eingang). Das macht das Modul selbst.

von B. S. (bestucki)


Lesenswert?

jkghj schrieb:
> Im Datenblatt steht explizit, dass der auf 1 gesetzt werden muss
> (Eingang). Das macht das Modul selbst.
Vielen dank für die Info. Habs nun im Datenblatt nachgelesen, man sollte 
nur, muss aber nicht:
> For all modes of EUSART operation, the TRIS control
> bits corresponding to the RXx/DTx and TXx/CKx pins
> should be set to ‘1’. The EUSART control will
> automatically reconfigure the pin from input to output, as
> needed.
http://ww1.microchip.com/downloads/en/DeviceDoc/41412F.pdf
Seite 268

Werde in diesem Fall meine Code anpassen.


Walter F. schrieb:
> Aber ganz was anderes:
> Ich bin sehr Hardwarenah und habe mit C (leider) nichts am Hut. Wir
> suchen (gegen Bezahlung natürlich) jemanden der in C gut ist und eine
> Seite C-Code mit Mathe drin in einen PIC32F26 Assemblercode (das dann
> als Unterprogramm aufrufbar ist) umsetzt.
Bei Microchip können in C-Projekte auch Assembler-Files hinzugefügt 
werden (mit dem richtigen Compiler). Geht dies evt. auch andersrum? Also 
ein C-File in einem Assembler-Projekt?

von Chris B. (dekatz)


Lesenswert?

Walter F. schrieb:
> Aber ganz was anderes:
>
> ......... Wir
>
> suchen (gegen Bezahlung natürlich) jemanden der in C gut ist und eine
>
> Seite C-Code mit Mathe drin in einen PIC32F26 Assemblercode (das dann
>
> als Unterprogramm aufrufbar ist) umsetzt.........
>
> Haste da Lust auf ein paar Mäuse?

Nö danke, mache das nur als Hobby etc.

PIC32 (komplett andere Architktur) Assembler ist ja ne ganz andere 
Nummer, das hat mit 8 und 16 Bit MICROCHIP Assembler nicht mehr viel 
gemeinsam - ausser das es auch Assembler ist.

Ich bezweifle ob man "so nebenbei" 1 Seite C-Code mit Mathe in Assembler 
besser hinbekommt, als es ein Compiler kann.
Und selbst wenn man noch einige Taktzyklen gegenüber einem optimierten 
C-Compilat rausschinden kann, stellt sich die Frage, ob das bei einer 
Schrittmotorsteuerung noch eine Rolle spielt (gut möchte mich da nicht 
zu weit aus dem Fenster lehnen weil ich mich mit Schrittmotoren noch nie 
beschäftigt habe ;-) )

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.