Printf und co

Begonnen von pic18, 25.12.2022, 17:51:44 CET

⏪ vorheriges - nächstes ⏩

pic18

Hallo, ich habe ein Programm welches Daten wahlweise auf USB Telnet oder JSON ausgibt.
Da ich da leicht das Ausgabeformat ändern kann (Hexadezimal, Dezimal, String, Char) habe ich die Funktion umgeschrieben damit die Anzeige auf LCD erfolgt. Das funktioniert soweit ganz gut.
Das ganze funktioniert wie die Funktion Printf. Diese Funktion war für mich schon immer ein rotes Tuch, da ich das mit den Platzhalter usw nicht kenne.

Mein Problem ist nun, wenn ich die Ausgabe mit einer zusätzlichen Funktion (ntohs) versehe, diese nicht Ausgeführt wird. Bei Telnet - Ausgabe usw funktioniert das ganze. Habt ihr da eine Idee, woran das liegen kann? Im Anhang sind Programmschnipsel von der Ausgabe. Die eigentliche Printout - Funktion habe ich jetzt hier nicht dabei, da sie zu groß ist. Hier habe ich eigentlich die Ausgabe nur auf die LCD umgeleitet. Die untere LCD zeigt die Ausgabe, nach dem ich ntohs() vorher ausgeführt habe. Die obere LCD ist die Ausgabe wie ich sie bisher gemacht habe. (ohne printout).
pS: Leider habe ich eine kleine Auflösung nehmen müsse, da die Bilddatei zu groß war. Ich hoffe Ihr könnt es trotzdem lesen
      case ausg_hk2:
            vl_ist=ntohs( UBAMonitorFast.tmpVLIst );
            rl_ist=ntohs( UBAMonitorFast.tmpRL );
            ww_ist=ntohs( UBAMonitorFast.tmpWW );
            atemp=ntohs( UBAMonitorSlow.temperaturAussen );
            LCD_clrhome;
            stdOut_mr =stdOut;
            stdOut = source_lcd;
            printOut(
                    "Vl_S:%bu\t"
                    "Vl_I:%0i\r"
                    "Rl_I:%0i\t"
                    "AT:%0i°C\r"
                    "P_Mx:%bu\t" 
                    "P_I:%bu\r"
                    "WW_I:%0i\t"
                    "SC:%c%c",
                    UBAMonitorFast.tmpVLSoll,
                    vl_ist, //ntohs( UBAMonitorFast.tmpVLIst ),
                    rl_ist, //ntohs( UBAMonitorFast.tmpRL ),
                    atemp,  //ntohs( UBAMonitorSlow.temperaturAussen ),
                    UBAMonitorFast.leistungMax,
                    UBAMonitorFast.leistungIst,
                    ww_ist, //ntohs( UBAMonitorFast.tmpWW ),
                    UBAMonitorFast.serviceCode
,
                    UBAMonitorFast.serviceCode[1]);
            stdOut=stdOut_mr;
            break;

lcd_ausgabe.jpg

ADMIN:
Habe das mal zusammen gefügt.

pic18

Ich habe mal eine Frage zur Steuerzeichen - Eingabe.
Wenn ich mit MPLABX.IDE folgende Steuerzeichen eingebe dann macht der Compiler folgenden Ascii-Code:
\n 0x0a
\r 0x0d
\t 0x09
\f 0x0c
\b 0x08
\a 0x07
ist das so richtig?

Leider kennt er das Zeichen für Veritkalen Tabulator nicht, also
\v 0x0b
laut Hilfe vom MPLABX sollte er es kennen. Allerdings ist hier immer ein "-Zeichen. Ich schreibe im Prog. immer bei char '\n' usw.
File Format Escape
A file format escape consists of the usual C language character escape sequences, "\\", "\a", "\b", "\f", "\n", "\r", "\t", "\v", with their usual meanings, namely, backslash, alert, backspace, form feed, newline, carriage return, horizontal tab, and vertical tab, respectively

gibt es irgend eine Möglichkeit \v den Ascii-Code zuzuordnen? Ich möchte damit in eine bestimmte Zeile auf meiner LCD springen.

vloki

Das geht meinem Gefühl nach mit so einem LCD nicht.
Die Zeilen haben je nach Display unterschiedliche Anfangsadressen.

Um welches Display geht es konkret?
MPLABX  XC8  KiCAD

pic18

normale Anzeige 4x20 mit HD4480 Treiber. Das \v will ich in meinen Programm verarbeiten.
void writeLCDRomData(const uint8_t const_c){  //für printOut

[sub]    extern uint8_t last_c;[/sub]
[sub]    uint8_t c;[/sub]
[sub]    [/sub]
[sub]    LCDpos l_pos;[/sub]
[sub]    uint8_t zeile, spalte, tab;[/sub]
[sub]    [/sub]
[sub]    c= const_c;[/sub]
[sub]    /*[/sub]
[sub]    if (last_c=='\t'){[/sub]
[sub]        last_c =0;[/sub]
[sub]        l_pos= LCD_wherexy();[/sub]
[sub]        tab= c-0x30;    //0x30 muß voher addiert werden , ohne Prüfung!![/sub]
[sub]        zeile = (l_pos.zeile);[/sub]
[sub]        LCD_gotoxy(tab,zeile);[/sub]
[sub]    }[/sub]
[sub]    */[/sub]
[sub]    switch (last_c){[/sub]
[sub]        case '\t':[/sub]
[sub]            last_c =0;[/sub]
[sub]            l_pos= LCD_wherexy();[/sub]
[sub]            tab= c-0x30;    //0x30 muß voher addiert werden , ohne Prüfung!![/sub]
[sub]            zeile = (l_pos.zeile);[/sub]
[sub]            LCD_gotoxy(tab,zeile);[/sub]
[sub]        break;[/sub]
[sub]       // case'\v':   //[/sub]
[sub]       //     last_c =0;[/sub]
[sub]        //    zeile = c-0x30;[/sub]
[sub]        //    LCD_gotoxy(0,zeile);[/sub]
[sub]        //    break;[/sub]
[sub]        default:[/sub]
[sub]            switch (c){[/sub]
[sub]               case '\n':   //setzt crsr auf letze Spalte (nur zähler)[/sub]
[sub]                   akt_pos.nok=1;[/sub]
[sub]                   letzte_pos.spalte_nok=19;[/sub]
[sub]                   //        LCD_cr();  //hier wird sonst die letzte Zeile immer gescrollt, daher nicht genutzt[/sub]
[sub]                   break;[/sub]
[sub][/sub]
[sub]               case '\r':[/sub]
[sub]                   break; //tue nichts[/sub]
[sub][/sub]
[sub]               case '\t':  //tabulator aktuelle Zeile pos 10[/sub]
[sub]                   last_c ='\t';[/sub]
[sub]                   break;[/sub]
[sub]                   [/sub]
[sub]               //case '\v':[/sub]
[sub]               //    last_c ='\v';[/sub]
[sub]                //   break;[/sub]
[sub]                   [/sub]
[sub]               case '\f':[/sub]
[sub]                   LCD_clrhome;[/sub]
[sub]                   break;[/sub]
[sub][/sub]
[sub]               case '°':[/sub]
[sub]                   c = 0xdf;[/sub]
[sub]                   break;[/sub]
[sub][/sub]
[sub]               case 'Ö':[/sub]
[sub]               case 'ö':   [/sub]
[sub]                   c = 0xef;[/sub]
[sub]                   break;[/sub]
[sub][/sub]
[sub]               case 'Ü':[/sub]
[sub]               case 'ü':   [/sub]
[sub]                   c = 0xf5;[/sub]
[sub]                   break;[/sub]
[sub][/sub]
[sub]               case'Ä':[/sub]
[sub]               case'ä':[/sub]
[sub]                   c = 0xe1;[/sub]
[sub]                   break;[/sub]
[sub][/sub]
[sub]               case 'µ':[/sub]
[sub]                   c = 0xe4;[/sub]
[sub]                   break;[/sub]
[sub][/sub]
[sub]               case 'ß':[/sub]
[sub]                   c = 0xe2;  [/sub]
[sub]                   break;[/sub]
[sub]            }[/sub]
[sub]            if ((c >31) && (last_c !='\t')){    //keine Steuerzeichen[/sub]
[sub]    //_______________________________________[/sub]
[sub]            //if (c !='\n')   //damit nicht zweimal ausgeführt[/sub]
[sub]            if (akt_pos.nok == 1)[/sub]
[sub]                if (letzte_pos.spalte_nok == 19)	//spalte =19, mr=0 also nicht durch gotoxy usw gesetzt, heißt letzte position gültig[/sub]
[sub]                {[/sub]
[sub]                    LCD_cr();[/sub]
[sub]                }[/sub]
[sub]    //_______________________________________[/sub]
[sub]            writeLCDData(c);[/sub]
[sub]            }[/sub]
[sub]            //break;  //von default switch (last_c) nicht notwendig[/sub]
[sub]     }[/sub]
 }
PS, ich weis jetzt nicht warum hier ständig eingefügt ist. Wahrscheinlich Tabulator

vloki

Hmm, ich habe das anfangs wohl nicht so richtig verstanden ;-)

Die IDE oder der C18 Compiler mäkelt bei mir zwar auch am '\v' rum,
macht es dann aber eigentlich doch wie gewünscht.
MPLABX  XC8  KiCAD

pic18

ja, er meckert, interpretiert aber wahrscheinlich als 'v' und nicht als 0x0b. Ich weiß nicht ob ich in meiner printOut Funktion einfach den Ascii-Code 11 ohne Einführungszeichen schreiben kann. 

vloki

Ob da jetzt '\v', 0x0B, oder 11 steht, sollte piep egal sein.

Rechts im Fenster vom Debugger in meinen Screenshot76 sieht man,
dass '\v' richtig als 0xb interpretiert wurde.

Wird da ja sogar noch zusätzlich als "VT" angezeigt.

Angehalten hat der Debugger auch an der richtigen Stelle. (i=6)
MPLABX  XC8  KiCAD

pic18

ok, mein Prog. hat aber nicht funktioniert. Ich probiers mal mit dem Ascii code 11.

Schnellantwort

Name:
Verifizierung:
Bitte lassen Sie dieses Feld leer:
Geben Sie die Buchstaben aus dem Bild ein
Buchstaben anhören / Neues Bild laden

Geben Sie die Buchstaben aus dem Bild ein:

Tastenkürzel: Alt+S Beitrag schreiben oder Alt+P für Vorschau