PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC im Atmega128 ->kontinuierliche Wandlung?



Whassup
23.02.2005, 10:52
Hallo,

folgendes Programm sollte kontinuierlich die anliegende Spannung kontinuierlich in das ADC-Register schreiben. Die "Single-Conversion" funktioniert ohne Probleme, nur die kontinuierliche Wandlung nicht. Was läuft da falsch?

Vielen Dank.

#include <avr/io.h> #define channel 0
#define true 1

int result;

int main (void)
{

ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADMUX = channel; ADMUX |= (1<<REFS1) | (1<<REFS0);
ADCSRA |= (1<<ADFR); ADCSRA |= (1<<ADSC);

while(true) { {
result = ADC;
}
}

muraad
23.02.2005, 12:40
Sieht irgendwie komisch aus dein Code müsste aber Funktionieren. Was bringt der Compiler für Fehlermeldungen?
Meine Verbesserung währe:


#include <io.h>

int result;

int main(void)
{
ADCSRA = (1<<ADEN) | (1<<ADFR) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADMUX = (1<<REFS1) | (1<<REFS0);
ADCSRA |= (1<<ADSC);
for(;;)
{
while(!(ADCSRA & (1<<ADIF))); // Wartet bis ADIF gesetzt
{
result=ADC;
ADCSRA|=(1<<ADIF);
}
}
}

Gruß Muraad
PS: du hast bei deiner while(true) Anweisung eine { Klammer zu viel, vielleicht liegts daran.

Whassup
23.02.2005, 13:13
Hi,
ich habe deinen code ausprobiert, und es funktioniert auch nicht. das problem ist nicht, dass der compiler einen error meldet, sondern das bei result=ADC kein wert in result geschrieben wird. ist sowohl bei meinem als auch deinem code immer 0.

gruß

stefan

bluebrother
23.02.2005, 13:53
Warum machst du das nicht in einem Interrupt? Also ein Hardware-Timer der die ADC auslöst. Im ADC-IRQ dann das auslesen. Damit hast du dann auch ne ziemlich regelmäßige Ausführung garantiert, auch wenn mehr in dein Programm kommt.

muraad
23.02.2005, 21:37
Probier mal:
result = ADCL;
result += (ADCH<<8);
Gruß Muraad
EDIT:
wie witzig der macht nen smily draus. statt dem smily steht da:
8 )
EDIT: Danke Kijon. ich habs bei dem bisschen Code vergessen. Ist aber schon besser

Kjion
24.02.2005, 13:46
Hi,
dafür gibts doch den Code Tag ;-)

result = ADCL;
result += (ADCH<<8);

MfG Kjion