Forum: Compiler & IDEs printf mit fleury lcd lib probleme


von gerd (Gast)


Lesenswert?

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
int main(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

von Dennis (Gast)


Lesenswert?

> ../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.....

von Pete K. (pete77)


Lesenswert?

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 
?

von risu (Gast)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Steffen (Gast)


Lesenswert?

Im AVR-GCC-Tutorial auf dieser Webseite wird auch ein Beispiel gebracht, 
wie man die Ausgabe von printf umleiten kann.

Steffen.

von gerd (Gast)


Lesenswert?

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

von gerd (Gast)


Lesenswert?

Hallo,


jetzt bin ich erst einmal einen guten Schritt weiter gekommen.

Ich habe die Fleury LCD Funktion folgendermaßen angepasst:
1
int lcd_putc(char c)
2
{
3
...
4
return 0;
5
6
}

Dann folgender Code vor der main:
1
static FILE mystdout = FDEV_SETUP_STREAM( lcd_putc, NULL, _FDEV_SETUP_WRITE ); //<-----hier das warning

jetzt:
1
int main(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
int lcd_putc(char c, 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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Wir unterhalten uns ja über diesen Abschnitt aus dem 
AVR-GCC-Tutorial
http://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?
1
#include <avr/io.h>
2
#include <stdio.h>
3
#include "lcd.h"
4
5
int my_lcd_putc(char c, FILE *stream);
6
7
static FILE mystdout = FDEV_SETUP_STREAM( my_lcd_putc, NULL, _FDEV_SETUP_WRITE );
8
9
int my_lcd_putc(char c, FILE *stream)
10
{
11
  lcd_putc(c);
12
  return 0;
13
}
14
15
int main(void)
16
{
17
  /* initialize display, cursor off */
18
  lcd_init(LCD_DISP_ON);
19
  /* clear display and home cursor */
20
  lcd_clrscr();
21
  
22
  stdout = (FILE *) &mystdout;
23
  printf( "Hello %d !",555);
24
 
25
  while(1)
26
  { 
27
    // für immer
28
  }
29
30
  return 0;
31
}

von Werner B. (werner-b)


Lesenswert?

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 ;-)

von Werner B. (werner-b)


Lesenswert?

Ich habe mal herausgesucht wie ich das "gelöst" habe...
1
#include <stdio.h>
2
3
/* ####################################### *\
4
 *  Routine für die serielle Ausgabe 
5
\* ####################################### */
6
#if (__AVR_LIBC_VERSION__ < 10400UL)
7
int16_t uart_putchar( char c )
8
{
9
   if ( c == '\n' )
10
      serialPutChar( '\r' );
11
   serialPutChar( c );
12
   return ( 0 );
13
}
14
#else
15
int16_t uart_putchar( char c, FILE *f )
16
{
17
   f = f; /* keep the compiler happy */
18
19
   if ( c == '\n' )
20
      serialPutChar( '\r' );
21
   serialPutChar( c );
22
   return ( 0 );
23
}
24
#endif
25
26
/* ####################################### *\
27
 *  Routine für die serielle Eingabe
28
\* ####################################### */
29
#if (__AVR_LIBC_VERSION__ < 10400UL)
30
int16_t uart_getchar( void )
31
{
32
   return (int16_t)serialGetChar();
33
}
34
#else
35
int16_t uart_getchar( FILE *f )
36
{
37
   f = f; /* keep the compiler happy */
38
39
   return (uint16_t)serialGetChar();
40
}
41
#endif
42
43
44
int main()
45
{
46
    serialPortInit( BAUD_RATE, NO_PARITY, BITS_8, STOP_1 );
47
   /* öffnet einen Kanal für printf (STDOUT) */
48
#if (__AVR_LIBC_VERSION__ < 10400UL)
49
   fdevopen( uart_putchar, uart_getchar, 0 );
50
#else
51
   fdevopen( uart_putchar, uart_getchar);
52
#endif
53
54
    /* Rest des Programms */
55
56
    /* ... */
57
    while(1) {;}
58
    return 0;
59
}

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.