Forum: Mikrocontroller und Digitale Elektronik Problem mit UART?


von Mike (Gast)


Lesenswert?

Hallo
Habe grad ein kleines Problem mit einer UART Schnittstelle,
habe ein IC das ich über einer UART Schnittstelle mit einem PIC16F887 
verbunden habe. Hab die Schnittstelle des PICs wie unten gezeigt 
initialisiert.
// UART Bus initialiaieren
TRISC=TRISC|0b11000000;
TXSTA=0b01100000;
RCSTA=0b11011000;
SPBRG=15;
// Interups freigeben
RCIE=1;
PEIE=1;
GIE=1;

Mein Mikrocontroller hat einen 10MHz Takt und Signal ist 8.Bit + 
Parity-Bit
Nun mein Problem, mit dem Oszi kann ich sehen das IC wie Mikrocontroller 
senden wenn sie sollen, jedoch empfängt keiner von beiden ein Signal.
Hab gedacht das es mit der Baudrate zusammenhängen muss, jedoch der wert 
des SPBRG sollte für 9600Baud stimmen. Hat einer eine Idee was das 
Problem sein könnte?
P.S. TX-RX sind richtig.

Gruss mike

von Purzel H. (hacky)


Lesenswert?

>.. jedoch der wert des SPBRG sollte für 9600Baud stimmen

Ich mag jetzt nicht im datenblatt nachschauen. Zu irgendeinem Zeitpunk 
wird man das auch nachmessen wollen. Also sende repetitiv ein byte, zB 
0x55 oder so und mess mit dem Scope nach wie lange nun ein byte ist, 
resp welche Baudrate genau laeuft.

von Mike (Gast)


Lesenswert?

Hallo Pico Oschi
Ja das wollte ich schon lang machen, nur ist leider mein oszi nicht grad 
das neuste und ich hab kein speicher drin. Aber die Baudrate habe ich 
aus dem Datenblatt berechnet, und bei sprut ist sie auch zu finden.
Sonst noch ne idee was das problem sein könnte?

Gruss Mike

von holger (Gast)


Lesenswert?

>Mein Mikrocontroller hat einen 10MHz Takt und Signal ist 8.Bit +
>Parity-Bit

Parity is not supported by the hardware, but can
be implemented in software and stored as the ninth


Bist du sicher das du das Parity Bit brauchst?

von Mike (Gast)


Lesenswert?

hallo holger
Ja ich benötige leider ein parity Bit. Ich kann das Parity bit im  TX 
Statusregister setzen das ist kein Problem. Wenn ich aber meinen 
Controller Debugge und im Inerrupt für den Recive Buffer einen 
Breakpoint setze, erreiche ich diesen jedoch auch nie. Also ist egal ob 
der Mikrocontroller oder das IC sendet, es funtioniert in beide 
Richtungen nicht.

Gruss Mike

von holger (Gast)


Lesenswert?

TRISC=TRISC|0b11000000;

TX möchte bestimmt kein Eingang sein.

von Mike (Gast)


Lesenswert?

Hallo Holger
Die PINs 6 & 7 von PortC müssen beide als eingang gesetzt werden, der 
Port schaltet bei freigeben des TXEN aus dem TX Statusregister um. Ich 
kann ein Signal am ausgang messen wenn  ich eins Sende, nur kann ich mit 
mein altes Oszi keinen Speicher und ich kann die länge des Signals nicht 
genau bestimmen.

Gruss mike

von holger (Gast)


Lesenswert?

>Die PINs 6 & 7 von PortC müssen beide als eingang gesetzt werden, der
>Port schaltet bei freigeben des TXEN aus dem TX Statusregister um.

Ja, stimmt. Sonst könntest du ja auch nicht senden;)
Was ist denn mit dem Configuration Word?
Läuft dein uC auch wirklich mit 10MHz? Nicht das der
auf INTOSC steht.

von holger (Gast)


Lesenswert?

>Wenn ich aber meinen
>Controller Debugge und im Inerrupt für den Recive Buffer einen
>Breakpoint setze, erreiche ich diesen jedoch auch nie.

Und das ist schon extrem merkwürdig. Selbst bei falscher
Baudrate müsste er da irgendwann reinspringen.

von Mike (Gast)


Lesenswert?

Nein läuft auf dem extrnen Quarz. Aber das hab ich mir auch schon 
gedacht, leider scheint der Quarz in Ordnung zu sein, er bringt schöne 
10MHz.

von Mike (Gast)


Lesenswert?

Hallo

Ich bins noch mal
So hab jetzt mit nem Digitalen Oszi das Telegramm Analysiert. Die 
Telegramme von IC und Mikrocontroller scheinen beide OK zu sein, und die 
Bitübertragungszeit ist auch gleich, also sind die Baudraten in Ordnung.
Hat irgendwer noch ne Idee? Ich begreifs nicht

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Mike schrieb:
> Ja ich benötige leider ein parity Bit.

Odd oder Even parity ? Wenn die parity falsch errechnet wird, weigern 
sich die Teilnehmer, das Zeichen zu akzeptieren.

von Mike (Gast)


Lesenswert?

Hallo Mattias Sch.
Der IC benötigt ein ODD Parity. Jedoch sendet auch der IC wenn ein event 
eintrifft ein Telegramm, was er auch macht. Der Mikrocontroller empfängt 
dieses Telegramm nur leider auch nicht. Habs noch mit Polling versucht, 
weil ih dachte das vieleicht was mit dem Interupt nicht stimmt. nur da 
bleibt das RC Register auch leer. Bin dran eine Testschaltung aufzubauen 
damit ich das IC und den Mikrocontroller von dieser ansteuern kann. Hat 
noch einer eine andere Idee? Sind leidr alles SMD bauteile und nicht soo 
gut zum Pins auslöten. Hat vielecht einer die Rettende Idee?
Gruss Mike

von Mike (Gast)


Lesenswert?

Hallo zusammen
ich bins noch mal
der IC funktioniert hab in getestet, was nun leider immer noch nicht 
funktioniert ist der mikrocontroller. um sicher zu gehen das dieserr 
nicht defekt ist hab ich einen neuen gleichen Mikrocontroller in einem 
Experimentierboard programmiert und gedebbugt. dieser funktioniert auch 
nicht. was mir aufgefallen ist, das die Controller nach einem neustart 
sobalt das RC Interupt freigegeben wird in die Interrupt routine 
springt. Dies macht er auch wenn ich das Flag vor dem einschalten der 
Interrupts auf null setze. Im moment Compiliere ich nur meine 
Initialisierung der UART schnittstelle um mögliche andere fehler 
ausschliessen zu können. diese ist hier nochmals angehängt.

// UART Bus initialiaieren
TRISC=0b11000000;
TXSTA=0b01100000;
RCSTA=0b11010000;
SPBRG=15;
// Interups freigeben
RCIE=1;
PEIE=1;
GIE=1;
Ich kriegs nicht hin, wäre sehr froh um hilfe.
Gruss Mike

von Karl H. (kbuchegg)


Lesenswert?

Mike schrieb:
> Hallo zusammen
> ich bins noch mal
> der IC funktioniert hab in getestet, was nun leider immer noch nicht
> funktioniert ist der mikrocontroller.


tu dir doch mal selbst einen Gefallen und eliminier eiene Unbekannte.

Anstatt des IC, von dem du nicht weißt ob und wenn ja was er empfängt, 
häng doch erst mal deinen PC (per MAX232 Pegelwandler, wenn du den noch 
nicht hast) an den µC drann und lass dir dort von einem Terminalprogramm 
anzeigen, was der µC eigentlich schickt. Und erst wenn das mit dem 
übereinstimmt, was du im µC wegschickst, und du anhand der IC-Doke 
verifiziert hast, dass der IC damit eigentlich klar kommen müsste, dann 
hängst du den IC wieder drann.

Du musst Wege finden, wie du aus dem 'Stochern im Nebel' rauskommst! Dem 
IC kannst du nicht auf die Finger schauen, aber mit einem Terminal 
kannst du sehen, was vom µC kommt, ob die Baudrate richtig ist etc. Du 
musst Wege finden, wie du das, was du nicht sehen kannst, sichtbar 
machst. Dein IC wird dir nicht anzeigen, was auf der Leitung Sache ist. 
Also musst du dir überlegen, wie du das sichtbar machen kannst.

von mike (Gast)


Lesenswert?

Hallo Karl Heinz Buchegger
Natürlich habe ich den IC über einen MAX3232 mit dem com terminal vom PC 
verbunden um dies zu testen. Sonst könnte ich ja nicht bestimmen ob 
dieser richtig sendet und empfängt oder nicht wenn der Prozessor nicht 
funkt. hab nur gemeint, das der Mikrocontroller nicht funkt und mir da 
aufgefallen ist das dieser immer nachnem neustart in die interrupt 
routine springt.
gruss mike

von Karl H. (kbuchegg)


Lesenswert?

mike schrieb:
> Hallo Karl Heinz Buchegger
> Natürlich habe ich den IC über einen MAX3232 mit dem com terminal vom PC
> verbunden um dies zu testen.

Nicht den IC!

Den µC! Deinen PIC hängst du erst mal an den PC und siehst nach, was 
dein Programm raussendet, wenn es überhaupt etwas sendet. Das der IC vom 
Hersteller ein funktionierendes UART mitbekommen hat, glaub ich 
unbesehen. Aber ob deine PIC Konfiguration richtig ist, ist eine ganz 
andere Sache.

Und die Idee mit dem defekten PIC: Darauf würd ich erst mal nicht 
setzen. Die Erfahrung zeigt, dass zu mehr als 98% das Problem immer vor 
dem Bildschirm sitzt. Die Wahrscheinlichkeit sagt ganz einfach: Es ist 
ein Fehler in deinem Programm und/oder Beschaltung.

von mike (Gast)


Lesenswert?

Hallo Karl Heinz Buchegger
Danke für deine Antwort. Hab nun das Problem gefunden, und diesmal lag 
der fehler trotzdem in den von dir genannten 2%. Der IC hat eine 
funktionierende UART schnittstelle die Hardwaremässig eingestellt werden 
muss. er gibt auf bestimmte anfragen die ich im sende antwort. Und dies 
macht er. Nun habe ich trotzdem mal den uC ersetzt weil dieser zwar 
daten sendete (auf das com Terminal) aber wenn ich im vom com Terminal 
was gesendet hab blieb das RCREG Register des PIC leer und auch das Flag 
wurde nicht gesetzt (nur am anfang nach dem einschalten). Nun hab ich 
den Pic ersetzt und mit dem selben ungeänderten Programm geladen, und 
siehe da alles funktioniert. Aber Karl Heinz Buchegger hast natürlich 
recht, war das so ziemlich das erste mal das der fehler in der Hardware 
lag.
Besten dank für eure Hilfestellungen und Infos wünsch noch einen schönen 
Tag
Gruss Mike

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.