Sippo
09.06.2009, 20:19
folgendes Problem:
ich weiß, dass mein Problem eigentlich recht einfach sein sollte aber ich komm grad irgendwie kein schritt weiter und habe gehofft ihr könntet mir vll helfen. Und zwar habe ich mich nun am ADC probiert aber bin irgendwie an etwas gescheitert...
liegts vll an den registern?
Folgende Pinbelegung:
gesamter PORTD LED's
VREF 100n gegen masse
und ADC 0 - 5 hängen in der luft aund wahlweise an einem POti (mitte)
die anderen beiden Pins des Potis gehen auf masse und VCC
habe folgende Codes getestet:
#include <avr/io.h>
#include <util/delay.h>
int main()
{
int sample,i,value;
DDRD=0xFF; // PORTD als Ausgabeport
ADMUX=(0<<REFS1)|(1<<REFS0); // ADC Ref auf Avcc, PC0 gew?hlt
ADCSR=(1<<ADEN)|(0<<ADPS0)|(1<<ADPS1)|(1<<ADPS2); // ADC eingeschaltet, 64 Bit Prescale
while(1)
{
sample=0;
for(i=0;i<64;i++)
{
ADCSRA|=0b10000000; //single conversion mode ein
while(ADCSRA & (1<<ADSC)); //warten bis konvertierung abgeschlosen
sample+=ADCW; //aufsummierung der samplewerte
}
value=sample/64; //aritmethisches mittel der samplewerte
if (value<300)
PORTD=0b10000000; //schaltet LED ein
else if (value>=300 && value<600)
PORTD=0b11000000; //schaltet LED ein
else
PORTD=0b11100000; //schaltet LED ein
}
}
#include <avr/io.h> // Include Datei f?r den ATMega8
#include <util/delay.h> // Include Datei f?r die Verz?gerungsfunktion
void long_delay(uint16_t ms)
{
for(; ms>0; ms--) _delay_ms(1);
}
int main()
{
int sample,i,value; // Variablen definitionn
DDRD=0xFF; // PORTB als Ausgabeport
ADMUX=0x00; // ADC Ref auf Avcc, PC0 gew?hlt, normale Formatierung
ADCSRA=0x80; // ADC eingeschaltet, kein Prescale
// Endlosschleife zur kontinuierlichen Auswertung der Eingangsspannung (am ADC)
while(1)
{
sample=0; // setzt den Samplewert auf 0
// Schleife zum Sammeln von 32 Me?werten
for(i=0;i<32;i++)
{
ADCSRA.6=1; // single conversion mode ein
while(ADCSRA.6); // warten bis konvertierung abgeschlosen
sample+=ADCW; // aufsummierung der samplewerte
}
value=sample/32; // Aritmethisches Mittel der Samplewerte
// Auswertung der Me?daten
if (value<300) // erste Grenze
PORTD=0x04; // schaltet gr?ne LED ein
else if (value>=300 && value<600) // zweite Grenze
PORTD=0x02; // schaltet gelbe LED ein
else
{
PORTD=0x01; // schaltet rote LED ein
long_delay(250); // verz?gerung von 250ms
PORTD=0x00; // schaltet LED aus
long_delay(250); // verz?gerung von 250ms
}
}
return 1;
} :-s
ich weiß, dass mein Problem eigentlich recht einfach sein sollte aber ich komm grad irgendwie kein schritt weiter und habe gehofft ihr könntet mir vll helfen. Und zwar habe ich mich nun am ADC probiert aber bin irgendwie an etwas gescheitert...
liegts vll an den registern?
Folgende Pinbelegung:
gesamter PORTD LED's
VREF 100n gegen masse
und ADC 0 - 5 hängen in der luft aund wahlweise an einem POti (mitte)
die anderen beiden Pins des Potis gehen auf masse und VCC
habe folgende Codes getestet:
#include <avr/io.h>
#include <util/delay.h>
int main()
{
int sample,i,value;
DDRD=0xFF; // PORTD als Ausgabeport
ADMUX=(0<<REFS1)|(1<<REFS0); // ADC Ref auf Avcc, PC0 gew?hlt
ADCSR=(1<<ADEN)|(0<<ADPS0)|(1<<ADPS1)|(1<<ADPS2); // ADC eingeschaltet, 64 Bit Prescale
while(1)
{
sample=0;
for(i=0;i<64;i++)
{
ADCSRA|=0b10000000; //single conversion mode ein
while(ADCSRA & (1<<ADSC)); //warten bis konvertierung abgeschlosen
sample+=ADCW; //aufsummierung der samplewerte
}
value=sample/64; //aritmethisches mittel der samplewerte
if (value<300)
PORTD=0b10000000; //schaltet LED ein
else if (value>=300 && value<600)
PORTD=0b11000000; //schaltet LED ein
else
PORTD=0b11100000; //schaltet LED ein
}
}
#include <avr/io.h> // Include Datei f?r den ATMega8
#include <util/delay.h> // Include Datei f?r die Verz?gerungsfunktion
void long_delay(uint16_t ms)
{
for(; ms>0; ms--) _delay_ms(1);
}
int main()
{
int sample,i,value; // Variablen definitionn
DDRD=0xFF; // PORTB als Ausgabeport
ADMUX=0x00; // ADC Ref auf Avcc, PC0 gew?hlt, normale Formatierung
ADCSRA=0x80; // ADC eingeschaltet, kein Prescale
// Endlosschleife zur kontinuierlichen Auswertung der Eingangsspannung (am ADC)
while(1)
{
sample=0; // setzt den Samplewert auf 0
// Schleife zum Sammeln von 32 Me?werten
for(i=0;i<32;i++)
{
ADCSRA.6=1; // single conversion mode ein
while(ADCSRA.6); // warten bis konvertierung abgeschlosen
sample+=ADCW; // aufsummierung der samplewerte
}
value=sample/32; // Aritmethisches Mittel der Samplewerte
// Auswertung der Me?daten
if (value<300) // erste Grenze
PORTD=0x04; // schaltet gr?ne LED ein
else if (value>=300 && value<600) // zweite Grenze
PORTD=0x02; // schaltet gelbe LED ein
else
{
PORTD=0x01; // schaltet rote LED ein
long_delay(250); // verz?gerung von 250ms
PORTD=0x00; // schaltet LED aus
long_delay(250); // verz?gerung von 250ms
}
}
return 1;
} :-s