Forum: Mikrocontroller und Digitale Elektronik RS232 programmierung unter C18


von Andreas I. (adisan)


Lesenswert?

Hallo Leute,

ich habe folgendes Problem. Ich habe ein Demoboard und PC zur Verfügung. 
Hat jemand Erfahrung wie diese Geräte über RS232 verbinde, damit Daten 
zwischen beiden veschicken könnte? Ich habe schon ein Programm für 
meinen PIC geschrieben. PIC und PC verbinde über ein NullModem kabel. 
Für Kommunikation benutze Hyperterminal. Wenn die Daten vom PIC sende, 
werden sie von Hyperterminal empfangen, aber wenn ich ein Zeichen sende, 
wird von PIC gar nichts empfangen.
Danke, wenn jemand antwortet

von Severino R. (severino)


Lesenswert?

Du musst im Sourcecode auf Zeile 54 statt:
1
if (c==0) {
schreiben:
1
if (c!=0) {

Dann sollte es gehen. Sagt jedenfalls meine Kristallkugel.

von Andreas I. (adisan)


Lesenswert?

Severino R. wrote:
> Du musst im Sourcecode auf Zeile 54 statt:
>
1
> if (c==0) {
2
>
> schreiben:
>
1
> if (c!=0) {
2
>
>
> Dann sollte es gehen. Sagt jedenfalls meine Kristallkugel.


ich habe folgender Sourcecode:

char z;


if(!DataRdyUSART())
{

z=ReadUSART();
Delay_ms(100);
putcUSART(z);

}

Ich möchte ein Zeichen epmfangen und dieses Zeichen zurück schicken. 
Leider klappt's nicht..

von Andreas I. (adisan)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Arbeitet jemand mit C18-Compiler von Microchip? Ich versuche schon seit 
3 Tagen PC über USART mit PIC zu verbinden... In Dateianhang ist mein 
Sourcecode.  Wenn irgendwelches Zeichen sende oder empfange, dann sehe 
ich ganz anderes Symbol auf dem Bildschirm und LCD. Weisst jemand 
vielleicht, wo ich Fehler habe.
Danke

von Master S. (snowman)


Lesenswert?

ich muss ehrlich gestehen, dass ich bis jetzt nur immer USB gebraucht 
habe und nie RS232, aber von Michrochip gibts ganz bestimmt 
C18-sourcecode-beispiele (musst mal im installationsordner gucken). 
ansonsten kann ich dir auf die schnelle sagen, dass die schlaufe 
schneller durchlaufen wird, als dass du zeichen empfpfängst, die du 'z' 
übergeben kannst; geschweige denn zurücksenden ;) ...musst du da nicht 
irgend ein while(noch_nicht_übertragung_beendet) oder so ähnlich 
abfragen?

von Andreas I. (adisan)


Lesenswert?

Dieses Beispiel habe ich doch aus dem C18 Getting start genommen. RS232 
benutze, weil das alles unter DOS ablaufen soll.

von Gerd G. (gege)


Lesenswert?

Andreas,

ich arbeite zwar nicht mit C18 sondern mit C30, aber probier doch mal 
den UART Empfangsinterrupt freizugeben, schreib eine ISR und setze im 
MPLAB eine breakpoint in die ISR um dann mit Watch das UART 
Empfangsregister zu lesen ob Du das gesendete Byte empfängst.

Falls nein: HW oder Konfig Problem
Falls ja: kleinen Ringbuffer in die ISR für empfangene Bytes, dann statt 
direkt aus dem UART aus dem Ringbuffer lesen.

So mach's ich.

Gruß

Gerd.

von Der M. (steinadler)


Lesenswert?

Hallo Andreas,

was hast du denn an dem Teil für einen Quarz dran?

Ich vermute, dass die Baudrateneinstellung nicht stimmt.

von Andreas I. (adisan)


Lesenswert?

Hallo Gerd,
danke für deine Antwort. Ich habe an meinem PIC noch ein 4MHz Qurz.

Baudrate habe ich so ausgerechnet: x=(16MHz/1200/64)-1

von Matthias S. (dachs)


Lesenswert?

if(!DataRdyUSART())
{

Heisst das nicht soviel wie:
wenn NICHT DataRdyUSART()


Dann wuerde der Inhalt der Klammer nur abgearbeitet, wenn KEINE Daten 
bereit stehen.

Matth

von Andreas I. (adisan)


Lesenswert?

Ich habe mit if(!DataRdyUSART()) auch ausprobiert. Obwohl ich kein 
Zeichen sende wird der Inhalt trozdem abgearbeitet..

von Gerd G. (gege)


Lesenswert?

Ach ja: hast Du schon die Fehlerflags angeschaut?

von Andreas I. (adisan)


Lesenswert?

Ich weiss nicht wie ich die Fehlerflags anschauen könnte..

von Der M. (steinadler)


Lesenswert?

Hallo Andreas,

dein Rx-Pin muss ein Eingang sein. Wenn ichs nicht übersehen habe, wird 
dies nirgendwo gemacht. Muss dorthin wo die TRIS-bits stehen.

von Andreas I. (adisan)


Lesenswert?

Hallo Micha,
Du meinst, dass ich TX als Ausgang, RX als Eingang?
ich habe so auch ausprobiert

TRISC0b10000000;

Es bringt nichts..

von Gerd G. (gege)


Lesenswert?

Andreas I. wrote:
> Ich weiss nicht wie ich die Fehlerflags anschauen könnte..

Da mußt Du schon das Datenblatt zum PIC lesen. Kapitel UART, UART 
register
(Hast ja nicht verraten welchen PIC du hast)

von Der M. (steinadler)


Lesenswert?

Setz mal bei deinem OpenUSART statt USART_BRGH_HIGH ein USART_BRGH_LOW.
Sonst dürfte die Rechnung nicht funktionieren.
Habe allerdings nicht in dem zu deinem PIC passenden DS nachgesehen, 
sondern in einem anderen.

von Andreas I. (adisan)


Lesenswert?

Ich habe schon Datenblätter angeschaut. Ich kann nicht Debbuger 
benutzen.

von Andreas I. (adisan)


Lesenswert?

Vielen Dank für alle Antworten. ich habe das Problem endlich gelöst. 
MAX232 war kapput.

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.