Hallo!
Ich habe mein erstes Programm mit dem Internen ADC Wandler des mega8 geschrieben, aber es funktioniert noch nicht ganz.
Code:
#include <avr/io.h>
#include <stdint.h>
#define F_CPU 3686400UL
#include <util/delay.h>
// LEDs:
// - Grün: PORT C 0
// - Gelb: PORT C 3
// - Rot: PORT C 5
// POTI an PORT B 0
//===========================================================================================================
int adc (uint8_t mux)
{ uint8_t i;
uint16_t ergebnis=0;
ADCSRA=(1<<ADEN); // ADC ein
ADCSRA=(1<<ADPS2)|(1<<ADPS0); // Frequenzteiler 32
ADMUX|=(1<<REFS1)|(1<<REFS0); // Interne Refrerenzspg ein
ADMUX=mux; // ADC an Pin mux
ADCSRA|=(1<<ADSC); // Dummy Load
while(ADCSRA&(1<<ADSC)) {} // Warten bis Messung fertig
for(i=0;i<5;i++) // 5 Mal messen
{ ADCSRA|=(1<<ADSC);
while(ADCSRA&(1<<ADSC)) {} // Warten bis messung fertig
ergebnis=ergebnis+ADC; // Mittelwert bestimmen
}
ADCSRA&=~(1<<ADEN); // ADC ausschalten
ergebnis=ergebnis/5;
return ergebnis; // Ergebnis zurückgeben
}
//=========================================================================================================
int main (void)
{ DDRD=0x00;
DDRB=0x00;
DDRC=0xff;
PORTC=0x00;
uint16_t wandlung;
while(1)
{ wandlung=adc(0);
if(wandlung<21845)
{ PORTC|=(1<<0);
PORTC&=~(1<<3);
PORTC&=~(1<<5);
}
if(wandlung>21845 && wandlung<43690)
{ PORTC|=(1<<3);
PORTC&=~(1<<0);
PORTC&=~(1<<5);
}
if(wandlung>43690 && wandlung<65535)
{ PORTC|=(1<<5);
PORTC&=~(1<<0);
PORTC&=~(1<<3);
}
else{}
}
}
//==========================================================================================================
Wenn ich das Programm in den Controller brenne, leuchtet nur die Rote Led, d.h. es wird immer der else-Zweig im Hauptprogramm ausgeführt.
Ich glaube es liegt daran, dass ich nicht weiß, wie man dem uC sagt, dass das Poti auf PORT B ist, mit ADMUX=0 sagt man ihm ja nur, dass der ADC Pin der Pin 0 ist.
Außerdem kenn ich mich mit der Referenzspg. nicht so gut aus. Man kann also nur Spannungen von 0-2,54 Volt in den Controller schicken, das halte ich auch ein, aber ich weiß nicht, ob die Einstellungen ADMUX|=(1<<REFS1)|(1<<REFS0); stimmen.
Grüße,
Christoph
Lesezeichen