ADC mit Atmega8 auf STK500 und AVR GCC

darkhedie

Neues Mitglied
23. Aug. 2008
7
0
0
Sprachen
Hallo

Ich benutze diesen Code um den ADC auszulesen

Code:
uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;
 
  ADMUX = mux;                      // Kanal waehlen
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
 
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
                               // setzen auf 8 (1) und ADC aktivieren (1)
 
  /* 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;
}

Aufgerufen wird er so:

Code:
int main(void){

    lcd_init();
	uint16_t adcval;
	
	
 while(1)
    { 
	
	set_cursor(0,1);
	
	lcd_string("ADC0:   ");
	set_cursor(0,2);
        adcval = ReadChannel(1);
	send_int(adcval);
	
    }
}

Hier noch send int

Code:
void send_int(uint16_t zahl){
       char Buffer[20];	//umwandlung von Dezimal in ASCII
       itoa(zahl, Buffer, 10 ); 
     
       lcd_string(Buffer);
    }

Als test bedingung hab ich den ADC pin abwechselnd mal auf GND und mal in der luft gehabt

wenn ich nun den Channel 0 auslese, steht auf dem Display 1023 egal ob ich den Pin auf GND hab oder nicht
beim kanal 1 auch

bei kanal 2 verändert sich der wert ständig. auch unabhängig davon das der pin auf GND ist oder nicht


was ist hier schief gelaufen?

Danke schonmal
 
Hallo,

mir fällt kein Fehler auf, weder in der Routine ReadChannel, noch in send_int.

Du hast ja die interne Referenzspannungsquelle (2,54V) aktiviert, der Pin AREF sollte mit einem C nach GND entstört werden. Ich glaube aber nicht, dass ein ggf. fehlernder C die Ursache für den Fehler ist. Eventuell hat der Pin AREF einen Schluss nach GND oder du hast hier eine externe Spannung anliegen.

An der Taktrate des ADC dürfte es nicht liegen, du nutzt den Prescaler 8, damit hast du bei 16MHz Oszillator 200kHz Taktrate, das ist ok.

Vielleicht auch nocheinmal die Routinen send_int und lcd_string zusammen prüfen, indem du vor dem Aufruf von send_int der Variablen adcval einen definierten Wert zuweist.

Grüße,
Dirk
 
ok hab das mal mit der variable getestet.....

Die Routinen funktionieren einwandfrei.....

ich hab echt keine ahnung an was das liegen könnte
 
Dann muss es ja an der AD-Wandlung liegen, stell vielleich einmal den gesamten Sourcecode ins Forum, vielleicht als Anhang.

Gruß,
Dirk
 
Also der gepostete Code ist bereits der gesamte Coder der umwandlung

Den als Anhang reinzustellen hätte ja eigentlich keinen sinn
 
Ich hab das problem gefunden!!!!!!!!!!!!!!!!!!!!!!!

Aus irgend einem Grund, ist der Pin PC0 auf dem STK500 nicht mit dem
Mikrocontroller Pin Verbunden.

Schliesst man direkt eine spannung an den PC0 Pin, so wandelt er einwandfrei!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)