mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmel ATmega8L ADC Werte lauter falsche Werte


Autor: user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich versuche jetzt schon den halbe Tag eine Spannung mit einem 
atmega8L zu messen. Das klappt auch ansatzweise. Um mir die Werte 
anzeigen zu lassen verwende ich ein 2x16 Zeichen LCD Display. Allerdings 
sind die Werte die dort angezeigt werden immer deutlich höher als 1024 
und das ist doch theoretisch gar nicht möglich oder? Der Quellcode 
stammt größtenteils aus dem AVR-GCC-Tutorial. Als Testspannung verwende 
ich einen Handelsüblichen AA Akku mit 1,2V. Hier mal der Programmcode..



#include <avr/io.h>
#include "lcd-routines.h"
#include <util/delay.h>


int main(void)
{


  void ADC_Init(void) {

  uint16_t result;

  ADMUX = (1<<REFS1) | (1<<REFS0);      // interne Referenzspannung 
nutzen
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren

  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man 
liest
  also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" 
*/

  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung
  while (ADCSRA & (1<<ADSC) );          // auf Abschluss der 
Konvertierung warten
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
  Wandlung nicht übernommen. */
  result = ADCW;
  }



  /* ADC Einzelmessung */
  uint16_t ADC_Read( uint8_t channel )
  {
  // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
  while (ADCSRA & (1<<ADSC) )     // auf Abschluss der Konvertierung 
warten

  return ADCW;                    // ADC auslesen und zurückgeben
  }

  /* ADC Mehrfachmessung mit Mittelwertbbildung */
  uint16_t ADC_Read_Avg( uint8_t channel, uint8_t average )
  {
  uint32_t result = 0;

  for (uint8_t i = 0; i < average; ++i )
  result += ADC_Read( channel );

  return (uint16_t)( result / average );
  }




  lcd_init(); // LCD Display intialisieren
  ADC_Init(); // ADC intialisieren


    while(1)
    {


  lcd_clear;  // LCD Display reseten


  uint16_t adcval;
  adcval = ADC_Read_Avg(0,5); // Analogwert auslesen

  char Buffer[10];
  itoa( adcval, Buffer, 10 ); // Analogwert umwandeln in String

  lcd_setcursor( 0, 2 );
  lcd_string(Buffer); // Stringwert auf LCD ausgeben


    }


}

Autor: Tabellator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht nur ein Anzeigeproblem.

Korrigier mal
 lcd_clear;  // LCD Display reseten

zu lcd_clear();

Und schalt die Compiler-Warnings ein, da hätte der GCC schon meckern 
müssen.

Autor: user (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja Danke jetzt geht alles wie es sollte.
Ein kleiner Fehler mit großen Auswirkungen...

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.