Hallo Bernhard,
vielen, vielen Dank für deine Antwort !!!!
Es funktioniert einwandfrei !!!!
Hier der Code für die anderen Leute, die es interessiert und die eine Lösung suchen.
Code:
#include <avr/io.h>
void adc_init (void){
//interne Referenzspannung
//ADMUX = 0xC0;
//AVCC
//ADMUX = 0x40;
//AREF
ADMUX = 0xC0;
ADCSRA = 0x80; //ADC aktivieren, Rest 0 setzen
//ADCSRA |= 0x01; //Vorteiler 2
//ADCSRA |= 0x02; //Vorteiler 4
//ADCSRA |= 0x03; //Vorteiler 8
//ADCSRA |= 0x04; //Vorteiler 16
ADCSRA |= 0x05; //Vorteiler 32
//ADCSRA |= 0x06; //Vorteiler 64
//ADCSRA |= 0x07; //Vorteiler 128
ADCSRA |= (1<<6); //Konvertierung starten
while(ADCSRA & (1<<6)){}; //Kovertierung beendet
uint16_t ergebnis = 0;
ergebnis = ADCL;
ergebnis += (ADCH<<8);
}
uint16_t adc_read (uint8_t kanal){
static uint8_t init = 0;
if(init==0){adc_init(); init++;} //beim ersten Aufruf zunaechst initialisieren
ADMUX &= (0xE0); //Vorhandenen Wert fuer den Kanal loeschen
//den Wert fuer den Kanal schreiben, dabei die vorderen 3 Bits vor evtl. fehlern schuetzen
ADMUX |= (kanal&(0x1F));
ADCSRA |= (1<<6); //Konvertierung starten
while(ADCSRA & (1<<6)){}; //Kovertierung beendet
uint16_t ergebnis = 0;
ergebnis = ADCL;
ergebnis += (ADCH<<8);
return ergebnis; //Ergebnis zurueckgeben
}
int main(void)
{
float messung;
DDRD = 0b00111111;
while(1)
{
messung = adc_read(2);
if( messung<=500 ){
PORTD = 0b00000001;
}
else {
PORTD = 0b00000010;
}
}
}
Gruß
Fabi
Lesezeichen