Forum: Mikrocontroller und Digitale Elektronik Modulo macht - 1


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christian M. (krusti)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
welchen datentype hat adcValue

von Christian M. (krusti)


Bewertung
0 lesenswert
nicht lesenswert
uint_16t

von Nop (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Jetzt klappt es auch mit der Nachkommastelle. Vielen Dank

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]
  • [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.