Hallo,
ich würde gerne via PIC18LF25K50 mit eoinem UART Modul kommunizieren,
aber es will irgendwie nicht richrig funzen.
Die UART Einstellungen sollen sein:
BAUDRATE: 115200
Data Bits: 8
Parity: None
Stop Bits: 1
Flow Control: None
Vielleicht fällt ja jemanden etwas auf.
Compiler C18 MPLAB X IDE v2.25
Beim Debuggen läuft das Programm sauber durch, aber das UART Modul
reagiert nicht wie gewünscht.
Vielleicht fällt ja jemanden etwas auf.
Code:
auf den ersten blick:
du hast zwei "userinit()"-funktionen, da wird sich der compiler
beschweren.
aber warum dein uart nicht geht:
du überfährst gnadenlos den output buffer! warte, bis dieser wieder frei
ist, bevor du ein neues byte hinein schreibst (entsprechendes bit im
status register, TxEmpty oder so)
Little Basdart schrieb:> auf den ersten blick:>> du hast zwei "userinit()"-funktionen, da wird sich der compiler> beschweren.
Copy Paste Fehler, aber danke
> aber warum dein uart nicht geht:> du überfährst gnadenlos den output buffer! warte, bis dieser wieder frei> ist, bevor du ein neues byte hinein schreibst (entsprechendes bit im> status register, TxEmpty oder so)
das ist was dran.
in dem Beispielcode ist es wie folgt realisiert :
Du hast keine stabile Taktquelle. Der interne Oszillator ist keine!
Dieser PIC kann USB ohne Quarz, aber dann dient USB als stabile
Taktquelle. USB ist hier nicht konfiguriert, also ist auch von dieser
Richtung aus Fehlanzeige.
Schließe einen externen Quarz oder Oszillator an OSC1/OSC2 an und setze
die Config-Words passend.
fchk
Crissi schrieb:> Beim Debuggen läuft das Programm sauber durch, aber das UART Modul> reagiert nicht wie gewünscht.
Was macht es denn genau ?????????????????????????
Was mir auffällt:
TX-Pin sollte nicht als Ausgang konfiguriert werden.
(Ist fast bei allen so und steht im Data sheet 17.1.1.7 - 2.)
PS: Interner Clock reicht bei mir zumindest zum Entwickeln
immer. Später brauchst du dann vielleicht was präziseres.
Frank K. schrieb:> Du hast keine stabile Taktquelle. Der interne Oszillator ist> keine!>> Dieser PIC kann USB ohne Quarz, aber dann dient USB als stabile> Taktquelle. USB ist hier nicht konfiguriert, also ist auch von dieser> Richtung aus Fehlanzeige.>> Schließe einen externen Quarz oder Oszillator an OSC1/OSC2 an und setze> die Config-Words passend.>> fchk
HMM,
OK. Ich arbeite mit dem RN4020 Pictail Modul von Microchip. Da ist ICSP
etc. schon mit drauf und eben kein externer Oszillator. Würde mich
wundern wenn man den dann selbst noch mit draufpacken müsste. Aber
vielen Dank für den Hinweis, werde mir mal einen bestellen und mal
ausprobieren. In dem BeispielCode...
1
//Configure oscillator settings for clock settings compatible with USB
2
//operation. Note: Proper settings depends on USB speed (full or low).
3
4
OSCTUNE=0x80;//3X PLL ratio mode selected
5
OSCCON=0x70;//Switch to 16MHz HFINTOSC
6
OSCCON2=0x10;//Enable PLL, SOSC, PRI OSC drivers turned off
7
while(OSCCON2bits.PLLRDY!=1);//Wait for PLL lock
8
*((unsignedchar*)0xFB5)=0x90;//Enable active clock tuning for USB operation
dient USB ja als stabile Taktquelle. Wenn ich dies einkommentiere bringt
das jedoch auch nicht den gewünschten Erfolg. Ich bin bis dato davon
ausgegangen, dass diese Zeilen nur für die USB <-> UART Bridge benötigt
werden. Danke für den Hinweis.
Volker SchK schrieb:> Crissi schrieb:>> Beim Debuggen läuft das Programm sauber durch, aber das UART Modul>> reagiert nicht wie gewünscht.>> Was macht es denn genau ?????????????????????????
Ich habe mir das gerade nochmal genauer angeschaut.
Die send Funktion sah ja wie folgt aus.
1
#define mTxRdyUSART() TXSTAbits.TRMT
2
#define mDataRdyUSART() PIR1bits.RCIF
3
4
voidsend_command(char*src)
5
{
6
char*psrc=src;
7
while(*psrc!='\r')
8
{
9
if(mTxRdyUSART())putcUSART(*psrc++);
10
}
11
putcUSART('\r');
12
}
Dies funktioniert auch eigentlich, d.h. er schickt jeden einzelnen
Character über putcUSART(*psrc++); in das TXREG1 Register. Was auffällt,
dass das Empfangen über
1
voidget_response(char*dst)
2
{
3
char*pdst=dst;
4
5
while(1){
6
if(mDataRdyUSART())// in dieser Schleife bleibt er immer hängen
7
{
8
*pdst=getcUSART1();
9
if(*pdst=='\r')
10
break;
11
if(*pdst!='\n')
12
pdst++;
13
}
14
}
15
}
nicht funktioniert. Hier bleibt er Immer in der obig gekennzeichneten
Schleife hängen.
> Was mir auffällt:> TX-Pin sollte nicht als Ausgang konfiguriert werden.> (Ist fast bei allen so und steht im Data sheet 17.1.1.7 - 2.)
Habe es mir durchgelesen und im Datenblatt steht tatsächlich:
"Set RX and TX TRIS controls to 1."
Finde ich etwas verwunderlich. Im Microchip Beispiel Code ist TX
jedenfalls auch als Ausgang konfiguriert. Ich habe beides ausprobiert.
> PS: Interner Clock reicht bei mir zumindest zum Entwickeln> immer. Später brauchst du dann vielleicht was präziseres.
Da bin ich aber beruhigt.
Crissi schrieb:> OK. Ich arbeite mit dem RN4020 Pictail Modul von Microchip. Da ist ICSP> etc. schon mit drauf und eben kein externer Oszillator. Würde mich> wundern wenn man den dann selbst noch mit draufpacken müsste. Aber> vielen Dank für den Hinweis, werde mir mal einen bestellen und mal> ausprobieren.
Der Onboard-PIC ist nur als USB-UART-Bridge gedacht. Ansonsten sollst Du
das Board in ein Demoboard mit PicTail(+) einstecken und den onboard-PIC
nicht benutzen. So ist das eigentlich gedacht.
Der hier sollte passen:
http://www.reichelt.de/Oszillatoren-SMD-Keramikgehaeuse/XO91-16-00000/3/index.html?ACTION=3&GROUPID=4004&ARTICLE=85017&OFFSET=500&WKID=0&
100n über der Spannungsversorgung nicht vergessen. Mit 12 (PLLx4) oder
16 (PLLx3) MHz funktioniert USB auch noch weiterhin.
> In dem BeispielCode...> dient USB ja als stabile Taktquelle. Wenn ich dies einkommentiere bringt> das jedoch auch nicht den gewünschten Erfolg.
... weil die USB-Peripherie nicht konfiguriert ist und keine aktive
USB-Verbindung besteht.
fchk
> Der Onboard-PIC ist nur als USB-UART-Bridge gedacht. Ansonsten sollst Du> das Board in ein Demoboard mit PicTail(+) einstecken und den onboard-PIC> nicht benutzen. So ist das eigentlich gedacht.
Hmm, ja Ok. Das ist eigentlich klar, aber der On Board Pic hat nun mal
eine UART Schnittstelle und die ICSP Schnittstelle ist nun mal auch
rausgeführt. Was kann bzw. sollte mich davon abhalten das Modul über die
reine UART Schnittstelle des ON Board Pic18 zu konfigurieren. Wesentlich
günstiger und meiner Meinung nach sinnvoller als sich jetzt nen
komplettes Starterkit anzuschaffen und über den PICTAIL Konnektor zu
konfigurieren!
Das müßte doch eigentlich genau so klappen (theoretisch)?
Danke für den Einwwand und den Oscillator Link.
Crissi schrieb:>> Der Onboard-PIC ist nur als USB-UART-Bridge gedacht. Ansonsten sollst Du>> das Board in ein Demoboard mit PicTail(+) einstecken und den onboard-PIC>> nicht benutzen. So ist das eigentlich gedacht.>> Hmm, ja Ok. Das ist eigentlich klar, aber der On Board Pic hat nun mal> eine UART Schnittstelle und die ICSP Schnittstelle ist nun mal auch> rausgeführt. Was kann bzw. sollte mich davon abhalten das Modul über die> reine UART Schnittstelle des ON Board Pic18 zu konfigurieren.
Der fehlende Oszillator bzw Quarz.
> Wesentlich> günstiger und meiner Meinung nach sinnvoller als sich jetzt nen> komplettes Starterkit anzuschaffen und über den PICTAIL Konnektor zu> konfigurieren!
Natürlich, aber Microchip hat das eben anders vorgesehen.
> Das müßte doch eigentlich genau so klappen (theoretisch)?
Wenn Du den Oszillator und den Abblockkondensator für den Oszillator
nachrüstest, dann ja. Der kommt übrigens dann an RA6, RA7 bleibt frei.
Config Words passend setzen (Primärer Oszillator ist dann ECPLL)!
fchk
Ich fasse mal zusammen:
1. das Modul über den PIC18 als USB - UART Bridge zu konfigurieren OHNE
externen Quarz funktioniert wunderbar
2. das Modul über die reine UART Schnittstelle zu konfigurieren
funktioniert OHNE Quarz auf keinen Fall, d.h. also wann immer der
PIC18LF25K50 mit einem externen Modul über die UART Schnittstelle
kommunizieren will ist ein externer Quarz nötig (ist das wirklich so?,
kann ich da nix tricksen?)
3. ich als Laie kann nicht verstehen das 1. funktioniert aber 2. nicht
4. das RN4020 Pictail Board über einen PIC32 auf einem teuren Starterkit
zu konfigurieren würde vermutlich tadellos funktionieren
5. das Modul über den On Board Pic nur mit externen Quarz an Pin RA6
(einer der einzigen der am Pictail Board NICHT rausgeführt ist) und dann
Primärer Oszillator auf ECPLL setzen
Das kommt mir merkwürdig vor. Ich weiss gar nicht wie ich auf dem
Pictail Board mit dem Oszillator jetzt an den RA6 kommen sollte. Kann
irgendwie kaum glauben, dass es da keine andere Möglichkeit geben kann.
ich habe nochmal ausprobiert die USB UART Bridge zu nutzen, sprich das
Modul über ein Terminal zu konfigurieren (Man kann übrigens auch einfach
die rausgeführten TX, RX Pins und einen Pegelwandler verwenden, dann
spart man sich die ganze USB Geschichte).
Na ja, es scheint auf jeden Fall wichtig zu sein, dass als Baudrate
115200 mit den folgenden Einstellungen initialisiert werden.
BAUDRATE: 115200
Data Bits: 8
Parity: None
Stop Bits: 1
Flow Control: None
Andernfalls funktioniert es nicht. Kann bitte nochmal einer drüber
gucken, ob sich hier vielleicht nicht ein Fehler eingeschlichen hat?
Crissi schrieb:> Ich fasse mal zusammen:>> 1. das Modul über den PIC18 als USB - UART Bridge zu konfigurieren OHNE> externen Quarz funktioniert wunderbar>> 2. das Modul über die reine UART Schnittstelle zu konfigurieren> funktioniert OHNE Quarz auf keinen Fall, d.h. also wann immer der> PIC18LF25K50 mit einem externen Modul über die UART Schnittstelle> kommunizieren will ist ein externer Quarz nötig (ist das wirklich so?,> kann ich da nix tricksen?)>> 3. ich als Laie kann nicht verstehen das 1. funktioniert aber 2. nicht
Du brauchst eine stabile und genaue Taktquelle. Auf dem Chip ist nur ein
Widerstand und ein Kondensator als RC-Schwingkreis vorhanden. Das ist
nicht besonders genau, und wenn der Chip warm wird, ändern sich die
Bauteilewerte und damit die Frequenz. Ein Schwingquarz ist sehr genau,
aber er lässt sich nicht im Chip unterbringen, weil es ein mechanisches
Bauteil ist, das tatsächlich physikalisch schwingt.
Mit einer AKTIVEN USB-Verbindung hast Du einen sehr genauen Zeitgeber,
da der USB-Host-Chip im PC auch von einem Quarz getaktet wird (das ist
im USB-Standard vorgeschrieben).
> 4. das RN4020 Pictail Board über einen PIC32 auf einem teuren Starterkit> zu konfigurieren würde vermutlich tadellos funktionieren
ja
> 5. das Modul über den On Board Pic nur mit externen Quarz an Pin RA6> (einer der einzigen der am Pictail Board NICHT rausgeführt ist) und dann> Primärer Oszillator auf ECPLL setzen
ja
>> Das kommt mir merkwürdig vor. Ich weiss gar nicht wie ich auf dem> Pictail Board mit dem Oszillator jetzt an den RA6 kommen sollte. Kann> irgendwie kaum glauben, dass es da keine andere Möglichkeit geben kann.
Beschwere Dich bei Microchip.
Du klebst den Oszillator verkehrtrum auf die Platine und gehst dann mit
feinem Kupferlackdraht an die entsprechenden Anschlüsse. Mit dem
passenden Werkzeug geht das. Gut, der PIC ist im QFN-Package, das ist
dann erhöhter Schwierigkeitsgrad. :-) Ist aber auch nur ein Pin, obere
Reihe, linkester Pin. 3V3 und GND bekommst Du wahlweise von C5 oder C6.
Oder bau Dir Deine eigene Leiterplatte. Das hätte ich eh gemacht.
fchk
OK, schon einmal vielen Dank für die ausführlichen Erklärungen. Ich kann
es zwar immer noch nicht ganz glauben, dass eine UART Kommunikation ohne
externen Oszillator nicht funktionieren soll, aber da fehlt mir
wahrscheinlich noch die Erfahrung.
Ich hoffe ich habe die Baudrate zumindest richtig kalkuliert.
Ich habe hier einen 32 Mhz Quarz gefunden:
http://www.farnell.com/datasheets/1782547.pdf
würde so etwas auch gehen?
schonmal die Signale auf der datenleitung gemessen?
einfach mal vom PIC aus dummy daten in einer endlosschleife schicken, am
besten 0x55.
Mit Oszi oder LogicAnalizer hübsche Bilder anschaun, ob die Frequenz
stimmt.
Oder mit einem Multimeter die Frequenz messen.
Ich kann mir nicht vorstellen, ein 16MHz +-1% oszillator für ein
9600baut-uart zu ungenau sein soll.
Auf einem STM32F4 kann ich mit diesen Werten einen 4Mbaud-uart
betreiben, ohne probleme!
Ich hab mir mal die Mühe gemacht und deine Oszillator Konfiguration
zerpflückt. Mein Ergebnis: er ist nicht initialisiert!
Du initialisierst nichts in Hinblick auf den Oszillator Block in deiner
Init-Routine, daher läuft er mit den Einstellungen der Fuses:
#pragma config PLLSEL = PLL3X // 3X PLL multiplier selected
#pragma config CFGPLLEN = OFF // PLL turned on during execution
...
PLL ist also offenbar gar nicht eingeschaltet und dein prozessor taktet
mit irgendwas, aber nicht mit 48MHz
Schalte IRCF auf 16MHz, wähle PLL_Select = 0 und es könnte evtl
funktionieren.
Siehe hierzu kapitel 3 deines Mikrocontroller-Datenblatt
Schon mal vielen Dank für den ganzen Input,
Gerade den Fehler mit den Config Bits hätte ich alleine nie gefunden.
Habe die Baudrate (115200) mal mit dem Oszi an der TX Leitung
verifiziert. Das kommt ziemlich genau hin. Vielen Dank dafür an Volker.
Jetzt antwortet mein Modul noch nicht (anders als wenn ich es direkt
über die serielle Leitung via Putty anspreche).
Woran das liegt muss ich noch rausbekommen.
Ich werde berichten.
Schönen Dank an ALLE!
Crissi schrieb:> OK, schon einmal vielen Dank für die ausführlichen Erklärungen. Ich kann> es zwar immer noch nicht ganz glauben, dass eine UART Kommunikation ohne> externen Oszillator nicht funktionieren soll, aber da fehlt mir> wahrscheinlich noch die Erfahrung.>> Ich hoffe ich habe die Baudrate zumindest richtig kalkuliert.>> Ich habe hier einen 32 Mhz Quarz gefunden:> http://www.farnell.com/datasheets/1782547.pdf
Du brauchst entweder 12 oder 16 MHz oder aber 48 MHz. Nur dann
funktioniert USB weiterhin. 48 MHz würde ich sein lassen, also bleiben
12 oder 16 MHz. Und ein Oszillator schwingt zuverlässiger an als ein
Quarz insbesondere bei Fädelbeschaltung.
Der Standard sagt, dass bei UART die Baudrate um ±3% abweichen darf.
fchk