Frage zu einem Code

OP #562600
Lesenswert?
• ▲
▼
Hallo,

ich habe eine Frage zu folgendem Programm-Code den ich als Beispiel-Code 
bei WinARM gesehen habe. Also der Code funktioniert!
1
while(1) {
2

3
ADCR  |= (1UL<<24);  /* Start A/D Conversion (START:0=1) */
4
while ((ADDR & (1UL<<31)) == 0); /* Wait for the conversion to complete (DONE=1)*/
5
val = ((ADDR >> 6) & 0x03FF);  /* Extract the A/D result */
6
chan = ((ADDR >> 24) &0x0007); /* Channel (should be 0)  */
7
    
8
iprintf ("AIN%i: Digital Value %4u = %01u.%04u Volts\n",
9
  chan, (unsigned) val,
10
  (unsigned) (val * VREF) >> 10,                          /* Output Integer Portion */
11
  (unsigned) ((val * VREF * 10000UL) >> 10UL) % 10000);   /* Output Decimal Portion */
12

13
} // while

Mich interessiert die iprintf-Ausgabe. Und zwar der letzte Teil wo:
((val  VREF  10000UL) >> 10UL) % 10000 steht.
Was geschieht hier genau?

Val ist meine Variable in der der Wert vom A/D-Board steht. VREF ist 
fest auf 345/100 definiert.

Ich bekomme beispielsweise bei val den Wert 420 und als umgerechnetes 
Ergebnis 1,4150V.

Die erste Rechnung mit (val * VREF) >> 10 kann ich noch nachvollziehen. 
In der würde 420 * 345/100 stehen und es kommt heraus = 1449. Nur warum 
dieses schiften um 10?

Und wer kann mir die letzte Berechnung erklären mit der 
Modulo-Anweisung? Ich komme einfach nicht auf die 1,4150V die mir das 
Programm errechnet hat.

Danke
OP #562645
Lesenswert?
• ▲
▼
Könntest du mir vielleicht auch erklären warum die in ihrem Beispiel 
eine so komische Rechenart gewählt haben? Man hätte doch auch den 
analogen Wert (val) mit VREF (345/100) mal nehmen können.
Denn mit dieser Zusatzrechnung kommt man eher vom tatsächlichen 
Ergebnis, welche ich mit dem Messgerät nachgemessen habe ab.
Gast #562818
Lesenswert?
• ▲
▼
Tempo kann's nicht sein, da im printf() sowieso beliebig oft dividiert 
wird. Je nach Platform spart das allerdings die Fliesskommaroutinen ein, 
und damit Platz im ROM. Allerdings m.W. beim WinARM nur dann, wenn man 
das printf() der newlib meidet.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.