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
}
 
						
					
Lesezeichen