Hallo,
ich muss in meinem code printf Funktionen nutzen um Ausgaben auf ein LCD
zu realisieren.
Leider finde ich trotz Forensuche nicht den richtigen Ansatz.
Ich nutze die Fleury LCD Lib.
Der Code sieht folgendermaßen aus:
1
#include<stdio.h>
2
#include"lcd.h"
3
4
intmain(void)
5
{
6
7
fdevopen(lcd_putc,NULL,0);//hier bekomme ich die Fehlermeldung
8
9
/* initialize display, cursor off */
10
lcd_init(LCD_DISP_ON);
11
printf("Hello, world!\n");
12
13
14
while(1)
15
{}
16
}
So wie ich die Beschreibung der AVR GCC Lib verstanden habe, muss ich
die Funktion zum schreiben eines Zeichens auf das LCD in
1
fdevopen(lcd_putc,NULL,0);
angeben. Das sollte es dann schon gewesen sein.
Fehlermeldung von Win AVR:
../main.c:49: error: too many arguments to function 'fdevopen'
Ich bitte um eure Mithilfe so dass ich die fprintf Funktion für mein LCD
nutzen kann.
Liebe Grüße
Gerd
> ../main.c:49: error: too many arguments to function 'fdevopen'
Als logische Konsequenz würde ich doch mal in der Lib schauen, was denn
von der Funktion erwartet wird.....
Das fdevopen ist für Micros nicht notwendig. Das LCD_Init()
initialisiert das Display.
Schau Dir mal die Funktionen der Fleury Lib genau an, die sind auch
dokumentiert :-)
Und wirf einen Blick in die lcd.h Datei. Hier ist alles enthalten, was
Du für die Display-Ansteuerung benötigst.
Wichtig ist auch die richtige Verdrahtung. Wie sieht Dein HW-Aufbau aus
?
Hi,
> ich muss in meinem code printf Funktionen nutzen um Ausgaben...
Wieso "musst" Du printf für LCD-Ausgaben benutzen?
Statt
> printf("Hello, world!\n");
gibst Du mit der P.Fleury Bibliothek einen String so aus:
lcd_puts("Hello, world!\n");
Wie schon Dennis und Pete K. gesagt haben, lohnt sich ein Blick in die
"lcd.h" (oder besser in die "lcd.c"!), bevor man die Funktionen benutzt.
Falls es denn unbedingt fdevopen sein soll:
http://www.roboternetz.de/phpBB2/viewtopic.php?t=5865
Gruß
risu
Pete K. wrote:
> Das fdevopen ist für Micros nicht notwendig.
Doch, ist es. Es geht darum, das in der Lib enthaltene printf direkt auf
das LCD ausgeben zu lassen, also das printf mit der LCD-Ausgabe zu
"verheiraten".
gerd wrote:
>So wie ich die Beschreibung der AVR GCC Lib verstanden habe, muss ich>die Funktion zum schreiben eines Zeichens auf das LCD in> fdevopen(lcd_putc,NULL, 0);> angeben. Das sollte es dann schon gewesen sein.
fdevopen benötigt aber nur 2 Argumente, also liest du dir die
Beschreibung vielleicht noch mal durch.
Hallo,
mit der LCD Lib von Fleury komme ich sehrwohl klar und arbeite auch
schon länger damit.
In meiner Ausbildung wird verlangt die printf Funktion zu nutzen,
deswegen versuche ich dies in Kombination mit der Fleury LCD Lib zu
realisieren.
Irgendwie habe ich da ja wohl ein Brett vorm Kopf :-(
Bis jetzt hatte ich noch nie solche Probleme mit AVR´s.
Ich lese mir jetzt mal in Ruhe die Tips von euch durch und versuche zu
verstehen.
Danke erst einmal
gerd
Hallo,
jetzt bin ich erst einmal einen guten Schritt weiter gekommen.
Ich habe die Fleury LCD Funktion folgendermaßen angepasst:
1
intlcd_putc(charc)
2
{
3
...
4
return0;
5
6
}
Dann folgender Code vor der main:
1
staticFILEmystdout=FDEV_SETUP_STREAM(lcd_putc,NULL,_FDEV_SETUP_WRITE);//<-----hier das warning
jetzt:
1
intmain(void)
2
{
3
4
/* initialize display, cursor off */
5
lcd_init(LCD_DISP_ON);
6
/* clear display and home cursor */
7
cd_clrscr();
8
stdout=&mystdout;
9
printf("Hello %d !",555);
10
11
while(1){}
12
}
Es erscheint nun auch "Hello 555 !" auf dem Display.
Trotzdem kommt es zu folgenden Warning:
../main.c:42: warning: initialization from incompatible pointer type
O.K. ich habe in meiner lcd_putc Funktion ja keinen Pointer als Übergabe
Variable.
Füge ich diesen der lcd_putc hinzu:
1
intlcd_putc(charc,FILE*stream)
2
{
3
//bla bla
4
}
So bekomme ich zu dem warning noch eine Fehlermeldung.
../lcd.h:133: error: expected declaration specifiers or '...' before
'FILE'
../main.c:42: warning: initialization from incompatible pointer type
Kann mir bitte jemand auf die Sprünge helfen?
Gruß
gerd
Wir unterhalten uns ja über diesen Abschnitt aus dem
AVR-GCC-Tutorialhttp://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_printf
Möglicherweise kennt der Kompiler in der Zeile int lcd_putc(char c, FILE
*stream) in lcd.c den Datentypen FILE, der ja ein #include <stdio.h>
erfordert, noch nicht.
Ich würde nie in der Library eine solche Anpassung machen. Du
veränderst die Library, d.h. du wirst inkompatibel mit anderen die diese
Library benutzen, wenn du Sourcen rausgibst und wenn du eine neue
Version der Library in dein System enpflegen willst.
Warum machst du es nicht so mit der Original-Library?
Es kommt auf die Version der AVR-LibC an die du verwendest.
Zwischen v1.3 (glaub ich) und v1.4 hat sich die Anzahl und der Typ der
Parameter für fdevopen() geändert. Was du brauchst musst du aus der
Dokumentation zu DEINER AVR-LibC entnehmen und nicht aus dem Tutorial.
Auf gut Neudeutsch: "Read The Fine Manual." - Aber das Richtige ;-)