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
>.. 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.
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
>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?
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
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
>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.
>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.
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
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.
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
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
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.
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
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.
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