hi


also ich benutze ein zweites Netzteil mit dem ich 0V-2,5V anlegen kann und das is wie folgt angeschlossen

erste Stromquelle nur an VCC und GND um das board zu versorgen
zweite stromquelle am +pol mit dem gewünschten ADCpin verbunden (in meinem fall PA1) und am -pol mit GND verbunden
dann noch einen Kondensator von AREF zu GND (wobei es auch ohne den kondensator geht)

alles andere ist konfigurationssache des programms

mein programm:

ADC.c
Code:
#include <avr/io.h>
#include <avr/iom16.h>
#include <inttypes.h>
#include "ADC.h"


uint16_t ReadChannel(uint8_t mux)
{
 uint8_t i;
 uint16_t result;
 ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0); 	// Frequenzvorteiler
 												// setzen auf 8 (1) und ADC aktivieren (1)
 ADMUX = mux; 									// Kanal waehlen
 ADMUX |= (1<<REFS1) | (1<<REFS0); 				// interne Referenzspannung nutzen
 
 /* 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
 }
 result = ADCW; 	// ADCW muss einmal gelesen werden,
 					// sonst wird Ergebnis der nächsten Wandlung
 					// nicht übernommen.
 
 /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
 result = 0;
 for( i=0; i<4; i++ ) 
 {
  ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
  while ( ADCSRA & (1<<ADSC) ) 
  {
   ; // auf Abschluss der Konvertierung warten
  }
  result += ADCW; // Wandlungsergebnisse aufaddieren
 }
 ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
 result /= 4; // Summe durch vier teilen = arithm. Mittelwert
 return result;
}
main.c
Code:
#include <avr/io.h>
#include <avr/iom16.h>
#include <inttypes.h>
#include "ADC.h"
#define F_CPU 4000000UL
#include <util/delay.h>

int main (void)
{
 DDRA = 0;
 DDRD = 1;
 _delay_ms(500);
 PORTD = 0xff;
 _delay_ms(500);
 PORTD = 0x00;
 _delay_ms(500);
 uint16_t adcval = 0x00;
 while(1)
 {
  adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
  PORTD = adcval;
  _delay_ms(250);
 }
 return 0;
}
ADC.h
Code:
uint16_t ReadChannel(uint8_t mux);
ich benutze übrigens auch den ATmega 16 und das pollin board (allerdings zusammen mit dem addonboard)


mfg Grandalf