Gast
#972982
Nabend,
habe ein Programm geschrieben mit dem ich einfach nur eine Spannung am
PA1 eines ATmega32 messen möchte. Sollange der µc im STK500 läuft,
funktioniert alles so wie es soll. In der Platiene in dem ich ihn
betreiben möchte, bekomme ich auf dem Display an der Stelle wo der wert
des ADC's stehen sollte nur laufende Zahlen angezeigt. Ich geh davon aus
das ich bei der Inizialiierung die Taktfrequenz nicht richig eingestellt
habe.
Da ich den µC auf der Plaiene mit nem 14.7456MHz Quarz takte habe ich
nen Teilungsfaktor von 128 gewählt sprich in C wie folgt eingegeben.
ADCSRA = (1<<ADEN) | (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ;
Ist das soweit richtig?
Bin für jede Hilfe dankbar.
Der gesammte Code sieht wie folgt aus:
#include <avr/io.h>
#include "lcd-routines.h"
uint16_t ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;
ADMUX = 0x00; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
ADCSRA = (1<<ADEN) | (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) ; //
Frequenzvorteiler
// setzen auf 8 (1) und ADC aktivieren
(1)
/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man
liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu
lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result = ADCW; // ADCW muss einmal gelesen werden,
// sonst wird Ergebnis der nächsten Wandlung
// nicht übernommen.
/* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden
Wandlungen */
result = 0;
for( i=0; i<4; i++ )
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result += ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
result /= 4; // Summe durch vier teilen = arithm.
Mittelwert
return result;
}
int main(void){
lcd_init();
uint16_t adcval;
uint16_t x;
while(1)
{
set_cursor(4,4);
adcval = ReadChannel(1);
x=adcval/0.4;
send_int(x);
set_cursor(9,4);
lcd_string("mV");
}
}
void send_int(uint16_t zahl){
char Buffer[20]; //umwandlung von Dezimal in ASCII
itoa(zahl, Buffer, 10 );
lcd_string(Buffer);
}