PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Adc initialisieren beim Atmega 16



Destrono
24.05.2010, 23:08
Hallo,
ich versuche schon seit 2 Tagen den Adc beim Atmega 16 in Gang zu bekommen. Leider erfolglos. Beim Atmega8 hatte ich keine Probleme.
Könnte mal jemand auf meinen Code schauen und mir sagen, ob das so ok ist? Der Adc soll in der free running Variante laufen.


void adc_init (void)
{
ADCSRA = (1<<ADEN) |(1<<ADSC) | (1<<ADATE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // prescaler = 128
ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX0); // interne Referenzspannung
ADMUX &= ~(1<<ADLAR);
SFIOR &= ~((1<<ADTS2) | (1<<ADTS1) | (1<<ADTS0));
messwert = ADCL;
messwert |= (ADCH<<8 );
messwert = 0;
}

"messwert" ist einer Headerdatei folgendermaßen deklariert:
uint16_t messwert; // Messwert ADC


Wäre toll, wenn ihr mir weiter helfen könntet.

MfG
Destrono

Hubert.G
25.05.2010, 08:36
Mit dem gesamten Code könnte man es einfach mal testen.
Du verwendest ADC1 und keinen Interrupt, mehr sieht man daraus nicht.

Destrono
25.05.2010, 11:37
Hallo,
der Code besteht aus mehreren Teilen.
Gestern habe ich den Kontroller noch mit 2.8 Volt gespeist, weil mein Display, das noch mit angesteuert wird, nicht mehr abkann.
Kann es sein, dass ich den Kontroller kaputt gemacht habe, wenn am Aref bei den 2.8 Volt Eingangsspannung nur 2.05 Volt anlagen, ich dem Kontroller aber am Adc1 2.5 Volt zugeführt habe?
Heute habe ich das ganze noch mal bei 5Volt Eingangsspannung und ohne Display probiert und auch hier zeigt der Kontroller ein sehr komisches Verhalten.
Bezogen auf den Adc habe ich folgenden Code:
Adc.c:

void einlesen (void){

messwert = ADCL;
messwert |= (ADCH<<8 );



}
void adc_init (void)
{
ADCSRA = (1<<ADEN) |(1<<ADSC) | (1<<ADATE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // free running prescaler = 128
ADMUX = (1<<REFS1) | (1<<REFS0) | (1<<MUX0); // interne Referenzspannung, Mux0 = Pin ADC0 Mit diesem Register wird der zu messende Kanal ausgewählt.
ADMUX &= ~(1<<ADLAR);
SFIOR &= ~((1<<ADTS2) | (1<<ADTS1) | (1<<ADTS0));
messwert = ADCL;// einmalige Messung
messwert |= (ADCH<<8 );
messwert = 0;
}



in der while Schleife der main Funktion wird dann Folgendes aufgerufen:
if (messwert >= 500){
PORTC ^= (1<< PC7);} // Led an PC7
einlesen ();




mehr ist es im Grunde nicht.
Beim Atmega 8 hat alles wunderbar funktioniert.
Könntet ihr bitte noch mal einen Blick auf den Code werfen, denn ich sitze jetzt schon den 3 Tag an dem Teil und bin echt ratlos.

MfG
Destrono

Hubert.G
25.05.2010, 12:16
Zum ersten du hast nicht ADC0 sondern ADC1 ausgewählt.
Dann fehlt noch die ADC-Abfrage, woher weisst du das die Conversion komplett ist?