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