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

[atmega][c] odmierzanie czasu w dół

autotransformat 18 Maj 2009 11:22 2927 7
REKLAMA
  • #1 6544013
    autotransformat
    Poziom 10  
    Witam.
    Szukalem na forum podobnego wątku, ale nie znalazłem.

    Chciałem więc zapytac, jak odmierzać czas w dół. Użytkownik wprowadza np. liczę minut i na lcd wyświetlamy odliczanie do zera. Mozna coś takiego zrobić na timerach?

    edit: Może zbyt ogólnie sie wyraziłem. Wiem, że coś takiego można zrealizować za pomocą odpowiedniej struktury, a potem za pomocą pętli zliczać minuty i sekundy w dół. Problem w tym, że nie radzę sobie z przerwaniami. Można to zrealizować bez nich?
  • REKLAMA
  • REKLAMA
  • #3 6544255
    jarekgol
    Poziom 38  
    Krótka podpowiedź: ustaw sobie któryś timer żeby się przepełniał co 1 sekundę albo jakąś WYMIERNĄ część sekundy (należy ustawić odpowiedni podzielnik zegara CKSL i wartość w OCRx) i następnie albo
    uruchom przerwanie od zegara i w programie przerwania będzie ci się odejmować od zmiennej (powiedzmy sekundy--; )
    albo
    testuj programowo flagę timera i jak wykryjesz przepełnienie to robisz sekundy--; czyść flagę"
    Oczywiście poza tym musisz zrobić obsługę minut, wyświetlania itd...
  • #4 6544266
    autotransformat
    Poziom 10  
    Dzięki za odp. na razie udalo mi sie to zrobić przy użyciu polecenia _delay_ms() ze standardowej biblioteki, ale wiem, że to pójście na łatwiznę ;).

    Obsługe minut i wyświetlania juz w zasadzie skończyłem. Nie wiem, czy coś będę musiał zmieniać przy przejściu na timery.
  • #5 6548594
    jarekgol
    Poziom 38  
    Tiemery są lepsze bo proc nie czeka bezczynnie, cały czas może sprawdzać inne we/wy. delay() zatrzymuje Ci proca, jak sleep ,wait itp. w innych językach.
  • REKLAMA
  • #6 6564770
    autotransformat
    Poziom 10  
    Witam. Urzyłem w moim programie Timer1. I od razu wynikł tu problem. Pomimo użycia podobno dokładnego odliczania i tak sekundy są naliczane zbyt wolno (przynajmniej na wyświetlaczu). Wie ktoś z jakiego powodu? Oto istotna część programu:



    
    TCCR1B |= ((1 << CS10) | (1 << CS11)); //częstotliwość przez 64
    
    if (TCNT1 >= 15625) //jeśli minie 1 sec
     {
    
     itoa(i,sec, 10);
     lcd_gotoxy(3,0);
     lcd_puts(sec);
    TCNT1 = 0;
    }
    

    Całość oczywiście w petli odliczającej sekundy.
    Procesor ATMega16 1MHz.

    Z góry dzięki za pomoc.
  • #7 6564824
    _Robak_
    Poziom 33  
    Na jakiej czestotliwosci dziala procek? Poza tym ja bym zliczal sekundy przez tryb CTC, w przerwaniu bym aktualizowal zmienna. Oczywiscie samo wyswietlanie poza przerwaniem.
  • REKLAMA
  • #8 6564871
    autotransformat
    Poziom 10  
    _Robak_ napisał:
    Na jakiej czestotliwosci dziala procek?


    1 MHz. Dzięki. spróbuję przez CTC.
REKLAMA