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

Jak ustawić timer na PIC 16f84a do odliczania jednej sekundy?

madzienka 12 Maj 2007 20:14 1452 1
REKLAMA
  • #1 3877869
    madzienka
    Poziom 10  
    Posty: 55
    Witam. Próbuje napisać zegarek na PICu. Używam oscylatora 4 MHz. Nie wiem jak zrobic odliczanie jednej sekundy. Pisałam o tym na innym forum i otrzymałam taka odpowiedź:

    "Jeśli używasz kwarcu 4 MHz to ustaw preskaler na dzielenie przez 64. W takim przypadku do licznika/timer'a będą przychodziły impulsy o częstotliwości 15625 Hz (1000000 / 64 = 15625).
    Jeśli w obsłudze przerwania załadujesz wstępnie rejestr licznika wartością 0x83 (dziesiętnie 131) to przerwanie od przepełnienia licznika będzie występowało dokładnie 125 razy na sekundę. Wystarczy teraz (również w obsłudze przerwania) inkrementować jakąś zmienną przy każdym przerwaniu i po doliczeniu do 125 masz dokładnie jedną sekundę."

    Mógłby mi ktos wytłumaczyć jak to dokładnie się przelicza? Skąd wiadomo, że timer trzeba zaladowac wartoscia 131 i, że przerwanie bedzie występować 125 razt na sekundę?

    Na podstawie otrzymanej odpowiedzi napisałam taki kod (obsługa przerwania):

    //obsługa przerwania
    void interrupt() {

    if ( T0IF == 1 ) // czy timer sie przekrecil ?
    {
    if( T0IE == 1 ) // czy jest wlaczone przerwanie od timera
    {
    TMR0=0x83;
    licznik++;
    if (licznik==125) {
    licznik=0;
    s++; //sekundy
    if (s==60) {
    s=0;
    m++; //minuty
    if (m==60) {
    m=0;
    g++; //godziny
    if (g==24) g=0;
    }
    }
    }
    }
    T0IF = 0; // kasuj flage timera 0
    }
    }


    Nie wiem dokładnie czy w dobrym momencie ładuje rejestr licznika wartoscia 0x83. Oczywiscie bity w PTION_REG ustawiam na:
    T0CS = 0
    PSA = 0
    PS2 = 1
    PS1 = 0
    PS0 = 1

    Program narazie piszę na układzie testowym. Schemat układu:
    http://www.blitzlogic.com/led.htm

    Bity w rejestrze INTCON ustawiam na:
    GIE=1
    T0IE=1
    T0IF=1
    Nie wiem czy robię to dobrze?
  • REKLAMA
  • #2 3886733
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    1. Maksymalna pojemność licznika wynosi 255 +1 na przepełnienie.
    2. Żeby odliczyć 125 impulsów taktujących do przepełnienia trzeba wpisać wartość początkową 131, ponieważ 131 +125 impulsów = 256 - czyli dla 8 bitów =0 i przepełnienie.
    3. Częstotliwość taktowanie, jak napisałeś wynosi 15625Hz, czyli przepełnienia licznika występuje co 125 impulsów 15625Hz/125 = 125Hz
    (częstotliwość przerwania wynosi 125Hz)
    4.Aby otrzymać 1sek musisz zliczyć 125 przerwań (co z resztą czynisz)
    5.Ładowanie licznika powinno być pierwszą instrukcją w przerwaniu.
    Teoretycznie działa wszystko ładnie, a praktycznie zegarek będzie się opóźniał (znacznie).
    Na początek,żeby Ci nie mieszać w głowie powiem tyle, że wartość początkową będziesz musiał skorygować (zwiększyć) doświadczalnie.
    To jest normalne przy takim sposobie odmierzania czasu.
    Ten problem na forum już był poruszany i jak Cię to interesuje głębiej proponuje znaleźć.
    6.Nie wiem jak jest w PIC ale w obsłudze przerwania operacje na TOIF
    wydają mi się podejrzane (niepotrzebne), oraz deklaracja procedury interupt .
    Ale w tej sprawie niech wypowie się ktoś bardziej kompetentny.


    Na resztę pytań nie znam odpowiedzi.

    Rozjaśniło się?
REKLAMA