Hallo,
ich kann dir mit einem Code-Ausschnitt aus einem Tiny25-Programm von mir weiterhelfen. Dort frage ich den ADC regelmäßig via Interrupt ab. Alles weitere wirst du schon schaffen.
Zunächst brauchst du aber in Hardware erst mal einen Spannungsteiler, der dir die 9V am ADC-Eingang runterrteilt auf < Aref. Ich verwende in meinem Code die 1,1V interene Aref. Wenn du das übernimmst solltest du die 9V auf ca. 1V teilen.
Hier der Code:
Code:
volatile U16 ADC_value = 0;
ISR(ADC_vect) // ADC-Wert fertig umgewandelt:
{
ADC_value = ADCW;
ADCSRA = (1<<ADSC) | (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0)| (1<<ADIE); // ADC-Umwandlung erneut starten
}
int main(void)
{
DDRB = 0b00000001; // IOs konfigurieren
PORTB = 0b00000000;
ADMUX = (1<<REFS1) | (1<<MUX1) | (1<<MUX0); // ADC konfigurieren: interne Referenz 1,1V und Eingang ADC3
ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0) | (1<<ADIE); // Prescaller FCPU : 8 und Interrupt bei fertiger Umwandlung
sei (); // Interrupts aktivieren
ADCSRA = (1<<ADSC) | (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0)| (1<<ADIE); // ADC-Umwandlung starten
while (1)
{
// dein Programm...
// z.B.: if (ADV_value > xxx)
}
}
Viel Spaß beim einarbeiten und lernen!
Viele Grüße
Andreas
- - - Aktualisiert - - -
...was vielleicht noch als Info fehlt: ADC_value ist die Spannung in 1/1024el von Aref. Also 0V = 0 und 1,1V bzw. Aref = 1023.
Lesezeichen