Hallo,
Mein code funktioniert einfach nicht. er ist aus den avr-gcctutorial von mikrocontroller.net abgewandelt.
Der wert der herauskommt ist vermutlich nicht null, nicht größer null und nicht kleiner null
Der Code ist in 3 dateien zerlegt. Programieren tu ich mit Kontrollerlab, hab den aktuellen avr-gcc, mein AVR ist ein Mega 16 mit 14,.... mhz. F_CPU wird von Kontrollerlab definiert und muss nomit nicht im programm stehen.
pinbelegung.h:
adc.c:Code:#include <avr/io.h> void initavr(void) { DDRD = 0xF0; DDRB = 0xE3; }
adc_test.c (Mit main schleife):Code:#include <avr/io.h> #include <util/delay.h> // definiert _delay_ms() void adcstart(void); void adcstop(void); void adcstart(void) { ADCSRA |= ((1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2) | (1<<ADEN));//ADPS0-2(Vorteiler 128), ADEN (Enable) uint8_t kanal = 0; ADMUX = kanal; ADMUX |= (1<<REFS1) | (1<<REFS0); ADCSRA |= (1<<ADSC); // eine ADC-Wandlung als Dummy zum warmlaufen while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } } void adcstop(void) { ADCSRA &= ~(1<<ADEN); } uint16_t adcget(uint8_t kanal) { uint8_t i; uint16_t ergebnis = 0; ADMUX = kanal; // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } ergebnis=ADC; return ergebnis; }
Frohe WeihnachtenCode:#include <avr/io.h> #include <util/delay.h> // definiert _delay_ms() #include "pinbelegung.h" uint16_t adcwert = 0; int main(void) { initavr(); adcstart(); PORTB |= (1<<PB7) | (1<<PB5) | (1<<PB6); for(;;) { adcwert = adcget(0); // MUX-Bits auf 0b0000 -> Channel 0 //adcwert = adcget(2); // MUX-Bits auf 0b0010 -> Channel 2 if (adcwert==0) { PORTB |= (1<<PB7); } else if (adcwert<0) { PORTB |= (1<<PB5); } else if (adcwert>800) { PORTB |= (1<<PB6); } else { PORTB &= ~((1<<PB5) | (1<<PB6) | (1<<PB7)); } _delay_ms(100); } return(0); adcstop(); }
Thomas







Zitieren


Lesezeichen