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

ADC w ATMEGA32 - odczyt - dlaczego taka kolejność?

Adamu_s 04 Lip 2009 19:49 1566 3
REKLAMA
  • #1 6738991
    Adamu_s
    Poziom 11  
    Witam.
    Mam następujące pytanie odnośnie modułu ADC w ATmega32.
    Przeczytałem na stronie http://avr.elektroda.eu , że
    Cytat:
    Podczas odczytu należy uważać aby najpierw odczytywać ADCL a następnie ADCH, lub po prostu odczytywać 16 bitowy rejestr ADCW.

    Dlaczego tak jest?
    Dodam tylko, że sam się przekonałem o słuszności tej zasady. Odczytując najpierw starszy bajt a później młodszy układ nie działał tak jak powinien.

    Pozdrawiam.
  • REKLAMA
  • Pomocny post
    #2 6739344
    janbernat
    Poziom 38  
    Układ cały czas liczy-nawet jak czytasz.
    Odczytujesz ADCH- a ADCL chce tam jakiś bit wsunąć.
    W starych 8051 tak się odczytywało licznik 16 bitowy.
    W AVR liczniki są buforowane- czytasz z innego rejestru niż rejestr licznika.
    ADC nie jest buforowane-czytasz bieżącą wartość.
  • REKLAMA
  • #3 6741911
    Adamu_s
    Poziom 11  
    Witam.
    Można jednak najpierw odczytać starszy bajt a następnie młodszy w następujący sposób:

    Wysyłam na linijkę diodową na zmianę starszy i młodszy bajt zmiennej przetworzonej przez ADC:

    while(1)
    	{
    		ADCSRA|=_BV(ADSC);							//Start konwersji
    
    		while (bit_is_clear(ADCSRA,ADIF));     //Dzialaj w petli dopoki bit ADIF jest zerowy, czyli dopoki trwa konwersja
    									                  //Zakonczenie konwersji skutkuje ustawieniem bitu ADIF i mozemy isc dalej
    		
    		ADCSRA|=_BV(ADIF);							//Przywracamy zerowa wartosc znacznika ADIF wpisujac mu "1" logiczna
     		
    		PORTB=starszy_bajt(ADCW);
    		delay(5000);
    		PORTB=mlodszy_bajt(ADCW);
    		delay(5000);
    	}


    gdzie :

    unsigned char mlodszy_bajt(unsigned int zmienna)	//funkcja zwraca mlodszy bajt ze zmiennej 16-bitowej
    {
    	return (char)(zmienna);
    }
    
    
    unsigned char starszy_bajt(unsigned int zmienna)	//funkcja zwraca starszy bajt ze zmiennej 16-bitowej
    {
    	return (char)(zmienna>>8);
    }


    Pozdrawiam.

    Dodano po 1 [minuty]:

    W ten sposób z wykorzystaniem rejestru ADCW program działa tak jak powinien.
  • #4 6742751
    janbernat
    Poziom 38  
    No nie wiem.
    str.198 datasheet, na początku strony.
REKLAMA