Hallo,
oder eher Hilfe. Manchmal (ver)zweifle ich einfach an ... allem.
Der Verdacht: offensichtlich hat eine Art Pest an meinen 3 mega168 auf drei verschiedenen Platinen die ADCs vernichtet.
Das Problem: ein Sharp GP2D120 soll mit dem ADC3 des mega168 eingelesen werden. Mittlerweile geht es nur um den 10bittigen ADC-Wert. Aber es läuft einfach nicht, weder auf der einen, noch auf anderen Platinen. Allerdings kann ich auf einer kleinen Tiny13-Experimentierplatine vom Sharp mit dem ADC sinnvolle Spannungswerte einlesen. Ausserdem ist das Vo-Signal des Sharp, gemessen mit dem Multimeter, sinnvoll mit dem Abstand korreliert. Auch Messungen direkt am Portpin PC3/ADC3 des Mega168 mit dem Multimeter zeigen, dass die entsprechende Spannung ankommt (als Test auf Falschverdrahtung). Controller wie immer mit 20 MHz getaktet.
Mit dieser Initialisierung werden die Portpins definiert:
Code:
DDRC = 0b01110000; // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
PORTC = 0b00000111; // Beachte für ADC: PC3 ist ADC-Eingang ##>> OHNE Pullup !!
//
/* Dadurch Initialisierung der Anschlüsse für miniD0 : - - - - - - - - - - - - - -
/RESET,PC6 1 A A 28 PC5,(SCL), gLED
RxD,PD0 2 EU A 27 PC4,(SDA), rLED
TxD,PD1___3 EU E 26___PC3, ADC3=GP2D120
Und so wird der ADC initialisiert, anschliessend der Auszug der Testversion (main) mit dem der ADC etwa im Sekundentakt gelesen wird:
Code:
// =================================================================================
/* === Initialisierung fuer ADC mega168 OHNE Interrupt =====================
ADC3/PC3 mit 10 Bit, Wandlung "auf Abruf", es wird kein Interrupt ausgelöst */
void ADC3_10_init(void) //
{ // Referenz Selection Bit1..0 = 00 =>
// AREF, Internal Vref turned off doc S 254
ADMUX |= (1<<MUX1)|(1<<MUX0); // Wandlung mit ADC3
ADCSRA |= (1<<ADEN); // AD Enable
ADCSRA |= (1<<ADSC); // starte erste Wandlung
}
// =================================================================================
// =================================================================================
// === HAUPTProgramm ==============================================================
// Hier irgendwo die oben zitierten Portinitialisierungen
// und der Aufruf der ADC-Initialisierung
....
....
uint16_t igpd = 324;
.....
igpd = ADC;
ADCSRA |= (1<<ADSC); // starte nächste Wandlung
utoa(igpd, wortc, 10); //aktuellen Sharp-/ADC-Messwert ...
waitms ( 1000);
....
Als Ergebnis wird (auf drei verschiedenen Controllern) immer 1023 ausgegeben. Testweise wurde auch die Variable igpd mit 324 belegt. Wird nun der ADC ausgelesen, bevor igpd gesandt wird, steht 1023 da. Wird der ADC nicht ausgelesen, steht 324. Ein anderer Test bestand darin, den Portpin PC3 direkt mit Vcc und alternativ mit GND zu verbinden. Ergebnis ist immer 1023. Diese Stöpselei wurde notwendig, da die Messwerte der Ausleseroutine mit Interrupt ebenso 1023 waren. In früheren Protokollen gefundenen Ergebnisse zeigen aber, dass es mal funktionierte . . . .
Mittlerweile weiss ich nicht mehr weiter und bitte um Hilfe.
Nachtrag: AREF ist mit Vcc verbunden, AVCC liegt mit 10 µH an VCC und mit 100 nF an GND.
Lesezeichen