xrzr
01.09.2015, 14:04
Hallo,
ich irgendwie erhalte ich von meinem Atmega 2560 nicht die Analogen Werte, die er eigentlich messen sollte.
Hatte ursprünglich das Programm auf einen ATMEGA 1684P laufen. Habe jetzt entsprechend etwas angepasst, vermute aber das ich was vergssen habe, was ich nicht selber sehe.
Habe für den ADC folgenden Quelltext:
#define wandlungen 3
void adcstart(void);
void adcstop(void);
uint16_t ReadAnalog(uint8_t kanal);
void adcstart(void) {
ADCSRA |= ((1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADEN));//ADPS0-2(Vorteiler 128), ADEN (Enable)
ADMUX = 0;
ADMUX |= (1<<REFS1) | (1<<REFS0);
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung als Dummy zum warmlaufen
while ( ADCSRA & (1<<ADSC) )
{
; // auf Abschluss der Konvertierung warten
}
}
void adcstop(void) {
ADCSRA &= ~(1<<ADEN);
}
uint16_t ReadAnalog(uint8_t kanal) {
uint8_t i = 0;
uint16_t ergebnis = 0;
ADMUX = kanal; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
while (i!=wandlungen) { //Mehrere wandlungen und durchschnittswert ermitteln
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
i++;
ergebnis += ADC;
}
ergebnis = ergebnis/wandlungen; //Durchschnittswert bilden
return ergebnis;
}
Aufrufen führe ich dann wie folgt durch:
Variable = ReadAnalog("KANAL-NR");
ich irgendwie erhalte ich von meinem Atmega 2560 nicht die Analogen Werte, die er eigentlich messen sollte.
Hatte ursprünglich das Programm auf einen ATMEGA 1684P laufen. Habe jetzt entsprechend etwas angepasst, vermute aber das ich was vergssen habe, was ich nicht selber sehe.
Habe für den ADC folgenden Quelltext:
#define wandlungen 3
void adcstart(void);
void adcstop(void);
uint16_t ReadAnalog(uint8_t kanal);
void adcstart(void) {
ADCSRA |= ((1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADEN));//ADPS0-2(Vorteiler 128), ADEN (Enable)
ADMUX = 0;
ADMUX |= (1<<REFS1) | (1<<REFS0);
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung als Dummy zum warmlaufen
while ( ADCSRA & (1<<ADSC) )
{
; // auf Abschluss der Konvertierung warten
}
}
void adcstop(void) {
ADCSRA &= ~(1<<ADEN);
}
uint16_t ReadAnalog(uint8_t kanal) {
uint8_t i = 0;
uint16_t ergebnis = 0;
ADMUX = kanal; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
while (i!=wandlungen) { //Mehrere wandlungen und durchschnittswert ermitteln
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
i++;
ergebnis += ADC;
}
ergebnis = ergebnis/wandlungen; //Durchschnittswert bilden
return ergebnis;
}
Aufrufen führe ich dann wie folgt durch:
Variable = ReadAnalog("KANAL-NR");