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

[atmega8][avr studio] ADC problem z odczytaniem wartości

tomasz1987 29 Sty 2010 19:22 2444 2
REKLAMA
  • #1 7612346
    tomasz1987
    Poziom 16  
    /*******************************************************************************/
    /*					             PROPOX                                        */
    /*                           www.propox.com                                    */
    /*                                                                             */
    /* Program demonsturjacy dzilanie przetwornika ADC - PC0 wejscie analogowe.    */
    /* This program show how to use ADC converter - PC0 analog input.              */
    /*******************************************************************************/
    // wewnetrzny zegar 1MHz (internal oscillator 1MHz)
    // PD0 - R/S
    // PD1 - E
    // PD2 - D4
    // PD3 - D5
    // PD4 - D6
    // PD5 - D7
    // ADC
    // PC0 - ADJ1
    #include <avr/io.h>
    #include <avr/interrupt.h>        
    #include <avr/signal.h>
    #include <avr/sleep.h>  
    
    #include "char_code.h"
    #include "LCD_lib.h"
    
    
    volatile uint8_t  value;
    volatile uint8_t  value_bit[8];
    
    const uint8_t wartosc[] = ("ADC val:");
    
    
    
    //przerwanie z przetwornika ADC
    SIGNAL(SIG_ADC)                        
    {
    uint8_t i;
    
      	value = ADCH;
    	//wartosc z przetwornika
      	for(i=0;i<8;i++){
    	value_bit[i] = ((value & 0x80)>>7)|0x30;
    	value = value << 1;
    	}
    	LCDGotoXY(8,1);
        LCDstring(value_bit,8);
    	ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADSC)|_BV(ADPS1)|_BV(ADPS0);
      
    } 
    
    
    
    int main(void)
    {
    //LCD
    LCDinit();
    LCDcursorOFF();
    LCDGotoXY(0,1);
    LCDstring(wartosc,8);
    
    //Sleep mode
    set_sleep_mode(SLEEP_MODE_ADC); 
    
    //ADC
    ADMUX  = _BV(REFS0)|_BV(ADLAR);
    ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADSC)|_BV(ADPS1)|_BV(ADPS0);
    //Przerwania wlaczone
    sei(); 
    //Sleep
    sleep_mode();
    
    	while(1)
    	{
    	}
    	
    return 0;
    }
    


    Kod przedstawia wyświetlenie wartości z przetwornika na 8 bitach na wyświetlaczu. Problem w tym że nijak nie mogę tego ogarnąć dziesiętne czyli w zakresie 0 do 255
    teoretycznie zmienna value_bit[8] to tablica i wystarczy ją przemieść i zamienić na dziesiętne tak jak w normalnym c pod DEW C++ funkcja działała i zamieniała poprawnie.
    -przetwornik okrojony do 8 bitów
    - potrzebuje tego do sterowania potencjometrycznego (kręcę potencjometrem to np wypełnienie pwm się zmienia)
    Jak by ktoś mógł wskazać jak to poprawnie zamienić albo poprawić kod to bym był wdzięczny bo mi bzdury wychodzą np(liczy poprawnie do 124 potem spada na 74 liczy i taka herezja cały czas)

    od razu zaznaczam że przeglądnąłem forum z góry na duł jednak ja mam gotową płytę z propox'a i powinno wszystko działać bez budowania super wielkiego układu elektronicznego w załączniku schemat BEZ PROWIZJI
    Tak więc jak by ktoś miał hwilę to prosił bym o pomoc bo ja nie daje rady
  • REKLAMA
  • #2 7626138
    Nagus
    Poziom 27  
    Nie masz kondensatora podpiętego między AREF a masę (100n).
    "REFS0=1: AVCC with external capacitor at AREF pin"
  • #3 7627813
    tomasz1987
    Poziom 16  
    to proszę mi wytłumaczyć dlaczego ta funkcja działa dla przekształcenia bitowego czyli tak jak jest napisana w tym momencie POPRAWNIE
    jedynym mankamentem jest przekształcenie zmiennej value_bit[] na zmienną typu int w zakresie 0 do 255 czyli max co można zapisać na 8 bitach


    Projekt do którego potrzebowałem to opanować upadł ale jak ktoś podeśle jakiekolwiek podpowiedzi to będę wdzięczny

    funkcja jakiej użyłem do przekształcania tablicy do intiger'a
    int TabToInt(int tablica[])
    { int a=1, wartosc=0,i;
    for(i=0;i<8;i++)
    {
    wartosc= wartosc + tablica[i]*a;
    a=a*2;
    //cout<<"wartosc=" <<wartosc <<", tablica["<<i<<"]="<<tablica[i]<<", a=" <<a;
    //system("PAUSE");
    
    }
    return wartosc;
    }
    


    napisałem to na biegu i działa w c na dev'ie ale jakoś nie moge tego zintegrować z uc
REKLAMA