www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Typendefinition bei uart_puts


Autor: Thomas R. (der_ilt)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Thomas R. (der_ilt)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.