Analogwert lesen und an Summer ausgeben
/*
* ADC-Summer
* https://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);
}
Keine Kommentare