PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ... und nochmal eine Frage zum ATmega 8 ADC !



LC-HC
27.02.2006, 11:08
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

LC-HC
27.02.2006, 18:29
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;
}

ruediw
27.02.2006, 22:49
Und wo ist Dein Problem ?

ogni42
27.02.2006, 23:06
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;

LC-HC
28.02.2006, 07:56
Ja klar, des semikolon hinter der schleife hab ich dann auch noch gefunden.
Trotzdem Danke.