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

Wpływ ADC na UART? [m128][WinAVR]

AVRowiec 10 Maj 2010 16:33 1464 12
REKLAMA
  • #1 8058949
    AVRowiec
    Poziom 18  
    Witam,

    Mam dziwny problem. Nie wiem jakim cudem dzieje się to co się dzieje, a mianowicie:

    Przerwanie ADC po wykonaniu pomiaru ma ustawić flagę:

    ISR (ADC_vect)
    {
      
      wynik = ADCH; // wynik jest w ADCH tylko dla precyzji 8 bit !
    		
    	//// SUMOWANIE 128 PRÓBEK
     
    	s+=wynik;
    	
    	n++;
    	if (n>128) 
    	{
    		Upower = s/6400; // <-- wzór po uproszczeniu!
    		
    		flag_ADCDONE_SET; 
    		
    		  s=0;
    		  n=0;
    	}
    	else
               ADCSRA |= _BV(ADSC); // Wykonaj kolejny pomiar
    }


    I działa to idealnie.

    Żeby sprawdzić stan zasilania należy tylko wywołać gdzieś w kodzie

    ADCSRA |= _BV(ADSC); // Wykonaj kolejny pomiar


    i odczytać wartość Upower.

    Jednak po włączeniu zasilania i w momencie wykonywania pierwszego pomiaru Upower=0, dopiero drugi pomiar zwraca prawdę :)

    Postanowiłem więc wywołać przerwanie 3 razy, niby nic prostszego:

    float AktualneNapiecie()
    {
       flag_ADCDONE_RESET;
    
        TS("first"); 
       // AKTYWOWANIE PIERWSZEGO POMIARU
       ADCSRA |= _BV(ADSC); // Wykonaj kolejny pomiar
     
      // AKTYWOWANIE DRUGIEGO POMIARU JEŚLI ZAKOŃCZY SIĘ PIERWSZY
       while (flag_ADCDONE_IS_RESET) 
      
        flag_ADCDONE_RESET;
    	 
        TS("second");
        ADCSRA |= _BV(ADSC); 
          
       
       // AKTYWOWANIE TRZECIEGO POMIARU
       while (flag_ADCDONE_IS_RESET) 
      
         flag_ADCDONE_RESET;
      
        TS("third"); 
        ADCSRA |= _BV(ADSC); 
          
       // ZWRACANIE WYNIKU
       while (flag_ADCDONE_IS_RESET) 
       
         TS("last");
        flag_ADCDONE_RESET;
    	 	 
         return Upower;
       
    }


    I nie wiem jakim cudem na terminalu pokazuje się coś takiego (TS() - funkcja wysyłająca znaki do PC przez COMa)

    Cytat:

    first
    third
    third
    third
    last
    last
    last
    last

    Uz= 4.33


    Jakim cudem tak się dzieje? I gdzie zniknął napis 'second' , choć ciekawsze jest dlaczego 'third' i 'last' wyświetlają się kilka razy?!
  • REKLAMA
  • #2 8059300
    markosik20
    Poziom 33  
    Jak wygląd funkcja TS()? Wysyłanie przez UART robisz w przerwaniu?
  • #3 8059360
    AVRowiec
    Poziom 18  
    chyba nagle zaczeło działać...

    anyway jeśli ktoś potrafi wytułmaczyć to co się działo to będe wdzięczny..

    Dodano po 1 [minuty]:

    TS() wysyła znak po znaku za pomocą funkcji z datasheeta. Nie jest w przerwaniu.
    Ale i tak nie powinno mieć to chyba wpływu na działanie takiej funkcji.

    Zresztą teraz działa. nie wiem jeszcze dlaczego.
  • #4 8059797
    markosik20
    Poziom 33  
    AVRowiec napisał:

    anyway jeśli ktoś potrafi wytułmaczyć to co się działo to będe wdzięczny..


    Nie zapisałeś zmian przed kompilacją...
  • REKLAMA
  • #5 8059809
    _Robak_
    Poziom 33  
    W AVRstudio nie trzeba, przynajmniej defaultowo, jeśli w ogóle jest taka możliwość;]
  • #6 8059815
    markosik20
    Poziom 33  
    _Robak_ napisał:
    W AVRstudio nie trzeba...


    Hmm, a skąd wiemy że to AVRStudio?
  • #7 8059842
    _Robak_
    Poziom 33  
    Nie wiemy;] Poczekajmy w takim razie na autora:)
  • REKLAMA
  • #8 8061017
    AVRowiec
    Poziom 18  
    przecież w tytule napisałem że WinAVR :)

    Problem się rozwiązał więc temat można chyba zamknąć. Muszę przyjąć że poprostu coś wariowało.. w sumie była akurat burza u mnie =)

    A to zero przy pierwszym pomiarze brało się z czego innego chyba - nie sprawdzałem stanu flagi i zanim dokonał się pomiar defaultowa wartość zmiennej była wyświetlana (czyli 0).

    Anyway i tak robie pomiar dwa razy - tak profilaktycznie.
  • REKLAMA
  • #9 8061131
    markosik20
    Poziom 33  
    AVRowiec napisał:
    przecież w tytule napisałem że WinAVR :)


    Gwoli ścisłości, WinAVR nie równa się AVRStudio. Ja mam akurat WinAVR + eclipse, inni mają WinAVR + Notatnik, inny....itd.
  • #10 8061299
    AVRowiec
    Poziom 18  
    mam najnowszego WinAVRa w pakiecie z Programmers Notepad 2.
    Z AVRStudio nigdy nie korzystałem więc nie wiem z czym sie to je.
  • #11 8061606
    piti___
    Poziom 23  
    Witam

    while (flag_ADCDONE_IS_RESET)
    flag_ADCDONE_RESET;

    Może brakuje średnika po while ?
  • #12 8062308
    AVRowiec
    Poziom 18  
    w rzeczywistości w kodzie było jeszcze pare komentarzy etc. usuwając je musiałem usunąć i średniki. Ale tak czy siak nie tłumaczy to tego co wyszło na uart..

    Program teraz działa.
    Może niepotrzebnie robie pomiar dwa razy ale ostrożności nigdy za wiele:

    
    float AktualneNapiecie()
    {
       flag_ADCDONE_RESET;
    	
       //// AKTYWOWANIE PIERWSZEGO POMIARU
       
       ADCSRA |= _BV(ADSC); 
       
       while (flag_ADCDONE_IS_RESET);
     
       flag_ADCDONE_RESET;
    	
       //// KOLEJNY POMIAR
       
       ADCSRA |= _BV(ADSC); 
       
       while (flag_ADCDONE_IS_RESET);
    
       flag_ADCDONE_RESET;
       
       //// INTERPRETACJA WYNIKU
    	 
       if (Upower<4.0)  stan1 = 0; else stan1=1;
    			if (stan1 > stan2) { TS("\n\rI> EX POWER ON"); 
    			                   LED_GREEN_ON; LED_RED_OFF;
    								   }
    			if (stan1 < stan2) {TS("\n\rI> EX POWER OFF" ); 
    								 	 LED_RED_ON; LED_GREEN_OFF; }
    			stan2 = stan1;
    	 
    	 
      return Upower; 
    }
    


    Dodano po 1 [minuty]:

    Tak się zastanawiać czy nie dać by w tej funkcji włącznika/wyłącznika całego ADC.

    Czy ADC zużywa dużo energii kiedy nie jest używane?
  • #13 8062351
    piti___
    Poziom 23  
    Wydaje mi się że niepotrzebnie robisz pomiar w przerwaniu jeśli czekasz w funkcji na flagę i skończenie pomiaru. Całą procedurę z przerwania możesz umieścić w funkcji AktualneNapiecie i nie będziesz miał niepotrzebnych skoków do przerwania.

    Pomiar w przerwaniu ma sens jeżeli robisz w tym czasie coś innego w pętli głównej, i co obieg pętli sprawdzasz na fladze czy masz już zmierzone napięcie.

    Ale to tak poza tematem.
REKLAMA