www.mikrocontroller.net

Forum: Compiler & IDEs ADC in String umwandeln


Autor: JannikS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Ich habe mich eben an einer AD wandlung versucht.

Wenn ich das Ergebnis auf dem LCD ausgeben möchte erhalte ich nur Werte 
von 0-258. Es sollte ja von 0-1024 bei 10 Bit sein.

Ich denke mein Fehler liegt in der Umformung.

Hier mal mein Code:

unsigned int adcval;
char adcbuffer[33];

if (channel == 2){
ADMUX = 0x42; // MUX ADC2
}

ADCSRA |= (1<<ADSC);

while ( ADCSRA & (1<<ADSC) ) {
}


adcval = ADCL;
adcval += ADCH;
itoa(adcval, adcbuffer,10);

lcd_write_txt(adcbuffer);

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> adcval = ADCL;
> adcval += ADCH;

Du hast einfach nur Low- und High-Byte addiert.

Besser:
adcval = ADCL;
adcval += ADCH << 8;

Noch besser:
adcval = ADC;

Autor: JannikS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhh, wunderbar. Es funktioniert. So einfach ist das also :)

Autor: JannikS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt wo die Ausgabe sauber funktioniert (werte von 0-1023), würde ich 
diese auch gerne einer Spannung zuordnen.

Das was ich hinbekomme ist, dass ich Ganzzahlen von 0-4 (Volt) ausgeben 
kann.
Nur meine Nachkommastellen verschwinden. Wär super wenn ihr mir da auch 
noch mal weiterhelfen könnt. Hier wieder ein Auszug:
unsigned int adcval;
unsigned int adcbuffer;
float result;


void lcd_write_txt(char *txt) {
  while(*txt) {
        lcd_write(*txt);
        txt++;
  }
}

int adc_getval(int channel){
      
  if (channel == 0){
    ADMUX = 0x40; // MUX ADC0 Uref = 5V
  }
      
  if (channel == 1){
    ADMUX = 0x41; // MUX ADC1 Uref = 5V
  }
      
  if (channel == 2){
    ADMUX = 0x42; // MUX ADC2 Uref = 5V
  }
      
  ADCSRA |= (1<<ADSC);
      
  while ( ADCSRA & (1<<ADSC) ) {
  }    


  adcval = ADCL;
  adcval += ADCH <<8;
      
  result = adcval*(5.0/1024.0);    
      
  itoa(result, adcbuffer,10);  

    return adcbuffer;
}

int main (void){
lcd_write_txt(adc_getval(0));
}

Ich tippe irgendwie auf die nutzung von itoa(); und meine funktion 
müsste ja eigentlich auch einen char zurückgeben. Wenn ich diese als 
char deklariere kommt die Warnung vom Compiler: passing argument 2 of 
'itoa' makes pointer from integer without a cast.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Festkommaarithmetik!
Gleitkomma-Berechnungen sind auf einem µC nicht nur Ressourcenfresser, 
sondern in diesem Fall auch völlig unsinnig.

Und die Funktion heißt nicht umsonst itoa (integer to ascii), weil 
sie integer-Werte (ganzzahlige Werte) in einen ASCII-String 
konvertiert, und mit float nix anfangen kann. Und in integer gibt es 
nunmal keine Nachkommastellen. Für Gleitkommawerte gibt es zwar 
dtostrf bzw. dtostre , aber wie schon gesagt, lass es lieber sein.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach übrigens: Du solltest Dir dringendst mal die Dokumentation der 
Funktion itoa in der libc-Doku anschauen! Das mit Deinem adcbuffer 
kann so nicht funktionieren. Ein String wird in C als Array of char 
abgelegt und ist außerdem noch nullterminiert, braucht also ein Zeichen 
mehr als der eigentliche String hat. Wenn Du etwas Sinnvolles 
rausbekommen willst, dann so
char adcbuffer[5];
Das reicht dann für eine Vorkommastelle, den Dezimalpunkt und zwei 
Nachkommastellen (wie man die in integer berechnet, müsstest Du eben 
anhand des Artikels Festkommaarithmetik herausfinden). Und das itoa 
machste entweder in main oder Du gibst einen Zeiger auf den Buffer 
zurück.

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.