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


von chris (Gast)


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;
}

von Florian (Gast)


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

von chris (Gast)


Lesenswert?

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

von AndreasH (Gast)


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.

von Peter K. (Gast)


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

von chris (Gast)


Lesenswert?

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

von Oliver (Gast)


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

von chris (Gast)


Lesenswert?

x ist der wert aus dem 10Bit ADC !

wie soll ich es deier meinung nach lösen ?

von AndreasH (Gast)


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;

von Peter K. (Gast)


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?

von chris (Gast)


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 ?

von Peter K. (Gast)


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

von chris (Gast)


Lesenswert?

danke ! jetzt geht es !

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.