PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega16: Verwendung des ADC - Fehler bei Initialisierung?



Kesandal
04.07.2011, 13:18
Hallo,

leider habe ich wohl ein Problem mit dem ADCs.

Folgende Aufgabe habe ich:



An die Differenzeingänge ADC0 und ADC1 des ADC kann über ein Kabel eine
kleine Platine mit einem Mikrofon angeschlossen werden. [...]
C-Programm schreiben, [...] ADC mit 200-facher Verstärkung einstellen
und ständig die Amplitude des mit dem ADC eingelesenen Mikrofonsignals verarbeiten [...]


Zunächst mein Quelltext:


#define LCD_PORT PORTC /* LCD connected to PORTC */
#define F_CPU 3686400UL

#include <avr/io.h>
#include "display.inc"
#include <util/delay.h>
#include <avr/interrupt.h>

uint16_t ReadADC()
{
ADMUX=(1<<MUX3)|(1<<MUX1)|(1<<MUX0);

//Start Single conversion
ADCSRA|=(1<<ADSC);

//Wait for conversion to complete
while(!(ADCSRA & (1<<ADIF)));

ADCSRA|=(1<<ADIF);

return(ADC);
}

int main(void){
DDRC = 0xff; // LCD

//char x = 4;

lcd_init();
uint16_t adc_result;

ADMUX=(1<<REFS0); // For Aref=AVcc;
ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS2)|(1<<ADPS0);

while(1){

adc_result=ReadADC();
adc_result=(adc_result*4); // *4, da ich bei ad_result=max=1024 4950mV erhalte
lcd_setcursor(0,0);
lcd_putdez_uint(adc_result);
_delay_ms(250);

}


}


Mein Problem nun:
Die Ausgabe auf dem Display schwankt ständig zwischen 0 und 4000.
Dabei ist es ganz egal ob ich das besagte Mikrofon überhaupt angeschlossen habe oder nicht.
Es kommt mir so vor, als werden die Pins garnicht "verarbeitet".

Kann mir jemand bitte sagen, ob ich einen Fehler bei der Initialisierung oder ähnliches habe?

Danke
Kesandal

Hubert.G
04.07.2011, 13:36
Was ich so auf die Schnelle sehe:

ADMUX=(1<<MUX3)|(1<<MUX1)|(1<<MUX0); Damit überschreibst du dir ADMUX=(1<<REFS0); und hast keine Referenzspannung mehr.
Solange du den Kanal nicht änderst musst du ihn nicht neu einstellen, also auch ins main legen.

Wenn du ein Mikro kontinuierlich abfragen willst, wäre da nicht der Free-Running-Mode und ISR besser?

Kesandal
04.07.2011, 13:42
Was ich so auf die Schnelle sehe:

ADMUX=(1<<MUX3)|(1<<MUX1)|(1<<MUX0); Damit überschreibst du dir ADMUX=(1<<REFS0); und hast keine Referenzspannung mehr.
Solange du den Kanal nicht änderst musst du ihn nicht neu einstellen, also auch ins main legen.

Wenn du ein Mikro kontinuierlich abfragen willst, wäre da nicht der Free-Running-Mode und ISR besser?

Danke für Deine Antwort und den Tip mit dem Free-Running-Mode / ISR.
Werde es nachher so umsetzen.

Das ADMUX habe ich nun in die Main genommen.



ADMUX=(1<<MUX3)|(1<<MUX1)|(1<<MUX0)|(1<<REFS0);


Dennoch schwankt die Anzeige nach wie vor.
Egal ob das Micro angeschlossen ist nicht.

Ich denke im abgeklemmten Zustand müsste doch die Anzeige "stabil" sein oder nicht?

sternst
04.07.2011, 13:56
Ich denke im abgeklemmten Zustand müsste doch die Anzeige "stabil" sein oder nicht?Kommt darauf an, was du statt dessen angeklemmt hast. Ein offener Eingang ist alles andere als stabil.

Hubert.G
04.07.2011, 15:55
Ein 100n Kondensator an AREF ist vorhanden?
Den Eingang mal kurzschließen ist besser, oder eine definierte Spannung anlegen zwischen 0V und 5V.