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 ATmega32 [C] free running mode

Walentynka 26 Lut 2011 09:43 1880 4
REKLAMA
  • #1 9205558
    Walentynka
    Poziom 14  
    Mam mały problem z uruchomieniem ADC w C. Na wyświetlaczu otrzymuje wynik przetwarzania ilość poziomów kwantywizacji ale nie zmienia on się po zmianie napięcia wejściowego na ADC tak jakby ADC było włączone w single conversion mode cały czas jest to samo. Ale jak przekręcę potencjometr i zresetuje to znów otrzymuje poprawny wynik ale już się on nie zmienia, wydaje się ze nie są uaktualniane rejestry ADCH i ADCL. I po pierwszej konwersji ADC zatrzymuje się ale dlaczego ?

    
    #define F_CPU 16000000L
    #include <avr/io.h>
    #include <util/delay.h>                
    
    
    
    	int main(void)
    	{
    		SFIOR=0x00;			/* ADC inicjalizacja free run 10 bit */
    		ADMUX=0x00;
    		ADCSRA=0xE7;
    	
    		LCD_ins(1);
    
    for (;;){
    	
    	
    		a=ADCH<<8;
    		b=ADCL;
    		a=a|b;
    		
    		c=a/1000;
    		a=a-(c*1000);
    		c=c+'0';
    		LCD_dana(c);
    		c=a/100;
    		a=a-(c*100);
    		c=c+'0';
    		LCD_dana(c);
    		c=a/10;
    		a=a-(c*10);
    		c=c+'0';
    		LCD_dana(c);
    		a=a+'0';
    		LCD_dana(a);
    		_delay_ms(1000);
    		LCD_ins(1);
    
    		_delay_ms(1000);
    		}
    	}
    
  • REKLAMA
  • Pomocny post
    #2 9205738
    Andrzej__S
    Poziom 28  
    Atmel napisał:

    When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently,
    if the result is left adjusted and no more than 8-bit precision is required, it is
    sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH.

    Spróbuj może odczytywać ADCL w pierwszej kolejności, być może w tym jest problem.

    BTW:
    Biblioteka <stdlib.h> zawiera funkcję 'utoa()', która służy do konwersji unsigned int do ciągu znaków:
    
    .......
    #include <stdlib.h>
    
    
       int main(void)
       {
          char bufor[8];
          .........
    
          for (;;){
             b=ADCL;
             a=ADCH<<8;
             a=a|b;
    
          // przekształcenie zmiennej na ciąg znaków
          // trzeci parametr dotyczy podstawy systemu liczbowego,
          // czyli w tym przypadku dziesiętnego
             utoa(a, bufor, 10);
    
          // nie wiem jak masz nazwaną funkcję wyświetlającą na LCD
          // ciąg znaków, ale powiedzmy, że wygląda to tak
             LCD_string(bufor);
             .......
          } 
       }
    

    W tym przypadku cała konwersja to jedna linijka kodu, co zwiększa jego czytelność.
  • REKLAMA
  • #3 9205751
    Walentynka
    Poziom 14  
    Widziałem ze to jakiś beznadziejnie mały błąd teraz działa wszystko jest ok. W dodatku czytałem dokumentacje na temat odczytu i wydawało mi się ze tak powinno być.
  • REKLAMA
  • Pomocny post
    #4 9205776
    tmf
    VIP Zasłużony dla elektroda
    ADMUX=0 - na pewno korzystasz z Vref podłączonego pod ten pin?
    Dwa, czytaj ADC, nie ma potrzeby kombinowania z połówkami.
REKLAMA