mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Rechnet nicht richtig.


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo. Folgendes problem:
void auswertung (void) {
  unsigned char buffer [5] = {0,0,0,0,0};
  itoa (count, buffer, 10);  
  lcd_gotoxy (0,0);
  lcd_puts ("count: ");
  lcd_puts (buffer);

  long time;
  time = count * 547;
  unsigned char buffer2 [10] = {0,0,0,0,0,0,0,0,0,0};
  ltoa (time, buffer2, 10);
  lcd_puts ("\ntime: ");
  lcd_puts (buffer2);  
}

count enthält den wert 190.
wird auch richtig auf dem display angezeigt.
nun müsste logischerweise als 2. wert 105.024 (192 * 547) aufm display
stehen. es steht aber 28.105 auf dem display !?

was mach ich falsch ?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf 28105 komme ich nicht, bei mir sind es 39488.
Was auf jedenfall falsch ist, es fehlt long, denn der Compiler rechnet
nur mit int, wenn count auch vom typ int ist:

time = (long)count * 547;

Autor: Thomas Stütz (tstuetz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem solltest du den beiden Puffern noch ein zusätzliches Zeichen
spendieren - Strings in C haben meist noch ein "\0"=0x00 am Ende

du solltest auch anstatt long/int/char vielleicht
unsigned long/unsigned int/unsigned char verwenden.
Angenommen count ist ein char => 190=C0h => oberstes Bit gesetzt
Zahl is negativ, bei der Berechnung kommt was negatives raus.

Gruss

Autor: Thomas Stütz (tstuetz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, kleiner Lapsus: 190 ist BEh und nicht C0h (192) das besagte 7.Bit
ist aber auch da gesetzt.

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler macht leider keine automatische Typwandlung, wenn man zwei
16-Bit Werte multipliziert und sie einer 32-Bit Variablen zuweist.
Bezihungsweise macht er die Typwandlung erst nach der Multiplikation.
Dadurch gehen die oberen 16 Bit der Produkts verloren.
Also schreib entweder:
time = (long)count * 547;
oder
time = count * 547L;

Uwe

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.