mikrocontroller.net

Forum: Compiler & IDEs printf mit fleury lcd lib probleme


Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdio.h>
#include "lcd.h"

int main(void)
{

  fdevopen(lcd_putc,NULL, 0);  //hier bekomme ich die Fehlermeldung

  /* initialize display, cursor off */
    lcd_init(LCD_DISP_ON);
    printf("Hello, world!\n");


while(1)
{}
}


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.

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

Autor: Dennis (Gast)
Datum:

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

Autor: Pete K. (pete77)
Datum:

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

Autor: risu (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Steffen.

Autor: gerd (Gast)
Datum:

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

Autor: gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,


jetzt bin ich erst einmal einen guten Schritt weiter gekommen.

Ich habe die Fleury LCD Funktion folgendermaßen angepasst:
int lcd_putc(char c)
{
...
return 0;

}

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


jetzt:

int main(void)
{

  /* initialize display, cursor off */
    lcd_init(LCD_DISP_ON);
  /* clear display and home cursor */
    cd_clrscr();
  stdout = &mystdout;
    printf( "Hello %d !",555);
 
while(1){}
}

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:

int lcd_putc(char c, FILE *stream)
{
//bla bla
}

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wir unterhalten uns ja über diesen Abschnitt aus dem 
AVR-GCC-Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

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?
#include <avr/io.h>
#include <stdio.h>
#include "lcd.h"

int my_lcd_putc(char c, FILE *stream);

static FILE mystdout = FDEV_SETUP_STREAM( my_lcd_putc, NULL, _FDEV_SETUP_WRITE );

int my_lcd_putc(char c, FILE *stream)
{
  lcd_putc(c);
  return 0;
}

int main(void)
{
  /* initialize display, cursor off */
  lcd_init(LCD_DISP_ON);
  /* clear display and home cursor */
  lcd_clrscr();
  
  stdout = (FILE *) &mystdout;
  printf( "Hello %d !",555);
 
  while(1)
  { 
    // für immer
  }

  return 0;
}


Autor: Werner B. (werner-b)
Datum:

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

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal herausgesucht wie ich das "gelöst" habe...
#include <stdio.h>

/* ####################################### *\
 *  Routine für die serielle Ausgabe 
\* ####################################### */
#if (__AVR_LIBC_VERSION__ < 10400UL)
int16_t uart_putchar( char c )
{
   if ( c == '\n' )
      serialPutChar( '\r' );
   serialPutChar( c );
   return ( 0 );
}
#else
int16_t uart_putchar( char c, FILE *f )
{
   f = f; /* keep the compiler happy */

   if ( c == '\n' )
      serialPutChar( '\r' );
   serialPutChar( c );
   return ( 0 );
}
#endif

/* ####################################### *\
 *  Routine für die serielle Eingabe
\* ####################################### */
#if (__AVR_LIBC_VERSION__ < 10400UL)
int16_t uart_getchar( void )
{
   return (int16_t)serialGetChar();
}
#else
int16_t uart_getchar( FILE *f )
{
   f = f; /* keep the compiler happy */

   return (uint16_t)serialGetChar();
}
#endif


int main()
{
    serialPortInit( BAUD_RATE, NO_PARITY, BITS_8, STOP_1 );
   /* öffnet einen Kanal für printf (STDOUT) */
#if (__AVR_LIBC_VERSION__ < 10400UL)
   fdevopen( uart_putchar, uart_getchar, 0 );
#else
   fdevopen( uart_putchar, uart_getchar);
#endif

    /* Rest des Programms */

    /* ... */
    while(1) {;}
    return 0;
}

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.