mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Nur ganze Zahlen? Wie Fliesskoma?


Autor: Fox (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen

So habe Hilfe eines bestehenden Beitrages das Display DIP-204-4 zu 
laufen gebracht! JUHU! (siehe 
Beitrag "LCD EA DIP204-4 Initialisieren") Vielen Dank für das 
Hinaufstellen  Jochen A. (neurotoxer).

Jetzt habe ich ein kleines Problem. Integer sind ja ganze Zahlen. Die 
Temperatur wird umgerechnet und anschliessend als ganze Zahl ausgegeben. 
Wie bekomme ich da ein Komma über? also z.B. 23.1°C???


Dann habe ich noch eine Frage: Wieso bekomme ich negative Zahlen, wenn 
ich den ADCW-Wert / 1024 * 150 rechne? Oder gar keine Zahl je nach 
Anordnung? Wenn ich aber mache 150/1024 = 0.1465 daher die Umwanldung 
auf die Temperatur value = value * 0.1465; funktioniert es.

150°C habe ich bei 1024 Bit.

Danke und Gruss Fox




#include <avr/io.h>
#include "display.h"
#include <stdlib.h>

#define F_CPU 8000000UL     /* Quarz mit 8.0Mhz */
#include <util/delay.h>

int main(void){
//  DDRC=0b00000001;    //led an PC0
  display_init();
  display_ptext("Display EA-DIP204-4",1,0);     //erstes Koma = Reihe  zweites Koma = Zeichenabstand von links
  display_ptext("mit ATMega8",2,0);
  display_ptext("Version 1.0",3,0);
  display_ptext("Temperaturmessung",4,0);
  //Endlosschleife



   DDRC = 0b11111100;            //
   PORTC = 0b0000000;             //


  ADMUX = 0;        // Für interne Referenzspannung   ADMUX = 0b11000000;
                          // auch ADMUX = 2; (Kanalnummer) oder ADMUX = 0b00000010;
  ADCSRA = 1<<ADEN | 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0;    // Initialisierung des ADC über das ADCSRA-Register

_delay_ms(3000);
display_command(LCD_CLEAR);  








  int x = 0;
int value;
int summe = 0;
int x1=0;

while(1){



while (x1<20){  //Mittelwertbildung aus 20Messungen

ADMUX = 0;  
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten 
  }

summe = summe + ADCW;

x1 = x1 + 1;



}

x1 = 0;
summe = summe * 0.05; //Division der 20 Messungen

       char ADCW0[20]; // in diesem {} lokal
       itoa( summe, ADCW0, 10 ); 




value = ADCW;
value = value * 0.1465;    // Umwandlung des ADCW-Wert
        char TempW[20]; // in diesem {} lokal
       itoa( value, TempW, 10 ); 





ADMUX = 1;  

  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten 
  }

        char ADCW1[20]; // in diesem {} lokal
       itoa( ADCW, ADCW1, 10 ); 




x = x+1;

        char Counter[20]; // in diesem {} lokal
       itoa( x, Counter, 10 ); 







  display_ptext( "Counter:",1,0);
  display_ptext( Counter,1,9);

  display_ptext( "Bitwert ADC 0:",2,0);
  display_ptext( ADCW0,2,15);

  display_ptext( "Bitwert ADC 1:",3,0);
  display_ptext( ADCW1,3,15);

  display_ptext( "Temperatur:",4,0);
  display_ptext( "    ",4,15);
  display_ptext( TempW,4,15);
  display_ptext( "C",4,18);



_delay_ms(333);







}



  while(1!=2);
  return 1;
}

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Komma bekommt man, indem man die Temperatur nicht in  Grad, sondern 
in Zehntelgrad berechnet. Also statt 23,1 eben 231. Und bei der Ausgabe 
aufs LCD setzt man dann einfach ein Komma an der richtigen Stelle 
dazwischen.

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok das tönt super! Kein Problem zu Berechnen. Diese Idee hatte ich auch 
schon.

Aber wie kann ich dieses Komma dort hineinfügen? Da habe ich keinen 
blassen Schimmer.

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wäre super, dann würde sich auch ein anderes Problem lösen, Wie kann 
ich an einen Bestehenden Wert noch C schreiben, also 23.1 C.

Das wäre ja dann hier irgendwo:
  display_ptext( TempW,4,15); 

habe schon probiert mit & Zeichen also TempW & " C" ... geht aber nicht 
so.

Autor: Jonny Obivan (-geo-)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Komma bekommst du so:

int Variableohnekomma = 231;
int hintermkomma;

hintermkomma = Variableohnekomma % 10;
Variableohnekomma /= 10;

// Inhalt von hintermkomma ist 1
// Inhalt von Variableohnekomma ist 23


//Jetzt einfach erst die Variableohnekomma ausgeben und anschließend ein 
Komma ausgeben und zum Schluss hintermkomma ausgeben.
printf("%d",Variableohnekomma);
printf(",");
printf("%d",hintermkomma);

Gruß
geo

Autor: Franz Hamberger (dl7avf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fox,

das Komma kannst du einbauen, wenn du die Zahl in zwei Komponenten 
zerlegst:
Vorkomma- und Nachkommaziffern, z.B. mit 'div' und 'sprintf':

char *sitofix2 ( char *string, int i )
  {
  div_t di = div(i, 100);    // Struktur für Quotient und Rest.
  char *sformat = i < 0 ? "-%d,%02d" : "%d,%02d";
  sprintf(string, sformat, abs(di.quot), abs(di.rem));
  return string;
  }

Hier wird aus der ganzen Zahl i ein String mit 2 Nachkommastellen 
erzeugt,
z.B. bei i=1234 wird string="12,34", also etwa so:

char s[20];
display_ptext( sitofix(s, 1234), 1, 0);

Schöne Grüsse,

Franz

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So Danke für Hilfe

Die Lösung ist nach  Jonny Obivan realisiert.
Nach  Franz Hamberger bekomme ich Fehler beim Komplieren: (sitofix2 ist 
nicht deklariert etc.


Jetzt funktioniert es:
//------------------------------------------------------------------------
//              Temperatur mit Koma Trennung
//------------------------------------------------------------------------

int Variableohnekomma = value;
int hintermkomma;

hintermkomma = Variableohnekomma % 10;
Variableohnekomma /= 10;

// Inhalt von hintermkomma ist 1
// Inhalt von Variableohnekomma ist 23


  printf("%d",Variableohnekomma);
        char Printf1[20]; // in diesem {} lokal
         itoa( Variableohnekomma, Printf1, 10 ); 

  display_ptext( Printf1,4,14);


  display_ptext( ".",4,16); //    printf(",");


  printf("%d",hintermkomma);
        char Printf2[20]; // in diesem {} lokal
         itoa( hintermkomma, Printf2, 10 ); 

  display_ptext( Printf2,4,17);

Autor: Fox (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So jetzt kommts langsam gut!

Was denkt Ihr, dass der Counter anspricht, muss ich praktisch Real-Time 
haben. Das Problem ist, dass mir der Wert pro Sekunde weiss nicht wie 
viel Male aktualisiert wird.

Was wäre die schlauste Lösung für ein Update alle 500-1000ms?

Gruss Fox

Autor: Franz Hamberger (dl7avf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fox,

hier die korrigierte Version:

... das Komma kannst du einbauen, wenn du die Zahl in zwei Komponenten
zerlegst:
Vorkomma- und Nachkommaziffern, z.B. mit 'div' und 'sprintf':

char *sitofix2 ( char *string, int i )
   {
   div_t di = div(i, 100);    // Struktur für Quotient und Rest.
   char *sformat = i < 0 ? "-%d,%02d" : "%d,%02d";
   sprintf(string, sformat, abs(di.quot), abs(di.rem));
   return string;
   }

Hier wird aus der ganzen Zahl i ein String mit 2 Nachkommastellen
erzeugt,
z.B. bei i=1234 wird string="12,34", also etwa so:

char s[20];
display_ptext( sitofix2(s, 1234), 1, 0); // <-- muss sitofix2 heissen.

Schöne Grüsse,

Franz

Autor: Alain F. (fox82)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Super stark! Jetzt kann ich beide Varianten anwenden.

Vielen Dank Franz Hamberger.

Der Code ist jetzt folgendermassen:
//------------------------------------------------------------------------
//              Temperatur mit Komma Trennung
//------------------------------------------------------------------------


char *sitofix2 ( char *string, int i )
   {
   i=value;                            //Temperaturmittelwerte
   div_t di = div(i, 10);                      // Struktur für Quotient und Rest. (10 bei 1 Komma 234 = 23.4)
   char *sformat = i < 0 ? "-%d.%01d" : "%d.%01d";        //(d= Digit daher 1 Kommastelle = 01d / . oder ,
   sprintf(string, sformat, abs(di.quot), abs(di.rem));
   return string;
   }

  
char s[20];
display_ptext( sitofix2(s, 1234), 4, 13); // <-- muss sitofix2 heissen.

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.