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

[atmega8][c]Problem z odmierzaniem 1 sekundy

Piotr Kania 15 Mar 2009 22:53 1506 16
REKLAMA
  • #1 6287410
    Piotr Kania
    Poziom 15  
    Potrzebuje odmierzyć dokładnie 1 sekundę mam to zrobione na _delay_ms(1000); czy ktoś może podać jakiś przykład na timerze. Z góry dziękuje za pomoc
  • REKLAMA
  • #3 6287464
    Piotr Kania
    Poziom 15  
    a jak ustawić ten timer bo tu mowa chyba o timer0
  • REKLAMA
  • #4 6287516
    dawid512
    Poziom 32  
    Dla m8 polecam ustawić Timer2 w tryb CTC. Jak to zrobić znajdziesz w datasheecie.
  • #5 6287534
    Piotr Kania
    Poziom 15  
    no ale timer 2 potrzebuje 2 kwarca a wole zrobić to na tym głównym da się tak ?
  • Pomocny post
    #6 6287614
    dawid512
    Poziom 32  
    Potrzebuje ale w momencie gdy jest ustawiony do pracy w trybie asynchronicznym.
  • REKLAMA
  • #7 6287633
    Piotr Kania
    Poziom 15  
    sprecyzuje swój problem, mój program wykrywania braku sygnału nadajnika, sygnał nadawany jest co sekundę.

    
    while(PIND&(1<<RF12_IRQ))
    {								// jeśli brak przerwania czeka 600 x 2ms
    k++;
    _delay_ms(2);
    if(k>=600)
    {
    k=600;
    LCD_xy(0,0);
    write_text("  Brak sygnalu  ");
    LCD_xy(1,0);
    write_text("                ");
    }
    }
    


    chce to zrobić na timerze jęśli czas oczekiwania > 1 sekundy to pisz brak sygnału
  • REKLAMA
  • #10 6288464
    _Robak_
    Poziom 33  
    Takie cos mi znalazlo google :>
  • #11 6288565
    Petros
    Poziom 20  
    za pomocą zwykłych timerów nigdy nie uzyskasz dokładnie jednej sekundy ponieważ są zbyt mało dokładne i timery niekiedy sie "spóźniają" bo uC ma też inne sprawy na głowie. Sytuacja poprawia se jeśli podłączymy zewnętrzny oscylator, a najlepiej podłączyć kwarc 32768Hz i taktować nim tylko Timer2

    ustawiamy ASSR|=1<<AS2; i dajemy prescaler 128 i kiedy występuje przepełnienie Timera2 to jest równo 1s
  • #12 6288692
    _Robak_
    Poziom 33  
    Wlasnie dlatego stosuje sie przerwania, jak procek ma cos innego do roboty to one i tak wystapia. Jesli ma wystapic pozniej przy pracy synchronicznej, to przy asynchronicznej tez wystapi pozniej. A co do kwarcu zegarkowego, przy zegarze 1MHz tez da sie odmierzyc dokladnie jedna sekunde :)
  • #13 6288801
    Petros
    Poziom 20  
    _Robak_ napisał:
    Wlasnie dlatego stosuje sie przerwania, jak procek ma cos innego do roboty to one i tak wystapia. Jesli ma wystapic pozniej przy pracy synchronicznej, to przy asynchronicznej tez wystapi pozniej. A co do kwarcu zegarkowego, przy zegarze 1MHz tez da sie odmierzyc dokladnie jedna sekunde :)


    Według moich doświadczeń błąd odmierzania czasu za pomocą wewnętrznego zegara błąd zawsze wynosi około 5% mimo że z obliczeń prescalera wynika 0,3% Nie mam racji?

    Jak z 1 MHz chcesz zrobić 1Hz dokładnie?
  • #14 6288806
    _Robak_
    Poziom 33  
    Oczywiscie wszystko zalezy od kwarcu jaki zastosujesz. I nie ma znaczenia czy bedziesz pracowac w rybue asynchornicznym czy nie. A przepis na jedna sekunde jest prosty: bierzesz 16 bitowy licznik 1, ustawiasz tryb CTC (albo i nie), prescaller dajesz na 64 i odmierzasz wartosc 0x3D09.
  • #15 6295934
    Piotr Kania
    Poziom 15  
    Zrobiłem to na timer1 działa ale jak zrobić żeby w dowolnym punkcie programu zaczynał zliczać od nowa, czy TCNT1 = 0x00; zadziała ??

    Dodano po 23 [minuty]:

    Przetestowałem to i działa ale czy to dobre rozwiązanie ?
  • #17 6296803
    Piotr Kania
    Poziom 15  
    tak on ma odliczyć tylko krótki odcinek czasu

    Dodano po 4 [minuty]:

    ustawie go tak żeby odliczał 1,2 sekundy i wystawił przerwanie które wyświetli brak sygnału.

    
    
    TCNT1 = 0x00;
    while(PIND&(1<<RF12_IRQ)) sygnał ma przychodziś co 1 sek i program wyskakuje z tej pętli jeśli nie, to timer dojdzie do 1,2s i wyświetli się brak sygnału 
    {                        
    } 
    
REKLAMA