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

ATmega32 - Poprawność funkcji|Inicjalizacja Timera w głównej pętli programu

mikroice90 05 Sty 2013 12:21 1563 6
REKLAMA
  • #1 11743741
    mikroice90
    Poziom 13  
    Witam,

    czy poniższe funkcje działają w sposób prawidłowy z logicznego punktu widzenia?
    Jeżeli ustawiam timer i OCR0 ręcznie to układ działa jak trzeba a po wykonaniu tych funkcji nie.
    tablica_uart jest to tablica charów o rozmiarze 5. np. "00064" czyli 100.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 47 [minuty]:

    I czy można zaininicjować timer w pętli glównej programu?
    Jeżeli robię to przed whilem to działa a wewnątrz już nie. Dlaczego?
  • REKLAMA
  • #2 11745766
    mieczotronix
    Poziom 16  
    Abstrahując że nie wiem co te funkcje mają dokładnie robić, to tutaj:
    const uint8_t preskaler[] = {1, 8, 64, 256, 1024}; 

    256 i 1024 się do uint8_t nie mieszczą i preskaler[3] i preskaler[4] będą równe 0
    co potem tutaj
    if(abs(f - tperiod)>abs(f - (F_CPU/preskaler[preidx]/(tperiod+1)))) tperiod+=1;

    wygeneruje hard faulta (dzielenie przez zero) i procek zacznie wykonywać program od nowa.
  • REKLAMA
  • #3 11746334
    mikroice90
    Poziom 13  
    Dziękuję bardzo przeoczyłem to.
    Funkcja przelicz ma z tablicy charów np. 186A0 - wyliczyć wartość dziesiętną w tym wypadku 100000.
    A metoda ustaw_timer ma na podstawie wyliczonej częstotliwości przez przelicz ustawić odpowiedni timer i odpowiednią wartość w rejestrze OCR0.
  • REKLAMA
  • #4 11750110
    mikroice90
    Poziom 13  
    O ile zmiana uint8_t na uint16_t rozwiązała problem. To nie jestem pewien czy funkcja przelicz wykonuję dobrą konwersję. Wnioskuję to z faktu że jeżeli w tablicy char będą kody ASCII "00064" *(czyli 100) to program zachowuje się inaczej niż w wypadku podstawienia wewnątrz f=100 przed metodą ustaw_timer
  • REKLAMA
  • #5 11754722
    mieczotronix
    Poziom 16  
    Bez jaj... Takiego prostego błędu nie chce ci się samemu wytropić ?
    Widać go przecież jak na dłoni.
    Wiesz przecież która funkcja źle działa...
  • #6 11754736
    BlueDraco
    Specjalista - Mikrokontrolery
    Tak, mea culpa - jest >, a powinno być <= w warunku konwersji.
  • #7 11787922
    mikroice90
    Poziom 13  
    Dziękuję rzeczywiście problem rozwiązany.
REKLAMA