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


von user (Gast)


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


    }


}

von Tabellator (Gast)


Lesenswert?

Vielleicht nur ein Anzeigeproblem.

Korrigier mal
1
 lcd_clear;  // LCD Display reseten

zu lcd_clear();

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

von user (Gast)


Lesenswert?

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

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.