Forum: Mikrocontroller und Digitale Elektronik Probleme mit Typendefinition bei uart_puts


von Thomas R. (der_ilt)


Angehängte Dateien:

Lesenswert?

Hallo liebe MikrocontrollerGemeinde,

ich möchte in ein Projekt (mittels CodeVision) eine Terminal-Funktion 
einbauen, mit der ich dann während des Debuggen gewisse Dinge anzeigen 
lassen kann. Die .c- und die .h-Dateien sind vorgefertigte Bausteine aus 
den Beispielen von CodeVision.
Allerdings gibt er mir folgende Fehler aus:

Error: USART_LCD_Mega16.h(177), included from: main.c: function argument 
#1 of type 'unsigned char' is incompatible with required parameter of 
type 'flash unsigned char *'

Error: USART_LCD_Mega16.h(177), included from: main_usart_lcd_mega16.c: 
function argument #1 of type 'unsigned char' is incompatible with 
required parameter of type 'flash unsigned char *'

Error: main_usart_lcd_mega16.c(132): function argument #1 of type 
'unsigned char' is incompatible with required parameter of type 'flash 
unsigned char *'

Vielleicht kann mir ja einer helfen. Ich denke, dass es ein kleiner 
Implementierungsfehler ist. Ich hänge die betroffenden Dateien in den 
Anhang..

Vielen Dank und einen schönen Sonntag noch

von Helfer (Gast)


Lesenswert?

Mindestens zwei Probleme

> void uart_puts (const flash unsigned char *s)
> unsigned char *string01 = "Das ist der ...
>        uart_puts(*string01);

1. In der Definition von uart_puts ist durch const flash angegeben, 
dass der als Argument übergebene String sich im FLASH befindet.

IMHO passt das nicht zur Definition von string01. string01 liegt im RAM. 
So wäre es zumindest beim AVR-GCC, der nur speziell mit Schlüsselwort 
gekennzeichnete Variablen im den FLASH (PROGMEM) speichert.

Über ein Spezialverhalten des Codevision muss man dessen Doku 
durchsuchen. Ich könnte mir vorstellen, dass es bei const 
gekennzeichneten Variablen einen Spezialfall geben könnte. In obiger 
Form halte ich das für unwahrscheinlich.

2. Bei der Übergabe an uart_puts wird string01 mit dem * Operator 
dereferenziert. D.h. es wird statt einem gültigen Pointer das erste 
Zeichen des Strings übergeben.

3. Die Implementierung von mit const flash ist IMHO falsch. Es wird kein 
FLASH String ausgegeben sondern es wird über eine zeichenweise Ausgabe 
ein normaler RAM String ausgegeben.

Lösung:

1. void uart_puts (const /* flash */ unsigned char *s)...

2. uart_puts(string01);

von Thomas R. (der_ilt)


Lesenswert?

Danke schön für deine Antwort.

Ich habe in der Hilfe von CodeVision eine einfachere Lösung gefunden, um 
die USART-Schnittstelle zu realisieren. Diese Funktion funktioniert so 
weit auch, allerdings habe ich nun ein Problem damit, dass sich in 
meinem Projekt, in der auch die USB-Schnittstelle funktionsfähig 
realisiert ist, die USART-Umsetzung mit USB beißt. Je nachdem wie ich 
die Funktionsaufrufe in meiner main.c anordne funktioniert entweder das 
Eine oder das Andere.
    Ich benutze als µC den Atmega32U4. Hat da jemand eine fixe Idee 
woran das liegen könnte? Es könnte ja an der Frequenz liegen, die habe 
ich allerdings mit FOSC=8000000(inHz) (das ist der Arbeitstakt mit dem 
ich arbeite) definiert, die Baudrate habe ich auf 9600 und lasse UBRR 
extra berechnen. Trotzdem tritt dieses Phänomen auf.

Grüße

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.