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?
"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?