Forum: Mikrocontroller und Digitale Elektronik PIC18F4680 Probleme mit USart


von Steff (Gast)


Lesenswert?

Hi,

ich versuche eine Verbindung zum PC über RS232 herzustellen, aber die 
Daten, die ankommen stimmen nicht. Es muss irgendwas an der Baudrate 
nicht stimmen, aber ich komme nicht drauf, was es ist. Hier meine 
Konfiguration:

µC: PIC18F4680 mit 10Mhz Quarz, Fuses: OSC=HS, WDT=OFF, LVP=OFF
1
void usart_init(unsigned long baud) {
2
  char buffer;
3
  SPBRG = CLOCK/(16ul * baud) - 1;
4
  TXSTA = 0b00100100;        //TX ein, hohe Baudrate
5
  TRISCbits.TRISC7 = 1;
6
  TRISCbits.TRISC6 = 1;
7
  RCSTA = 0b10010000;        //USART an, continuous receive an
8
  buffer = RCREG;          //Empfangsbuffer leeren
9
}

Meine Sende-Routine:
1
extern void usart_putc(unsigned char c) {
2
  while(!PIR1bits.TXIF);
3
  TXREG = c;
4
}

und
1
#define CLOCK 10000000ul
2
void main() {
3
  usart_init(9600);
4
  while(1) {
5
    usart_putc("c");
6
  }
7
}

Habt ihr eine Ahnung, wo der Fehler liegen kann? Die Daten werden per 
usb-seriell dongle mit FTDI chip übertragen. Als Terminal nehme ich 
HTerm.

Danke und vG
STeff

von Steff (Gast)


Lesenswert?

Hi nochmal,

Ich konnte mein Problem teilweise lösen: Die Anführungszeichen waren 
falsch
1
#define CLOCK 10000000ul
2
void main() {
3
  usart_init(9600);
4
  while(1) {
5
    usart_putc('c');
6
  }
7
}

jetzt habe ich aber ein neues Problem:
1
void usart_puts(char *s) {
2
  while(*s) {
3
    usart_putc(*s++);
4
  }
5
}

mit
1
#define CLOCK 10000000ul
2
void main() {
3
  usart_init(9600);
4
  while(1) {
5
    usart_puts("Hallo Welt\n");
6
  }
7
}

Wenn ich einen String aus einer Variable nehme, zb char string = 
{hallo}; dann klappt das, aber nicht so direkt. Woran liegt das?

Grüße

von asdsad (Gast)


Lesenswert?

Steff schrieb:
> Wenn ich einen String aus einer Variable nehme, zb
> char string = {hallo};

Das sieht nicht wie valider C code aus.

Poste bitte den kompletten Code genau so wie du ihn kompilierst (der 
nicht-funktionierende).

von Steff (Gast)


Lesenswert?

Hi,
es muss natürlich char string[10] = {"hallo"} heißen. Ich habe den Code 
extra reduziert, damit ihr nicht mit überflüssiger Information überhäuft 
werdet ;)
Als Warnung auf usart_puts("Hallo Welt\n"); kommt: "Warning [2066] type 
qualifier mismatch in assignment" in MPlab mit C18 compiler.

Grüße

von Dietrich L. (dietrichl)


Lesenswert?

Bei (char *s) musst Du eine Adresse übergeben, ("Hallo Welt\n") ist aber 
keine.

Gruß Dietrich

von Steff (Gast)


Lesenswert?

Hi,
und wie löse ich das Problem?

Grüße

von Oliver J. (skriptkiddy)


Lesenswert?

Steff schrieb:
> Hi,
> und wie löse ich das Problem?
>
> Grüße

So hier:
1
usart_puts((const far rom char *)"Hallo Welt\n");

Gruß Oliver

von Steff (Gast)


Lesenswert?

Hallo nochmal,

ich habe jetzt eine Art Lösung gefunden, mit der ich schon arbeiten 
kann, aber noch nicht zufrieden bin:

Eine Senderoutine für array-strings:
1
 //array aus RAM senden
2
void usart_puta(char *s) {
3
  while(*s) {
4
    usart_putc(*s++);
5
  }
6
}

und für feste Strings aus dem ROM wie zb usart_puts("test123");
1
 //string aus ROM senden
2
extern void usart_puts(far rom char *s) {
3
  char c;
4
  while(*s) {
5
    c = *s;
6
    usart_putc(c);
7
    *s++;
8
  }
9
}

Geholfen hat mir der Beitrag: 
http://www.electro-tech-online.com/microcontrollers/35667-c18-formatting-strings-usart-2.html
Die Warnmeldung "Warning [2066] type qualifier mismatch in assignment
" bei usart_puts("Hallo Welt!"); kommt immer noch

Grüße

von Steff (Gast)


Lesenswert?

Hi,
danke für den Ansatz, aber er funktioniert bei mir nicht. Es kommt die 
Warnung 2066 vom compiler und er sendet nichts.

Grüße

von Oliver J. (skriptkiddy)


Lesenswert?

Stimmt man musste sich noch eine Funktion für konstante Strings aus dem 
Programmspeicher extra schreiben.


Also so sollte es eigentlich funktionieren:
1
//string aus ROM senden
2
extern void usart_puts_r(const far rom char *s) {
3
  char c;
4
  while(*s) {
5
    c = *s;
6
    usart_putc(c);
7
    *s++;
8
  }
9
}
10
11
int main(void)
12
{
13
  usart_puts_r((const far rom char *)"Hallo Welt");
14
}

von Steff (Gast)


Lesenswert?

Danke, so klappt es!

Grüße

von Oliver J. (skriptkiddy)


Lesenswert?

Wobei das extern an dieser stelle Quatsch ist.

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.