www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Char vs. Hex


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich hoffe ihr könnt mir diesmal wieder helfen, ich glaube es ist nur 
eine Kleinigkeit aber ich komm einfach nicht drauf.
Ich habe eine Funktion die einen Charakter an einer bestimmten Position 
auf meinem Display ausgibt (dank eurer Mithilfe funktioniert dies auch 
nun wunderbar).
So nun möchte ich Werte z.b. vom ADC oder ähnlichem ausgeben können.
Hierbei existiert eine funktion welche die Zahl einliest in z.b. 
Tausneder Hunderter Zehner und Einer zerlegt in ein Array speichert und 
dann über die charakter ausgabe ausgibt.
Leider funktioniert das ganze nicht.

Daher meine Frage einmal sage ich der sendefunktion sende '1' und ein 
zweites mal sende 0x31, muss ich hier noch anpassungen vornehmen, denn 
0x31 enspricht doch laut asciicode der "1"

ich danke euch =)

Autor: Thomas Klima (rlyeh_drifter) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vorsicht! Die Frage ist schon schwammig.

1 != "1" != '1' = 0x31 = 49

1    .. Zahl (mit einer Ziffer)
"1"  .. String mit Länge 2 und dem Inhalt {'1', '\0'}
'1'  .. Der Wert des ASCII Einser-Zeichens
0x31 .. hexadezimale Darstellung des ASCII Wertes
49   .. dezimale Darstellung des ASCII Wertes

Bau die Funktion so, dass sie den Wert des ASCII Zeichens erwartet, dann 
ists egal welche der drei letzten Varianten du der Funktion übergibst.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeile 42!

(zeig deinen Code)

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner Hinweis noch, wenn ich die 0x31 in meine lcd_draw_char Funktion 
eingebe erhalte ich die "1" auf meinem Display sprich das Funktioniert.
void lcd_draw_double (FONT_P font, uint8_t u8_Style, double dbl_value, uint8_t u8_length, uint8_t u8_decimals, uint8_t u8_x_pos, uint8_t u8_y_pos, uint8_t u8_Brightness)
{
  uint32_t u32_converted_value;
  uint8_t u8_output_data[16];
  uint8_t u8_x = 0;
  uint32_t u32_factor = 0;
  uint8_t u8_leading_zeros_over = false;
  
  uint8_t u8_ColCount = 0;
  uint8_t char_width = 0;

  u32_factor = 1;
  for (u8_x = 0 ; u8_x < u8_decimals ; u8_x++)
  {
    u32_factor *= 10;
  }

  u32_converted_value = u32_factor * dbl_value;
  

  // -> Zahl ausgeben
  if (u8_decimals == 0)
  {
    // -> Keine Dezimalstellen
    // -> Vollen Platz für Zahl nutzen

    u32_factor = 1;
    for (u8_x = 0; u8_x < u8_length ; u8_x++)
    {
      u8_output_data[u8_x] = (u32_converted_value % (10 * u32_factor)) / u32_factor;
      u32_factor *= 10;
    }

    
    // -> Führende Nullen löschen
    // -> Zu ASCII aufbereiten
    // -> Zeichen ausgeben
    for (u8_x = 0; u8_x < u8_length ; u8_x++)
    {
      if ( (u8_output_data[u8_length - 1 - u8_x] == 0) && (u8_leading_zeros_over == false) )
      {
        u8_output_data[u8_length - 1 - u8_x] = ' ';
      }
      else
      {
        u8_output_data[u8_length - 1 - u8_x] |= 0x30;
        u8_leading_zeros_over = true;
      }

      if ( (u8_x == u8_length - 1) && (u8_leading_zeros_over == false) )
      {
        u8_output_data[u8_length - 1 - u8_x] = 0x30;
      }
      
      // Buchstaben ausgeben
      lcd_draw_char(font, u8_Style, u8_output_data[u8_length - 1 - u8_x], (u8_x_pos + u8_ColCount), u8_y_pos, u8_Brightness);
  
      // Zeichenende berechnen
      char_width = font_get_char_width(font,u8_output_data[u8_length - 1 - u8_x]);
  
      // Zähler auf Leerstelle hinter Zeichen setzen
      u8_ColCount += char_width + 1;
    }
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:

> So nun möchte ich Werte z.b. vom ADC oder ähnlichem ausgeben können.

OK

> Hierbei existiert eine funktion welche die Zahl einliest in z.b.
> Tausneder Hunderter Zehner und Einer zerlegt in ein Array speichert und
> dann über die charakter ausgabe ausgibt.

Ich habe das Gefühl du machst dir hier viel zu viel Arbeit. Und die dann 
auch noch fehlerhaft.

Fang damit an, dir eine Funktion zu schreiben, die Strings ausgibt. Dann 
formst du deinen Wert in einen String um und gibst den String aus.

Damit bist du universeller, denn Stringausgabe braucht man genauso 
ständig.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
u8_output_data[u8_length - 1 - u8_x] |= 0x30;


wenn das das konvertieren in ascii sein soll. würde +0x30 besser 
passen...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> Kleiner Hinweis noch, wenn ich die 0x31 in meine lcd_draw_char Funktion
> eingebe erhalte ich die "1" auf meinem Display sprich das Funktioniert.

Dachte ichs mir doch.

Betreib Arbeitsteilung!

Zahl -> String
String ausgeben

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist es denn Ratsam die bereits vorhandenen Funktionen wie sprintf zu 
benutzen oder raubt mir das zuviel Speicherplatz?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> ist es denn Ratsam die bereits vorhandenen Funktionen wie sprintf zu
> benutzen oder raubt mir das zuviel Speicherplatz?

Das kannst nur du wissen, ob das zuviel Speicher braucht.
Wenn du aber sowieso wegen Speicher Sorgen hast, frag ich mich, wozu du 
dann überhaupt Gleitkomma im System hast

(Anstelle der eierlegenden Wollmilchsau sprintf, gibt es dann ja auch 
noch dtostrf)

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.