- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Messwert-Variablen auf LCD 16x2 ausgeben, will nicht per ITOA klappen

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1

    Messwert-Variablen auf LCD 16x2 ausgeben, will nicht per ITOA klappen

    Anzeige

    Praxistest und DIY Projekte
    Halle Freunde !

    Vieleicht habe ich mich wieder selbst verrant, aber ich komme einfach nicht weiter.
    Ich möchte Messwerte(Intergerwerte) auf einen Kontrolldisplay(Test mit 16x2) ausgeben. Aber das umwandlen der Integerwerte in einen String, den ich auf das LCD schreiben kann klappt nicht.
    Vielleicht fasse ich die Sache auch komplett falsch an. zu Testzwecken habe ich den Integer einfach mal mit einem Wert 250 belegt. Hier mein Code:

    Code:
    /**********************************************************************/
    //
    //  Microchip MPLABX  XC8 Compiler
    //
    /*********************************************************************/
    
    typedef unsigned char  uChr;
    
    /* ================================================================== */
    /*                                                                    */
    /*               LCD-Write uChar                                      */
    /*                                                                    */
    /* ================================================================== */
    
    void Lcd_Write_Char(uChr a)
    {
        RS=1;                // => RS = 1
        PDAT=a ;             // => Datenport = a
        EN = 1;              // => E = 1
        __delay_ms(1);
        EN = 0;              // => E = 0
        __delay_ms(1);
    }
    
    /* ================================================================== */
    /*                                                                    */
    /*               LCD-Write String                                     */
    /*                                                                    */
    /* ================================================================== */
    
    void Lcd_Write_String(uChr *a)
    {
         while(*a)  // bis Stringende( = 0)
         {
         Lcd_Write_Char( *a );
         a++;
         }
    }
    
    /**********************************************************************/
    
    void main(void)
    {   
        Lcd_Init();
    
        char Buffer[10];
        int i = 250; // Vorgegebener Wert zum Test
    
        itoa( i, Buffer, 10 );
    
        Lcd_Write_String(Buffer);
    
            while(1); // im Testmodus hier Halt
    }
    
    /**********************************************************************/
    Lcd_Write_String(Buffer) ist was immer bekrittelt wird vom Compiler : mein_lcd_16_2.c:71: warning: (357) illegal conversion of integer to pointer

    Nun verstehe ich nicht das es auf einen Integer bezogen ist, wo doch Buffer ein Chararray bzw String ist.

    Weiss wer bitte Rat ???

    Ich habe mich da festgefahren

    Gruss und Dank

    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo oderlachs,

    Buffer ist vom Typ char. Die Funktion Lcd_Write_String erwartet aber ein Argument vom Typ uChr * da ja mit (uChr *a) deklariert.

    Vielleicht geht die Warnung weg, wenn der Buffer auch vom Typ uChr ist.

    Ich hab ja wenig Ahnung von C und gefunden hab ich das, als ich Deinen Code mit AVR Studio 4 kompiliert habe. Da kommt dann als Warnung:
    Code:
    ../oderlachs.c:51:5: warning: pointer targets in passing argument 1 of 'Lcd_Write_String' differ in signedness [-Wpointer-sign]
    ../oderlachs.c:31:6: note: expected 'uChr *' but argument is of type 'char *'
    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    21.06.2011
    Ort
    Dresden
    Beiträge
    219
    evtl.: Lcd_Write_String(&Buffer[0]);
    mfg
    Achim

    Edit: Kann's nicht sein - bringt nur 'ne warnung in AS
    Geändert von seite5 (12.02.2019 um 19:18 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Hallo Searcher & seite5 !
    Danke für Eure Teilnahme an meinem Problem !!

    @Searcher Das AVR Studio war schon auf dem richtigem Wege uChar ist nicht Char !
    Habe mal den Sourcode geändert und einen uChr Cast gemacht erst mal um zu testen :
    Code:
    *****************************************************
     int i = 12345;
     itoa(Buffer,i, 10 );
     Lcd_Write_String((uChr)Buffer); 
    *****************************************************
    Und nun geht es !
    Ob es nun die "goldene Lösung " ist weiss ich nicht, aber ich kann erst mal mit dem gesamten Projekt weiter machen.
    Ich bin auch noch beim X8 -Compiler etwas in den Startlöchern, da ist oft viel "Manual-Studium" angesagt...
    1-Wire und DS18B20 werden mir bestimmt auch noch Fallstricke um die Füsse binden...

    Gruss und Danke

    Gerhard

    PS: auch war die ITOA-Func. falsch, muss in den Unterlagen fehlerhaftig sein...integer und buffer waren in der Reihenfolge falsch....
    Geändert von oderlachs (12.02.2019 um 19:54 Uhr) Grund: Nachtrag
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von oderlachs Beitrag anzeigen
    Code:
    /**********************************************************************/
    
    void main(void)
    {   
        Lcd_Init();
    
        uChr Buffer[10];
        int i = 250; // Vorgegebener Wert zum Test
    
        itoa( i, Buffer, 10 );
    
        Lcd_Write_String(Buffer);
    
            while(1); // im Testmodus hier Halt
    }
    
    /**********************************************************************/
    Ich hatte mir das ja mit "uChr Buffer[10]; " vorgestellt. s.o. . Aber wenns auch so geht ...

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Danke Searcher!.... das ich da nicht drauf gekommen bin...die einfachste Lösung...ja so ist es , wenn man sich mal festgefahren hat...

    Gruss
    Gerhard

    Edit:

    Dank der "Probleme" konnte ich meine LCD-Routinen um eine weitere ergänzen:
    Code:
    void LCD_Write_Buff(char Buffer[])
    {
        int x;
        int len;
        len = strlen( Buffer);    
        for(x=0; x<= len;x++)
            {
                if(Buffer[x]==0)
                     return;
                else
                 Lcd_Write_Char(Buffer[x]);
            }
    }
    So haben Probleme auch noch was Gutes an sich...
    Geändert von oderlachs (13.02.2019 um 11:02 Uhr) Grund: Nachtrag
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    deine Schleife ist irgendwie nicht richtig

    strlen kann auch 0 zurück geben und dann knallt es in deiner Schleife weil er das erste Zeichen ausgeben will obwohl da keines ist
    und wenn dein index = strlen erreicht rettet dich bestenfalls ein natürlich angehängter "0"-Terminator vor einem Pufferüberlauf

    ich würde es eher mit x < len statt <= versuchen

    Wen du ein Strign der größe 5 mit "12345" hast (also kein 0 Terminator) zum Beispiel, so würdest du dir auch dein if(Buffer[x]==0) sparen können, denn strlen sucht immer nach der letzten 0 und liefert die länge ohne Terminator zurück
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Danke Ceos !

    Muss ich mal überdenken, ...man ist ja lernwillig, .....stimmt das "if(Buffer[x]==0) " ist eigentlich hier überflüssig....
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von oderlachs Beitrag anzeigen
    Halle Freunde !

    Vieleicht habe ich mich wieder selbst verrant, aber ich komme einfach nicht weiter.
    Ich möchte Messwerte(Intergerwerte) auf einen Kontrolldisplay(Test mit 16x2) ausgeben. Aber das umwandlen der Integerwerte in einen String, den ich auf das LCD schreiben kann klappt nicht.
    Vielleicht fasse ich die Sache auch komplett falsch an. zu Testzwecken habe ich den Integer einfach mal mit einem Wert 250 belegt. Hier mein Code:

    Code:
    /**********************************************************************/
    //
    //  Microchip MPLABX  XC8 Compiler
    //
    /*********************************************************************/
    
    typedef unsigned char  uChr;
    
    /* ================================================================== */
    /*                                                                    */
    /*               LCD-Write uChar                                      */
    /*                                                                    */
    /* ================================================================== */
    
    void Lcd_Write_Char(uChr a)
    {
        RS=1;                // => RS = 1
        PDAT=a ;             // => Datenport = a
        EN = 1;              // => E = 1
        __delay_ms(1);
        EN = 0;              // => E = 0
        __delay_ms(1);
    }
    
    /* ================================================================== */
    /*                                                                    */
    /*               LCD-Write String                                     */
    /*                                                                    */
    /* ================================================================== */
    
    void Lcd_Write_String(uChr *a)
    {
         while(*a)  // bis Stringende( = 0)
         {
         Lcd_Write_Char( *a );
         a++;
         }
    }
    
    /**********************************************************************/
    
    void main(void)
    {   
        Lcd_Init();
    
        char Buffer[10];
        int i = 250; // Vorgegebener Wert zum Test
    
        itoa( i, Buffer, 10 );
    
        Lcd_Write_String(Buffer);
    
            while(1); // im Testmodus hier Halt
    }
    
    /**********************************************************************/
    Lcd_Write_String(Buffer) ist was immer bekrittelt wird vom Compiler : mein_lcd_16_2.c:71: warning: (357) illegal conversion of integer to pointer

    Nun verstehe ich nicht das es auf einen Integer bezogen ist, wo doch Buffer ein Chararray bzw String ist.
    Du bist in eine böse Falle getapt. An deinem Code ist eigentlich alles ok. Dein eigener Typ uChr hat dir zusätzlich die Sicht versperrt, lass ihn einfach weg. Ein String besteht aus chars, das reicht. Und wenn dein Datenport mit 8-Bit unsigned angesprochen werden will, dann caste vor der Ausgabe den char zum Standarddatentyp uint8_t (PDAT = (uint8_t)a;).

    Die Funktion itoa ist beim XC8 falsch implementiert. In den üblichen Dokumentationen kommt als Parameter zuerst der Integer und dann der String. Bei XC8 gehts genau anders herum. Daher hat er an erster Stelle bei deinem Aufruf von itoa einen Pointer erwartet, von dir aber einen Integer bekommen. Soweit ist die Fehlermeldung ok. Das Problem geht aber tiefer. Ich hab mal geschaut, ob diese Problem nicht anderswo erkannt worden ist und bin auf follgendes gestoßen XC8 Version 2.xx. Da itoa() in C99 nicht Pflicht ist, kommt das bei V2.00 und neuer von XC8 gar nicht mehr vor. du solltest also sprintf(Buffer, "%d", i); verwenden, das klappt dann auch mit den neuen Compilerversionen (ich bin bei V2.05).

    MfG Klebwax

    P.S. Noch etwas zu deiner Funktion void Lcd_Write_Char(uChr a). Daß du einfach char nehmen soltest, hab ich schon gesagt. Das Delay von einer Millisekunde ist viel zu groß, eine Mikrosekunde oder ein NOP() reicht da. Und nachdem EN auf low gesetzt wird, braucht man gar kein Delay. Die Zeit, die der Prozessor für das Return und den nächsten Funktionsaufruf braucht reicht da vollkommen. Die Funktion ist also rund zweitausend mal zu langsam.

    Und solche Kommentare wie " RS=1; // => RS = 1" sollte man vermeiden. Erstens sagt er das gleiche wie der Code, ist also überflüssig. Schlimmer aber, wenn du den Code mal änderst, wirst du den Kommentar nicht ändern. Dann stehen da zwei sich wiedersprechende Aussagen und machen dir das Leben schwer. Kommentieren sollte man nur, was nicht offensichtlich ist.
    Strom fließt auch durch krumme Drähte !

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    74
    Beiträge
    1.175
    Blog-Einträge
    1
    Hallo Klebwax !

    Danke für Deine ausfühlichen Ratschläge.
    Leider will der XC8 Compiler nichts mit uint8_t zu tun haben. Das ist auch noch ein weiteres Problem, das gewohnte C-Programmcode hier oft daneben geht.
    Auch bin ich , neben früheren "Ein Zwei Mal" Anwendungen, erst ab Ende vergangenen Jahres PIC- und MPLab-Aktiv geworden..da habe ich noch jede menge Lernbedarf
    Aber für meine Freizeitbeschäftigungs-Programmierung und Hobby, will ich nicht noch sonst was investieren(Compiler, IDEs usw.).

    Gruss und Dank

    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] GLCD mit ST7920 ...es will nicht klappen
    Von oderlachs im Forum PIC Controller
    Antworten: 9
    Letzter Beitrag: 05.02.2019, 11:00
  2. Bascom und Sinus will nicht klappen
    Von JollyJumper8 im Forum Software, Algorithmen und KI
    Antworten: 7
    Letzter Beitrag: 10.10.2009, 21:33
  3. Variablen ausgeben.
    Von Testman3000 im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 17.08.2007, 16:54
  4. Variablen auf Display ausgeben
    Von palermo im Forum C - Programmierung (GCC u.a.)
    Antworten: 20
    Letzter Beitrag: 22.12.2006, 10:55
  5. PWM mit Timer 1 will nicht klappen
    Von Speedking im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 29.07.2006, 03:02

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress