mit diesem code funktioniert es nun:
mit den 16 MHz hab ich meinen Quarz gemeint^^Code:#include <avr/io.h> int main(void) { DDRD = 0xFF; while (1) { uint8_t i; uint16_t result; int i2 = 60; ADMUX = (0<<REFS1)|(1<<REFS0); // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler // setzen auf 8 (1) und ADC aktivieren (1) /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */ ADCSRA |= (1<<ADSC); // eine ADC-Wandlung while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } result = ADCW; // ADCW muss einmal gelesen werden, // sonst wird Ergebnis der nächsten Wandlung // nicht übernommen. /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */ result = 0; for( i=0; i<i2; i++ ) { ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } result += ADCW; // Wandlungsergebnisse aufaddieren } ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) result /= i2; // Summe durch vier teilen = arithm. Mittelwert if (result < 128) { PORTD = 0b10000000; } else if (result >= 128 && result < 256) { PORTD = 0b01000000; } else if (result >= 256 && result < 384) { PORTD = 0b00100000; } else if (result >= 384 && result < 512) { PORTD = 0b00010000; } else if (result >= 512 && result < 640) { PORTD = 0b00001000; } else if (result >= 640 && result < 768) { PORTD = 0b00000100; } else if (result >= 768 && result < 896) { PORTD = 0b00000010; } else { PORTD = 0b00000001; } } return 1; }






Zitieren

Lesezeichen