Archiv verlassen und diese Seite im Standarddesign anzeigen : ... und nochmal eine Frage zum ATmega 8 ADC !
Hi, ich bräuchte nochmal hilfe. Das Problem ist, dass mein ADC-Wert, der links ausgerichtet ist (ADLAR-bit gesetzt), nur 3 Werte ausgibt. Ich lass die mir per itoa() als binärmuster am LCD anzeigen. Dabei kommen z.B.
folgende Werte an: 00100110, 10001000, 01000010. Den Code kann ich leider im moment nicht posten, aber vielleicht kennt jemand den effekt und weiß eine Lösung.
mfg,
LC
So, jetzt kann ich mal den code posten:
int main(void)
{
int adc_prim = 0; // ADC Wert aus Kanal 1
int adc_sek = 0; // ADC Wert aus Kanal 2
char pPrim[8]; // Primärwert als char für LCD
char pSek[8]; // Sekundärwert - " -
io_init(); // I/O init
adc_init(); // ADC init
lcd_init(); // LCD init
for(;;)
{
adc_prim = adc_data(1); // holen des Primäwertes
itoa(adc_prim, pPrim, 2); // Umrechnung des "rohen" Primärwertes in darsetllbare Zahl.
lcd_home(); // Schreibposition 1. Zeile, 1. Spalte
lcd_text("km/h ", pPrim); // und Wert (bisher noch Text zum testen) auf Display ausgeben !
adc_sek = adc_data(2); // holen des Sekundärwertes
itoa(adc_sek, pSek, 2);
lcd_goto(2,1); // Schreibposition 2.Zeile, 1.Spalte
lcd_text("OEL ", pSek); // Anzeige des sekundärwertes
}
return 0;
}
Hier noch die adc_init:
void adc_init(void)
{
// init im SC Modus
ADCSRA = (1<<ADEN) | (1<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS0);
ADMUX |= (1<<ADLAR);
}
und das ist die ADC Funktion:
int adc_data(int channel)
{
int i;
int result = 0;
switch(channel)
{
case 1: // Messwert 1
ADMUX = 0x0; // ADMUX auf KANAL 1 setzen
// Dummy readout:
ADCSRA |= (1<<ADSC);
while( ADCSRA & (1<<ADSC) );
// Dummy readout ende
for( i = 0; i < 4; i++)/* eigentliche Messung ( arithmet. Mittelwert aus i Messungen ) */
{
ADCSRA |= (1<<ADSC);// ADC starten:
while( ADCSRA & (1<<ADSC) )
result += ADCH;
}
result /= 4;
break;
case 2: // Messwert 2
ADMUX |= (1<<MUX0); //ADMUX auf KANAL 2 setzen !
// Dummy readout:
ADCSRA |= (1<<ADSC);
while( ADCSRA & (1<<ADSC) );
// Dummy readout ende
for( i = 0; i < 4; i++)/* eigentliche Messung ( arithmet. Mittelwert aus i Messungen ) */
{
ADCSRA |= (1<<ADSC);// ADC starten:
while( ADCSRA & (1<<ADSC) )
result += ADCH;
}
result /= 4;
ADMUX = 0x0; // ADMUX zurücksetzen
break;
default:
break;
}
return result;
}
Und wo ist Dein Problem ?
In Deiner Read Routine fehlt das Semikolon hinter der while Schleife! Du liest vier mal einen ungültigen Wert ein.
Kleiner Tip: Bei if's und Schleifenkonstrukten verwende ich immer einen Block dahinter, das spart die Fehlersuche und Kollegen die mit Deinem Code arbeiten müssen werden es Dir danken.
while( ADCSRA & (1<<ADSC) )
{
; // wait until conversion complete
}
result += ADCH;
Ja klar, des semikolon hinter der schleife hab ich dann auch noch gefunden.
Trotzdem Danke.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.