logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ATMEGA32 ADC - sampluje z kanału 0 zamiast z 0 do 7

kuch_arc 27 Lis 2008 22:37 2323 4
REKLAMA
  • #1 5791723
    kuch_arc
    Poziom 14  
    Mam takowy problemik. Moj ADC jest tak skonfigurowany :
        
    adcinit
        DDRA  = 0x00 ;    //set ADC PA0 as input
        PORTA = 0x00 ;    // ~( 1 <<	0 ); // no internal pull-up
        ADMUX |=  (1 << REFS0) | (1 << REFS1) ; // Set ADC reference to 2.56 internal bandgap
        ADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit reading 
    
        ADCSRA |= (1 << ADEN);  // Enable ADC 
        ADCSRA |= (1 << ADSC);  // Start A2D Conversion - 1st one
    a tak sobie dziala w przerwaniu co 0.01s
    ISR(TIMER1_COMPA_vect){
    
    //unsigned char i;
    //channel0
    ADMUX &= ~((1 << MUX2)|(1 << MUX1)|(1 << MUX0));
    ADCSRA |= (1 << ADSC);
    while(!ADIF){} //wait for conversion to be over
    aBytes[0] = ADCH;
    
    //channel1
    //ADMUX |= (1 << MUX0 );
    ADMUX |= 1;
    ADCSRA |= (1 << ADSC);
    while(!ADIF){}//wait for conversion to be over
    aBytes[1] = ADCH;
    
    //channel2
    //ADMUX |= (1 << MUX1);
    //ADMUX &= ~(1 << MUX0);
    ADMUX |= 2;
    ADCSRA |= (1 << ADSC);
    while(!ADIF){} //wait for conversion to be over
    aBytes[2] = ADCH;
    
    //channel3
    ADMUX |= (1 << MUX0);
    ADCSRA |= (1 << ADSC);
    while(!ADIF){}//wait for conversion to be over
    aBytes[3] = ADCH;
    
    //channel4
    ADMUX |= (1 << MUX2);
    ADMUX &= ~((1 << MUX1) | (1 << MUX0));
    ADCSRA |= (1 << ADSC);
    while(!ADIF){} //wait for conversion to be over
    aBytes[4] = ADCH;
    
    //channel5
    //ADMUX |= (1 << MUX0);
    ADMUX |= 5;
    ADCSRA |= (1 << ADSC);
    while(!ADIF){} //wait for conversion to be over
    aBytes[5] = ADCH;
    
    //channel6
    ADMUX ^= ((1 << MUX1) | (1 << MUX0));
    ADCSRA |= (1 << ADSC);
    while(!ADIF){} //wait for conversion to be over
    aBytes[6] = ADCH;
    
    //channel7
    ADMUX |= (1 << MUX0);
    ADCSRA |= (1 << ADSC);
    while(!ADIF){} //wait for conversion to be over
    aBytes[7] = ADCH;
    }
    

    I ciagle sampluje mi z kanalu 0, zamiast ze wszystkich. Wyswietlam na LCD wszystkie wyniki na raz i jak cos zmieniam na kanale 0 ( napiecie ) to zmienia sie na kazdym innym wejsciu ( ktore sa niepodlaczone jeszcze).
    Sprawdzalem zmiane kanalu zarowno recznie ustawiajac bity jak i wpisujac 0 do 7 jak widac i nic. Co robie zle?

    Proszę używać znaczników [code] - uzupełniłem.
    [zumek]
  • REKLAMA
  • #2 5791914
    Dr.Vee
    VIP Zasłużony dla elektroda
    Za bardzo kombinujesz z tymi bitami, poza tym warunek !ADIF zawsze będzie fałszywy (ADIF to numer bitu w rejestrze, a nie wartość tego bitu). Nie prościej:
    int i;
    for (i = 0; i < 8; ++i) {
        ADMUX &= ~0x07; /* zeruj 3 najmłodsze bity ADMUX */
        ADMUX |= i; /* w i mogą być ustawione tylko 3 najmłodsze bity */
        ADCSRA |= _BV(ADSC); /* rozpocznij konwersję */
        loop_until_bit_is_set(ADCSRA, ADIF);
        ADCSRA |= _BV(ADIF); /* wyzeruj bit */
        aBytes[i] = ADCH; /* zapisz wynik */
    }

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #3 5791953
    kuch_arc
    Poziom 14  
    Dzieki za fast reply Dr.Vee, zumek nie spalem dosc dlugo , 4giveme ;)

    Dodano po 44 [minuty]:

    ee chyba mi cos szwankuje mozg po niespaniu... jak sie sprawdza bit na rejestrze?
    while(ADCSRA & ADIF ){} ???
  • REKLAMA
REKLAMA