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

atmega16 niestabilny odczyt z ADC.

donelbaron 10 Lip 2009 11:17 3332 9
REKLAMA
  • #1 6761744
    donelbaron
    Poziom 15  
    zatem tak procesor atmega16, zaprogramowałem atmege na pomiar ciągły i mam bardzo dziwny problem, atmega połączona przez UART do komputera, zczytywanie w labview. tam trzeba ustawić takie coś jak delay before raad(ms), w kodzie na atmedze ustawiłem _delay(100), w programie tez, i mam bardzo dziwny problem, nic nie jest podpięte do przetwornika, powinna być linia prosta, i co jakiś czas około 3 sekund jest nagle nie wiadomo skąd spadek do zera i powrót. Pomiar na żadnie to samo, wszystko ładnie się mierzy, ale co jakiś czas ten spadek , i psuje mi całe pomiary, z czym to może być związane?

    int main(void)                        // program główny
    {
       USART_Init( UART_CONST);
       DDRB=0xFF;
       ADMUX = 0;                // wybierz kanał 0 przetwornika ADC
       ADCSRA = _BV(ADEN)|_BV(ADIE)|_BV(ADATE)|_BV(ADSC)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2);
    
    
    
    
        while(1)
        {
        	
        	_delay_ms(100);
        	UART_putint(value,10);        // wypisz przetworzoną wartość
    
        }
    
    }
    
    SIGNAL(SIG_ADC)                        // przerwanie z przetwornika ADC
    {
      value = ADCW;                        // czytaj wartość z przetwornika ADC
    
    }


    atmega16 niestabilny odczyt z ADC.


    mam pomysł gdzie może leżeć problem ale nie wiem jak to rozwiązać,otóż to jest wynikiem tej nie zgodności czasów wystawiania danych przez mikroprocek i czytania przez komputer, mimo że tam jest 100 i tu, po stronie mikroprocka to jakoś innaczej chyba powinno wyglądać bez tego opóźnienia, ale jak?


    jak wziąlem zakomentowałem opóźnienie to mi wystawia z ogromna częstotliwościa te pomiary, jak to innaczej zmniejszyc?
        while(1)
        {
    
        	//_delay_ms(100);
        	UART_putint(value,10);        // wypisz przetworzoną wartość
    
        }
    
    }
    
    SIGNAL(SIG_ADC)                        // przerwanie z przetwornika ADC
    {
      value = ADCW;                        // czytaj wartość z przetwornika ADC
    
    }

    dochodze do wniosku że jak zczytam z portu wartość to jej już tam nie ma i ten czas wystawiania i czytania powinien być idealny , jak można by sobie z tym poradzić innaczej?
  • REKLAMA
  • #2 6761897
    GienekS
    Poziom 32  
    Moja propozycja to taka aby procesor wysyłał ci wynik dopiera na wezwanie przez program z PC.
  • REKLAMA
  • #3 6762199
    donelbaron
    Poziom 15  
    tak, juz tak zrobiłem i to działa, ale wciąż mnie zastanawia jak tamtą opcje by innaczej naprawić aby działało w trybie samo wysyłającym
  • REKLAMA
  • #4 6762387
    Konto nie istnieje
    Poziom 1  
  • #5 6763263
    donelbaron
    Poziom 15  
    tak myślalem, o tym, ale oczywiste jest że tracił bym minium jedną probke a nawet dwie co jakis czas, czemu dwie? bo jak by to działalo tak że tyko jedną, to tam 100 i tu 100 powinno działać, nie działa bo jest opóźnienie, powinno być w labview możliwość czytania z portu jak coś dojdzie a nie ustawiania tego czasu, ale nie sadzę żeby było coś takeigo.
    Poresztą to był by totalny chaos w czytaniu, a na to sobie pozwolić nie mogę.
    Jak by się dało wyłączyć kolejkowanie to jeszcze jakoś, ale jak nie zczytam wartości np 55, przed nadejściem drugiej, np 56, to w efekcie przeczytam nie 56 tylko dwie naraz 5556.
  • REKLAMA
  • #6 6763323
    Konto nie istnieje
    Poziom 1  
  • #7 6763467
    donelbaron
    Poziom 15  
    jak mam w avr, ustawione na 100, i czytam np co 60 to pierwszy znak zczytam po 60, drugi po 120 i trzeci po 180 ale to beddzie w przedziale od 100 do 200, więc nic nie będzie bo ta wartość już została zczytana, więc będzie 0, a załóżmy drugi wariant, wystawiam co 100, czytam co 140, więc tak, pierwszą próbke trace, i czytam od razu drugą , potem przeczytam po czasie 280 trzecią, czwarta wejdzie w bufor, a ja przeczytam po czasie 420 czyli czwartą i piąta, czyli duża liczbe, rozumiesz teraz czemu ten pomysł jest zły? jak ustawie dokładnie tam 100 i w labview 100, to też nie działa bo musi być jakieś opóźnienie, wiec jedyne co by mnie ratowało to wyłączyć to kolejkowanie, zgadzasz sie?
  • #8 6764100
    Konto nie istnieje
    Poziom 1  
  • #9 6764964
    donelbaron
    Poziom 15  
    tak, w labview nie ma czegos niewiadomego, jak np czytasz w C pamięć której czytać prawa nie masz, to są krzaki, w labview jak nie wiadomo co to 0.
    Dla bardziej zainteresowanych bardzo ciekawa sugestia człowieka który ma duże pojęcie o labview.
    Link
  • #10 6765208
    Konto nie istnieje
    Poziom 1  
REKLAMA