Guten Morgen, ich lese und schreibe mich gerade in die Welt der UART Verbindung zwischen PC und MC ein und hab hier und da ein kleines Proplem. Mein Programm habe ich hier, www.mikrocontroller.net / AVR-GCC-Tutorial/Der UART abgeschreiben und funktioniert auch, Sprich ich sende was an den Atmega16 und das wird dann wieder an PC (HTerm) zurück gesendet. ABER, jetzt wo ich "Senden einer Zeichenkette (String) hinzugefügt habe, meckert AVRStudio mit mir rum. while(1) { uart_puts("test" CR); _delay_ms(500); // uart_puts( uart_string ); _delay_ms(500); } läuft alles ohne Propleme und Meckerei, aber while(1) { uart_puts("test" CR); _delay_ms(500); uart_puts( uart_string ); _delay_ms(500); } Sagt AVRStudio in der Zeile uart_puts( uart_string ); Warning 1 passing argument 1 of 'uart_puts' discards 'volatile' qualifier from pointer target type [enabled by default] beziehungsweise bei void uart_puts(char*s) { while(*s) { uart_putc(*s); s++; } } Message 2 expected 'char *' but argument is of type 'volatile char *' Vieleicht weiß ja jemand nenn guten Rat, aber wenn ich mich so umschaue wird ja die "void uart_puts" so gut wie überall so geschrieben. MFG Hendrik
Lade hier mal bitte den Quellcode im Anhang als .c-Datei hoch, so wie man ihn in eine IDE übernehmen kann. Quellcode mit Prosa gemischt, ist blöd. Dafür kann man Kommentare im Quellcode verwenden.
Wenn man hirnlos überall volatile hinschreibt, wird der Compiler schon mal meckern. In .h Dateien gehören die Funktionsrümpfe nicht mit rein.
Jim M. schrieb: > Wenn man hirnlos überall volatile hinschreibt "hirnlos" würde ich das nicht benennen Jim, schon da ich vorausgesagt habe das ich den Code von der Seite http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART abgeschrieben habe. Siehe 7.1. Interruptbetriebt (Empfangen)
AHLTONE schrieb: > "hirnlos" würde ich das nicht benennen Jim, schon da ich vorausgesagt > habe das ich den Code von der Seite > http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART > abgeschrieben habe. :))) Super! -Paul-
aber habe meinen Fehler selber gefunden, nicht die "volatile" sind paar zu viele verteilt sondern die "unsigned" waren AVRStudio nicht genehm
In eine .h Datei gehören keine Definitionen (das wird bei korrekter Verwendung von Softwaremodulen zu mehrfach Deklarationen und Definitionen führen). Eher in der Art: myfunc.h
1 | #ifndef in_myfunc
|
2 | #define in_myfunc
|
3 | .
|
4 | // globale Variable... wenn sie unbeding sein müssen
|
5 | |
6 | extern int my_variab1; |
7 | |
8 | // Prototypen:
|
9 | |
10 | void my_func01(void); |
11 | int my_func02(int b); |
In die dazugehoerige .c Datei dann die Definitionen programmieren. Zum prinzipiellen Problem: Du versuchst einen String, der im Rom abgelegt ist mittels einer Funktion mit einen Zeiger auf RAM auszugeben ==> geht nicht !
1 | /* --------------------------------------------------
|
2 | RS232_PUTRAMSTRING
|
3 | gibt einen String aus dem RAM ueber die RS-232
|
4 | aus.
|
5 | -------------------------------------------------- */
|
6 | |
7 | void rs232_putramstring(unsigned char *p) |
8 | {
|
9 | do
|
10 | {
|
11 | uart_putchar( *p ); |
12 | } while( *p++); |
13 | }
|
14 | |
15 | /* --------------------------------------------------
|
16 | RS232_PUTROMSTRING
|
17 | gibt einen String aus dem ROM ueber die RS-232
|
18 | aus.
|
19 | |
20 | Bsp.:
|
21 | |
22 | rs232_putromstring(PSTR("Hallo Welt")
|
23 | -------------------------------------------------- */
|
24 | |
25 | void rs232_putromstring(const unsigned char *dataPtr) |
26 | {
|
27 | unsigned char c; |
28 | |
29 | for (c=pgm_read_byte(dataPtr); c; ++dataPtr, c=pgm_read_byte(dataPtr)) |
30 | {
|
31 | uart_putchar(c); |
32 | }
|
33 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.