www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik umrechnung von zahlen + ausgabe auf LCD


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich versuche eine ausgabe auf einem LCD zu programmieren ! die 
displayansteuerrung funktioniert ohne probleme ! als µC verwende ich den 
PIC 16F877

was stimmt an diesem unterprogramm nicht ? ich möchte eine zahl 
ausgeben, alledings bekomme ich am display nur irgendwelche 
sonderzeichen !


void ADC_UMRECHNUNG(int16 x)
{

  uns8 t, h, z, e;

 if (x.15 == 1)
  {
   LCD_1 = '-';
  }
 else
  {
   LCD_1 = ' ';
  }
  h = x / 100;
  z = x % 100;
  z = z / 10;
  e = x % 100;
  e = e % 10;
  h = 0x30 + h;
  z = 0x30 + z;
  e = 0x30 + e;
  LCD_2 = h;
  LCD_3 = z;
  LCD_4 = e;
}

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vermutlich musst du zur zahl,die du ausgeben willst 48 dazuzählen damit 
das ganze im ascii - code wieder stimmt.
schau mal auf http://www.asciitable.com

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab mir die zeichentabelle des LCD angeschaut und laut der mus ich 
0x30 dazuzählen !

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0x30 ist 48.
Das eine ist Hex, das andere Dezimal.

Du mußt Deinen Wert als BCD-Zahl darstellen. D.h. die einzelnen Werte 
von h,z,e dürfen nicht größer als 9 sein. Dann müßen hierzu 0x30 addiert 
werden.
Überprüf doch mal, was in diesen drei Variablen steht bevor Du 0x30 
addierst.

Ansonsten kann ich mir nur vorstellen, daß die Zeichen zu schnell 
nacheinander ausgegeben werden und das Display hier nicht mitkommt.
Ist aber nur eine Vermutung.

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi chris,

Wenn x zwischen 0 und 999 liegt, sind h,z,e richtig. Da mußt Du nichts 
überprüfen.

Für x<0 (kann man in C auch so abfragen, statt x.15==1) solltest du 
allerdings noch ein x=-x; einfügen.

t kann weg und mit e=x%10; ist das gleiche wie e=x%100; e=e%10;

Peter

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was bewirkt das x =-x ? das verstehe ich momentan nicht !

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Chris,
vielleicht liegt das Problem in Deinem Datenformat. Du teilst eine 
16bit-Zahl durch eine 8bit-Zahl. Ist x > 255 (ist doch der Wert aus dem 
AD-Wandler, oder?), dann funktioniert die Rechnung nicht mehr.
Gruß Oliver

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
x ist der wert aus dem 10Bit ADC !

wie soll ich es deier meinung nach lösen ?

Autor: AndreasH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 10 bit kann Deine Zahl maximal 3FFh groß sein. Dies ist dezimal 
1023. D.h. zu deinen h,z,e muss noch ein t für die tausender dazu und 
entsprechend Deiner Umwandlung noch mitberücksichtigt werden.

  t = x / 1000;
  h = x % 1000;
  usw.
  .
  .
  .
  t = 0x30 + t;
  h = 0x30 + h;
  z = 0x30 + z;
  e = 0x30 + e;
  LCD_2 = t;
  LCD_3 = h;
  LCD_4 = z;
  LCD_5 = e;

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi chris,

mit x=-x; wird x positiv wenn es vorher kleiner 0 war. Sonst berechnest 
Du nur Mist...

/* -9999 <= x <= 9999, immer 4 stellig, also z.B. 0012 */
void ADC_UMRECHNUNG(int16 x)
{
  if(x<0)
  {
    LCD_1='-';
    x=-x;
  }
  else
    LCD_1=' ';

  LCD_5=x%10+0x30; x/=10; /* 3 stellig bis 999, diese Zeile weg */
  LCD_4=x%10+0x30; x/=10;
  LCD_3=x%10+0x30; x/=10;
  LCD_2=x+0x30;
}

Peter

PS: bist Du sicher, das LCD_1,... korrekt auf dem Display ausgegeben 
wird? Du kannst ja mal probeweise am Ende der Funktion ein 
LCD_1=LCD_2=LCD_3=LCD_4=LCD_5='8'; einfügen, dann sollte 88888 
erscheinen.

wieso besitzt dies Forum eigentlich keinen Preview Knopf?

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke peter k. !

dein toller code funktioniert schon fast !

alle stellen ausßer LCD_2 funktionieren ! auf LCD_2 bekomme ich einen 
Buchstaben ausgegeben !

eine lösungsidee ?

Autor: Peter K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann ist deine Zahl vom Betrag zu groß.Also eine Stelle mehr benutzen:

LCD_6=x%10+0x30; x/=10;
vor die Zeile
LCD_5=x%10+0x30; x/=10;
schreiben.

Peter

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke ! jetzt geht es !

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.