używam AVRStudio + WinAVR i wszystko kompiluje się poprawnie. Niestety nie mogę rozgryźć swojego błędu przy przełączaniu kanału ADMUX. Próbowałem już na wiele sposobów dodając różne opóźnienia, żeby wyzerować rejestr ADCH z którego odczytuję zmienne.
Program pobiera pomiary z 4 kanałów ADMUX[0:4] i zapisuje je do tablicy:
Kod: Zaznacz cały
volatile unsigned int dalmierz[4] = {0,0,0,0};Kod: Zaznacz cały
if (dalmierz[3]>=126){..}poniżej kod:
Kod: Zaznacz cały
void inicjalizacja (void)
{
/*******WEJŚCIA*****/
/*******WYJŚCIA*****/
// 7654 3210
DDRA = 0x00; // 0000 0000 wejścia ADC z dalmierzy
/********ADC********/ // 7654 3210
ADMUX = 0x60; // 0110 0000 odniesienie=AVCC, pomiar wyrównaj do lewej żeby czytać 8 bitów
ADCSRA = 0xC6; // 1100 0110 konfiguracja ADC, opis w dokumentacji projektu
SFIOR=0x00;
}
int main (void)
{
sei(); //globalne włączenie przerwań
for(;;)
{
unsigned int m=0;
unsigned int i=0; //pomocnicza zmienna do iteracji "i"
sei();
inicjalizacja();
for(m=0;m<4;m++){ dalmierz[m]=0;}//przypisanie wartości początkowych w tabeli
for(i=0;i<4;i++)
{
if(i==0){
ADCSRA |= (1<<ADSC); //odczytanie wartości do tabeli dalmierz z ADC
_delay_ms(15); //opóźnienie w celu wykonania funkcji przerwania
dalmierz[0]=ADCH; //odczytanie cyfrowej wartosci sygnalu
ADMUX = 0x61;
}
else if(i==1){
ADCSRA |= (1<<ADSC); //odczytanie wartości do tabeli dalmierz z ADC
_delay_ms(15); //opóźnienie w celu wykonania funkcji przerwania
dalmierz[1]=ADCH; //odczytanie cyfrowej wartosci sygnalu
ADMUX = 0x62;
}
else if(i==2){
ADCSRA |= (1<<ADSC); //odczytanie wartości do tabeli dalmierz z ADC
_delay_ms(15); //opóźnienie w celu wykonania funkcji przerwania
dalmierz[2]=ADCH; //odczytanie cyfrowej wartosci sygnalu
ADMUX = 0x63;
}
else{
ADCSRA |= (1<<ADSC); //odczytanie wartości do tabeli dalmierz z ADC
_delay_ms(15); //opóźnienie w celu wykonania funkcji przerwania
dalmierz[3]=ADCH; //odczytanie cyfrowej wartosci sygnalu
ADMUX = 0x60;
}
_delay_ms(15);
}
if (dalmierz[3]>=126){ //podaję wartość około ~200
...//instrukcje
cli();
for(m=0;m<4;m++) dalmierz[m]=0;//wyzerowanie odczytu
}