Forum: Mikrocontroller und Digitale Elektronik Erste UART-versuche AVRStudio meckert rum


von AHLTONE (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

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.

von AHLTONE (Gast)


Angehängte Dateien:

Lesenswert?

Hier mein Programm

von Jim M. (turboj)


Lesenswert?

Wenn man hirnlos überall volatile hinschreibt, wird der Compiler schon 
mal meckern.

In .h Dateien gehören die Funktionsrümpfe nicht mit rein.

von AHLTONE (Gast)


Lesenswert?

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)

von Paul B. (paul_baumann)


Lesenswert?

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-

von AHLTONE (Gast)


Lesenswert?

aber habe meinen Fehler selber gefunden, nicht die "volatile" sind paar 
zu viele verteilt sondern die "unsigned" waren AVRStudio nicht genehm

von Ralph S. (jjflash)


Lesenswert?

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
Noch kein Account? Hier anmelden.