Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Ustawienie Timera w atmega128

dzik1980 04 Cze 2006 12:20 1100 7
  • #1 04 Cze 2006 12:20
    dzik1980
    Poziom 10  

    Witam

    Mam pytanie dotyczace ustawienia Timera 16bitowego w atmega 128. Kwarc 8Mhz. Chce odmierzyc 1ms. Czy moj sposob postepowania jest sluszny?

    (1/8Mhz)*40000=5ms wiec ustawiam (timer1)

    TCCR1B=(0<<CS12 | 0<<CS11 | 1<<CS10); (no prescaling)
    oraz
    TCNT1H=0x63;
    TCNT1L=0xBF;

    Moim celem jest odczytywanie ADC co 5 ms i chce zebrac 2000 pomiarow, co powinno trwac 10s. Niesteety nie dziala jak zamierzalem i nie wiem gdzie jest blad. Obsluga przerwania wyglada tak:

    SIGNAL (SIG_OVERFLOW1)
    {
    TCNT1H=0x63;
    TCNT1L=0xBF;
    read_adc();
    ilosc_prubek++;
    }

    Dzieki bardzo za wszelkie info.

    DZIK

    0 7
  • #2 04 Cze 2006 16:35
    ijon_tichy
    Poziom 13  

    Witaj!
    na moje oko 0xBF63 = 48995 , wiec jesli nie używasz preskalera
    głownego zegara (tego dostępnego w CLKPR) i preskalera dla Timera1,
    to przerwanie powinno pojawiac sie co ok 6ms.
    Na czym polega problem ? Czy przerwanie pojawia się ?
    Poza tym dobrze jest skorzystac w takiej sytuacji z najpostszego trybu PWM. Wtedy przy przerwaniu AVR sam ładuje sobie TCNT1, a Ty
    jedynie wywołasz pomiar

    pzdr

    0
  • #3 04 Cze 2006 16:39
    dzik1980
    Poziom 10  

    Witam

    Problem polega nie na tym ze mikrokontroler nie wywoluje przerwania tylko na tym ze robi to zbyt szybko. Zbieranie tych 2000 probek trwa kolo 1s zamiast 10 i nie wiem co z tym zrobic. Jakbys mial jakis pomysl to bylbym wdzieczny za rade. A sugestia z PWM chyba jest sluszna. Musze cos o tym jeszcze popytac bo nigdy tego nie uzywalem jeszcze. Dzieki za info

    DZIK

    0
  • #4 04 Cze 2006 17:10
    ijon_tichy
    Poziom 13  

    W takim trybie jaki stosujesz licznik liczy w góre , a wiec pomiar jest co 2ms. FFFF-BF63= 409C = 16540
    Ale to i tak sie nie zgadza

    aj teraz dopiero zauwazyłem ze ma byc 63BF
    a nie jak myslałem BF63

    0
  • #5 04 Cze 2006 17:22
    dzik1980
    Poziom 10  

    Witam

    Wszystko sie zgadza. Rejestr jest zapisywany wartoscia 0x63BF a nie 0xBF63 i wtewdy wychodzi 0xFFFF-0x63BF= 0x9C40=40000 a 40000*0,125us=5ms. Niemniej jednak nadal nie rozwiazuje to mojego problemu. Pomiar powinien trwac ok. 10s a trwa 10 razy krocej i nie wiem gdzie lezy blad. W czasie pomiaru nie jest wykonywana zadna operacja na mikrokontrolerze (pusta petla za wykona 2000 pomiarow).

    DZIK

    0
  • #6 04 Cze 2006 17:48
    ijon_tichy
    Poziom 13  

    No umnie na 7,38MHz (ATMEGA32)
    trwa ok. 10s

    TCCR1B=(0<<CS12 | 0<<CS11 | 1<<CS10);// (no prescaling)
    TIMSK = (1<<TOIE1);

    SIGNAL (SIG_OVERFLOW1)
    { static int count = 2000;
    TCNT1H=0x63;
    TCNT1L=0xBF;
    if (count--) ;
    else count = 2000;
    }

    0
  • #7 04 Cze 2006 18:35
    dzik1980
    Poziom 10  

    Dzieki za pomoc. Nie wiem czy to ma jakies znaczenie i jak dokladna jest symulacja w AVR studio ale bez preskalera podczas symulacji watosci w rejestrze TCNT1 rosna nie co jeden w tylko co kilka. Dopiero po przestwaieniu preskalera na 64 symulacja daje zmiany licznika co 1 przy kazdej inkrementacji. Co o tym myslisz? Moze to pomoze. Niestety musze poczekac do jutra z praktycznymi probami.


    DZIK

    0
  • #8 04 Cze 2006 18:58
    ijon_tichy
    Poziom 13  

    No nic dziwnego, że kilka. W końcu piszesz w C a nie w asemblerze .
    Jedna insrukcja w C to kilka asemblerowych.
    Mój powyższy kod wsadziłem do sprzetu, w debugerze (JTAG ICE)
    ustawiłem breakpoint na linijce :
    else count = 2000;
    i program wpada tu co 12s
    A symulator studio nie jest wyrocznią ;)
    Na pewno Ci zadziała.

    0