Ziel wäre es einen Drucksensor anzuschließen und dessen wert einzulesen (ergibt 4-20mA aus)
Ich habe mich jetzt nur mal auf das einlesen des ADC konzentriert, bei mir wären 5V = 1023

Mein aktuelles Problem ist das der ADC wert > 205 und < 409 ist und das Immer sogar wenn nichts angeschlossen ist ?
Ich konnte den Fehler noch nicht finden, daher ich noch kein Poti habe verwende ich verschiedene widerstände.

Code:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>

uint16_t lastValue = 0;
uint16_t ADC_Read(uint8_t channel);

int main()
{
  // Set PORTD as Output
  DDRD = (1<<PD7)| (1<<PD6)|(1<<PD5) | (1<<PD4) | (1<<PD3) | (1<<PD2)| (1<<PD1)| (1<<PD0);
  PORTD |= ((1 << PD7) | (1 << PD6) |(1<<PD5) | (1<<PD4) | (1<<PD3) | (1<<PD2)| (1<<PD1)| (1<<PD0));

  ADC_init();

  while (1)
  {
    //0V = 0
    //1V = 205
    //2V = 409
    //3V = 614
    //4V = 816
    //5V = 1023
    //Vgemessen=lastValue*5/1024;

    lastValue = ADC_Read(0);
    if (lastValue = 0) {
       PORTD = 0b11111111;
    }
    else if (lastValue > 205) {
       PORTD = 0b11111110;
    }
    else if (lastValue < 409) {
      PORTD = 0b11111100;
    }
    else if (lastValue > 614) {
       PORTD = 0b11111000;
    }
    else if (lastValue > 816) {
      PORTD = 0b11110000;
    }
    else if (lastValue > 1023) {
      PORTD = 0b11100000;
    }
    }
}

/* ADC initialisieren */
void ADC_init(void) {
    // die Versorgungsspannung AVcc als Refernz wählen:
    ADMUX = (1<<REFS0);
    // oder interne Referenzspannung als Referenz für den ADC wählen:
    //ADMUX = (1<<REFS1) | (1<<REFS0);
    // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
    // schon auf 0, also single conversion
    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. */
    (void) 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
}
Klicke auf die Grafik für eine größere Ansicht

Name:	Drawing1.jpg
Hits:	10
Größe:	51,9 KB
ID:	28892