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
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);
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.