Forum: Mikrocontroller und Digitale Elektronik Modulo macht - 1


von Christian M. (krusti)


Lesenswert?

Hallo,
ich will mit Hilfe des Modulo-Operators eine Integer-Zahl in eine 
Dezimalzahl "wandeln" (Format xx.y) und über UART bzw LCD ausgeben. Mein 
Wert bevor ich ihn weiter verarbeite hat z.B. 316 nach dem Modulo ist 
der Wert 31.5 Woran liegt das?

Hier kommt noch der Code dazu, ist derzeit noch alles sehr experimentell 
gehalten.
1
        while (1) 
2
    {  
3
    adcValue = ADC_Read(ADC_CHANNEL);
4
    
5
    //////////////////////////////////////////////////////////////////////////
6
    //ADC-Wert ausgeben
7
    uart_puts("ADC-Wert: ");
8
    uart_puts(itoa (adcValue, s, 10));
9
    uart_putc('\0');    
10
    lcd_clear();
11
        
12
    lcd_setcursor(1,1);
13
    lcd_string("ADC-Wert: ");
14
    lcd_string(s);
15
    
16
    //////////////////////////////////////////////////////////////////////////
17
    //Druckwert ausgeben (noch nicht Dezimal)
18
    uart_puts(itoa (convert_ADC(adcValue), s, 10));
19
    uart_putc('\0');
20
    //Ergebnis => 316
21
    
22
    //////////////////////////////////////////////////////////////////////////
23
    //Dezimaler Druckwert
24
    uart_puts("Druck: ");
25
    uart_puts(itoa (convert_ADC(adcValue/10), s, 10));
26
    uart_puts(".");
27
    uart_puts(itoa (convert_ADC(adcValue%10), t, 10));
28
    uart_putc('\0');
29
    //Ergebnis => 31.5
30
    
31
    lcd_setcursor(2,1);
32
    lcd_string("Druck : ");
33
    lcd_string(s);
34
    lcd_string(".");
35
    lcd_string(t);
36
    lcd_string(" bar");
37
    //Ergebnis => 31.5
38
    
39
    uart_putc('\0');
40
    _delay_ms(1000);
41
  }

Ausgabe in hterm
ADC-Wert: 305
316
Druck: 31.5

Grüße

von Peter II (Gast)


Lesenswert?

welchen datentype hat adcValue

von Christian M. (krusti)


Lesenswert?

uint_16t

von Nop (Gast)


Lesenswert?

Zeig doch bitte außerdem mal den Code von convert_ADC(). Denn das 
scheint ja irgendwie aus 305 eine 316 zu machen. Schlimmstenfalls ist 
das ja auch noch als Makro definiert, mit überraschenden Effekten.

von Christian M. (krusti)


Lesenswert?

Nop schrieb:
> Zeig doch bitte außerdem mal den Code von convert_ADC(). Denn das
> scheint ja irgendwie aus 305 eine 316 zu machen. Schlimmstenfalls ist
> das ja auch noch als Makro definiert, mit überraschenden Effekten.

Die Wandlung von 305 zu 316 passt! Das ist nicht das Problem. Das ist in 
dem Bereich Zufall, dass es so nahe beieinander liegt.
Aber nicht die Wandlung von 316 in 31.5 => müsste 31.6 heißen eigentlich

von Nop (Gast)


Lesenswert?

Christian M. schrieb:
> Die Wandlung von 305 zu 316 passt!

Darum ging es nicht. Es ist eine Funktion, die etwas tut, und wenn die 
als Makro implementiert ist, dann kann das schon überraschende Effekte 
geben.

von Peter II (Gast)


Lesenswert?

ich glaube das Problem liegt bei convert_ADC(adcValue), du machst das 
Modulo vorher, das ist doch aber Unsinn.

Warum auch ständig convert_ADC aufrufen, das macht man einmal nach der 
Wandlung.

von Christian M. (krusti)


Lesenswert?

Peter II schrieb:
> ich glaube das Problem liegt bei convert_ADC(adcValue), du machst das
> Modulo vorher, das ist doch aber Unsinn.
>
> Warum auch ständig convert_ADC aufrufen, das macht man einmal nach der
> Wandlung.

Ah klar, dass könnte es sein. Ein Rundungsfehler quasi in meiner 
convert_ADC. Das habe ich nicht bedacht, aber könnte passen. Probiere 
ich aus.

Wie gesagt ist im Moment noch experimentell der ganze Code. Ich konnte 
schnell testen ob das richtige raus kommt in dem ich einfach Copy&Paste 
gemacht habe. Da es grundsätzlich geht, werde ich ständige Konvertierung 
natürlich jetzt raus machen. Dann wird man auch sehen ob meine Zahl 
wieder stimmt.

Danke allen schon mal

von Bastian W. (jackfrost)


Lesenswert?

Dein Faktor von ADC auf Druck sollte ja ca. 1,036 sein.
Beim ersten Modulo übergibst du ja nicht 305 sondern 30 was dann 31.088 
sind und das ist 31. Beim zweitenmal übergibst du 5 und das ist nach der 
Multiplikation 5.18 also 5.

Mach es wie weiter oben beschrieben einmal wandeln und dann davon den 
Modulo.

Gruß JackFrost

von Christian M. (krusti)


Lesenswert?

Jetzt klappt es auch mit der Nachkommastelle. Vielen Dank

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.