Hi,
nie aufgeben!
Probier mal den Kode hier aus. Damit wird der A/B Wandler gepollt und Du erhältst den echten Wert der ermittelt wird als resultat womit Du wiederum sehen kannst ob überhaupt eine Werteveränderung "gelesen" wird.
Code:
/*
4-Okt-2010
O.O. Müller
Einlesen vom ADC im Polling-Betrieb
*/
#include <avr/io.h>
#include "asuro.h"
#define ADC4 0x04
/*
aMux ADC0, ADC1, ..., ADC7
aVal pointer to 16 bit result value
*/
void adcReadChannel(uint8_t aMux,int16_t* aVal) {
register int16_t tmp;
// Analog comparator disable
ACSR = (1 << ACD);
// Enable AD conversion
// Prescaler 8x (ADPS1, ADPS0)
// Prescaler 32x (ADPS2, ADPS0)
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (0 << ADPS1) | (1 << ADPS0);
// AREF, Internal Vref turned off.
ADMUX = (0 << REFS1) | (0 << REFS0) | (aMux & 0x1F);
// Start conversion
ADCSRA |= (1 << ADSC) | (1 << ADEN);
while (!(ADCSRA & (1 << ADIF)));
// Calc value
*aVal = (int16_t)ADC;
ADCSRA = (1 << ADIF);
ADCSRA &= ~(1 << ADEN);
}
void termWrite(char *aText) {
// ...
// ...
}
char term_getc(void) {
// ...
// ...
//
return 0;
}
uint8_t main(void) {
uint16_t iADC;
uint8_t szBuf[30];
while (1) {
// Daten lesen von ADC4
adcReadChannel(ADC4, &iADC);
// Daten ausgeben auf LCD/Terminal o.ä.
sprintf(szBuf, "Gelesene Daten: %ld\n", iADC);
termWrite(szBuf);
// wait until key pressed
sprintf(szBuf, "Taste drücken für weiter..\n");
termWrite(szBuf);
while (term_getc() == 0);
}
}
/* EOF */
Lediglich termWrite und term_getc musst Du noch anpassen.
Gruss,
O
Lesezeichen