Dies ist eine alte Version des Dokuments!
/* * ADC-Summer * http://www.eHaJo.de * (C) Hannes Jochriem, 2013 * * µC-Belegung am Beispiel Atmega8: * Poti: PC0 (ADC0) * Summer: PD7 */ #define F_CPU 8000000UL /* 8MHz */ #include <avr/io.h> #include <util/delay.h> // Prototypen void long_delay(uint16_t); // Defines: #define SUMMER (1<<PD7) void main() { uint16_t adc_wert = 0; // Pin des Summers als Ausgang definieren DDRD |= SUMMER; // AVCC (also +5V als Spannungsreferenz verwenden) ADMUX |= (1<<REFS0); // Teilungsfaktor des ADC, ADC-Frequenz soll zw. 50 und 200kHz liegen. // In diesem Fall Teiler 64, also dann 8MHz / 64 = 125kHz ADCSRA |= (1<<ADPS1) | (1<<ADPS2); // ADC einschalten ADCSRA |= (1<<ADEN); // Nach dem Einschalten wird eine Dummy-Wandlung empfohlen // Wandlung starten ADCSRA |= (1<<ADSC); // Warten bis die Wandlung fertig ist. while (ADCSRA & (1<<ADSC)) {} // Ergebnis der Wandlung auslesen adc_wert = ADCW; // Das Poti haengt an ADC0, also muss der Multiplexeingang nicht umgeschalten werden // Standardmaessig ist dieser auf Kanal 0 while(1) { // Wandlung starten ADCSRA |= (1<<ADSC); // Warten bis die Wandlung fertig ist. while (ADCSRA & (1<<ADSC)) {} // Ergebnis der Wandlung auslesen adc_wert = ADCW; // Warten so viele µs, wie der ADC-Wert ist long_delay(adc_wert); // Pin des Summers invertieren PORTD ^= SUMMER; } } void long_delay(uint16_t us) { // so viele us warten wie der Funktion uebergeben werden for(; us>0; us--) _delay_us(1); }