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>
Code: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 } }Code:#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; }![]()







Zitieren

Lesezeichen