Bu yazımızda PIC18F4520 timer kullanımını inceleyeceğiz, daha önceki yazılarımızda bu konuyu Arduino kartlar için incelemiştik. Önce zamanlayıcıların ne olduğunu, onların masıl çalıştığını göreceğiz ve daha sonra PIC18F4520 zamanlayıcılarını sırasıyla 100ms ve 500ms gecikme üretecek şekilde yapılandıracağız. Sonunda ExploreEmdedded Zamanlayıcı kütüphanesini nasıl kullanılacağını göreceğiz.
PIC Zamanlayıcıda Prescaler ve Kesme Gecikmesi Notu
PIC zamanlayıcı uygulamalarında hedef gecikme doğruluğu, prescaler seçimi ve kesme rutin süresine bağlıdır. Teorik hesap doğru olsa bile ISR içinde uzun işlem yapılırsa periyot kayması oluşur. Bu nedenle zaman kritik uygulamalarda kesme içinde yalnızca bayrak yönetimi yapıp ağır işlemleri ana döngüye taşımak daha doğrudur. Ayrıca osilatör toleransı ve clock kaynağı kararlılığı uzun periyotlarda toplam hatayı büyütür. Pratikte ölçüm cihazı ile gerçek periyot doğrulaması yapmak, yazılım hesabını güvenceye alır.
Timer / Zamanlayıcı Hakkında Temel Bilgiler
Adından da anlaşılacağı gibi, bu modüller zamanı ölçmek veya doğru zaman gecikmesini oluşturmak için kullanılır. Ayrıca mikrodenetleyici kendi başına döngüler çalıştırarak gereken zaman gecikmelerini de üretebilir / ölçebilir, ancak zamanlayıcı modülü, mikroişlemciyi bu gereksiz ve tekrarlayan görevden kurtarır ve diğer görevler için maksimum işlem süresi tahsis etmesini sağlar.

Zamanlayıcı, saat atımlarını (Dahili / Harici) saymak için yapılandırılabilen basit bir ikili sayaçtan başka bir şey değildir. Maks değerine ulaştığında, bir OverFlow bayrağı ayarlayarak sıfıra geri döner ve etkinleştirilirse kesmeyi/interrupt oluşturur.

PIC Timer / Zamanlayıcı Modülü
PIC18F4520, zamanlayıcısı, sayaç veya PWM üretimi için kullanılabilen üç bağımsız zamanlayıcıya sahiptir. Aşağıdaki tabloda üç Zamanlayıcının ayrıntıları verilmiştir.
| İsim | Boyut | Kontrol Kaydı | Sayım Kaydı | Min Gecikme | Maks Gecikme |
|---|---|---|---|---|---|
| TIMER0 | 8 bit | OPTION_REG | TMR0 | 0.2usec | 13.107ms |
| TIMER1 | 16 bit | T1CON | TMR1H, TMR1L | 0.2usec | 104.857ms |
| TIMER2 | 8 bit | T2CON | TMR2 | 0.2usec | 819usec |
Zamanlayıcı Hesaplaması
PIC Osilatör frekansı 4’e bölünür ve daha sonra kontrolöre beslenir, Şimdi bu frekans, gecikmeler aralığı oluşturmak için presakalar ile daha da bölünebilir. zamanlayıcı sayısını bir arttırmak için zaman (zamanlayıcı tick) aşağıdaki gibi belirlenebilir.
tick = (Prescalar / (Fosc / 4)
tick = (Prescalar / (20Mhz / 4))
tick = (Prescalar * 4) / Fosc
Şimdi gerekli gecikme için zamanlayıcı değeri aşağıdaki gibi hesaplanabilir.
Gecikme = TimerCount * tick
Count = (Gecikme / tick)
RegValue = TimerMax- Count
RegValue = TimerMax- (Gecikme / tick) = TimerMax – (Gecikme / ((Prescalar * 4) /
Fosc )) ![]()
Aşağıdaki tabloda üç zamanlayıcının tümü için formül bulunmaktadır.
| İsim | Boyut | Gecikme hesaplama formülü |
|---|---|---|
| TIMER0 | 8 bit | |
| TIMER1 | 16 bit | |
| TIMER2 | 8 bit |
TIMER0 – Zamanlayıcı 0
TMRO modülü, aşağıdaki özelliklere sahip 8 bitlik bir zamanlayıcı / sayaçtır:
- 8 bit zamanlayıcı / sayıcı
- Okunabilir ve yazılabilir
- 8 bit yazılım programlanabilir ön ölçekleyici
- Dahili veya harici saat seçimi
- FFh’den 00h’ye taşma kesintisi
- Harici saat için sınır seçimi
TIMER0 Kayıtları
Aşağıdaki tabloda PIC18F4520 TIMER0 modülü ile ilişkili kayıtlar gösterilmektedir.
| Kayıt | Açıklama |
|---|---|
| OPTION_REG | Bu kayıtlar TIMER0 Prescalar, Clock Source vb. |
| TMR0 | Bu kayıt, prescalar yapılandırmaya bağlı olarak artırılacak zamanlayıcı sayım değerini tutar |
| INTCON | Bu kayıt Timer0 taşma bayrağını (TMR0IF) ve karşılık gelen Inetrrupt Enable bayrağını (TMR0IE) içerir. |
| OPTION_REG | |||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| RBPU | INTEDG | T0CS | T0SE | PSA | PS2 | PS1 | PS0 |
RBPU: Zamanlayıcılar için NA
INTEDG: Zamanlayıcılar için NA
T0CS: TMR0 Saat Kaynağı Bit1’i seçin –
T0CKI pininde geçiş 0-Dahili talimat döngü saati (CLKO)
T0SE: TMR0 Kaynak Kenarı T0CKI pininde yüksek-düşük geçişte bit 1-Artışı seçin 0- T0CKI pininde düşük-yüksek geçişte artış
PSA: Ön ölçekleyici Atama biti PS2: PS0: Ölçekleyici Oranı Seçim bitleri

Timer0 modülü ile Watchdog Zamanlayıcısı arasında karşılıklı olarak paylaşılan sadece bir ön ölçekleyici mevcuttur. Timer0 modülü için bir ön ölçekleyici ataması, Watchdog Timer için ön ölçekleyici olmadığı anlamına gelir veya bunun tersi de geçerlidir. Bu ön derecelendirici erişilebilir değil ama kullanılarak yapılandırılabilir.
PS2: PS0 bit OPTION_REG .
| INTCON | |||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| GIE | TURTA | TMR0IE | INTE | RBIE | TMR0IF | INTF | RBIF |
GIE: Global Interrupt Bit 1’i etkinleştir -Maskelenmemiş tüm kesmeleri etkinleştirir 0-Tüm kesmeleri devre dışı bırakır
PIE: Çevresel Kesinti Bit 1’i etkinleştir -Maskelenmemiş tüm çevresel kesintileri etkinleştirir 0-Tüm çevresel kesintileri devre dışı bırakır
TMR0IE: TMR0 Taşma Kesmesi Etkin bit 1-TMR0 kesmesini etkinleştirir 0-TMR0 kesmesini devre dışı bırakır
INTE: Zamanlayıcılar için NA
RBIE: Zamanlayıcılar için NA
TMR0IF: TMR0 Taşma Kesme Bayrak biti 1-TMR0 kaydı taştı (yazılımda temizlenmelidir) 0-TMR0 kaydı taşmadı
INTF: Zamanlayıcılar için NA
RBIF: Zamanlayıcılar için NA

Prescalar ile 1ms, 20Mhz için Gecikme Hesaplamaları: 32: ![]()
PIC18F4520 Timer Kullanımı Program Kodu
- Gereken gecikme için Zamanlayıcı Sayısını hesaplayın.
- Prescalar kullanmak için PSA bitini temizleyin.
- Presaclar bitlerini gecikme hesaplamalarına göre OPTION_REG olarak ayarlayın .
- TOCS bitini kullanarak Dahili / Harici Saat Kaynağını seçin .
- Zamanlayıcı değerini TMRO kaydına yükleyin .
- TMR0IE bitini ayarlayarak Timer0 Interrupt’ı etkinleştirin
- GIE ve PIE bitlerini ayarlayarak Global ve Çevresel kesintileri etkinleştirin
Aşağıda LED’leri 1 ms gecikmeyle yanıp sönecek örnek kod verilmiştir.

TIMER1 – Zamanlayıcı 1
Zamanlayıcı TMR1 modülü, aşağıdaki özelliklere sahip 16 bit zamanlayıcı / sayaçtır:
- İki 8-Bit yazmaçlı 16 bit zamanlayıcı / sayıcı TMR1H / TMR1L
- Okunabilir ve yazılabilir
- 1: 8’e kadar programlanabilir ön ölçekleme
- Dahili veya harici saat seçimi
- FFFFh’den 00h’ye taşma kesintisi
- Harici saat için sınır seçimi
TIMER1 Kayıtları
Aşağıdaki tabloda PIC18F4520 Timer1 modülü ile ilişkili kayıtlar gösterilmektedir.
| Kayıt | Açıklama |
|---|---|
| T1CON: | Bu kayıtlar, TIMER1 Prescalar, Saat Kaynağı vb. |
| TMRIH | Bu yazmaç, zamanlayıcı değerinin en yüksek 8 bitini tutar. TMR1H ve TMR1L, 0000 – FFFFh değerinden artırmaya eşleştirmek için çift olarak kullanılır |
| TMRIL | Bu yazmaç, zamanlayıcı değerinin en düşük 8 bitini tutar. TMR1H ve TMR1L, 0000 – FFFFh değerinden artırmaya eşleştirmek için çift olarak kullanılır |
| PIR1 | Bu kayıt Timer1 taşma bayrağını (TMR1IF) içerir. |
| PIE1 | Bu kayıt Timer1 Interrupt Enable bayrağını (TMR1IE) içerir. |
| T1CON | |||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| – | – | T1CKPS1 | T1CKPS0 | T1OSCEN | T1SYNC | TMR1CS | TMR1ON |
T1CKPS1: T1CKPS0: TIMER1
Giriş Saati
Prescale
Seçim bitleri
11 = 1: 8 ön ölçek değeri
10 = 1: 4 ön ölçek değeri
01 = 1: 2 ön ölçek değeri
00 = 1: 1 ön ölçek değeri
T1OSCEN: TIMER1
Osilatör Etkin Kontrol biti
1-Osilatör etkin
0-Osilatör kapalı
T1SYNC: TIMER1
Harici Saat Girişi Senkronizasyon Kontrol biti
1-Harici saat girişini senkronize etme
0-Harici saat girişini senkronize etme
TMR1CS: TIMER1
Saat Kaynağı Bit 1-Harici saati seç RC0 / T1OSO / T1CKI (yükselen kenarda) 0-Dahili saat (FOSC / 4)
TMR1ON:
TIMER1
On bit1-
Timer1’i etkinleştirir 0-Timer1’i durdurur

Prescalar ile 100ms @ 20Mhz için Gecikme Hesaplamaları 8:
![]()
Program Kodu
TIMER1’i gecikme üretimi için yapılandırma ve kullanma adımları aşağıdadır:
- Gereken gecikme için Zamanlayıcı Sayısını hesaplayın.
- İçinde Presaclar bitlerini ayarlayın T1CON gecikme hesaplamaları göre.
- TMR1CS bitini kullanarak Dahili / Harici Saat Kaynağını seçin .
- Zamanlayıcı değerini TMR1H, TMR1L kaydına yükleyin .
- TMRIE bitini ayarlayarak Timer1 Interrupt’ı etkinleştirin
- GIE ve PIE bitlerini ayarlayarak Global ve Çevresel kesintileri etkinleştirin
- Son olarak zamanlayıcıyı TMR1ON biti ayarlayarak başlatın
Aşağıda LED’leri 1 ms gecikmeyle yanıp sönecek örnek kod verilmiştir.

TIMER2 – Zamanlayıcı 2
TIMER2 modülü, aşağıdaki özelliklere sahip 8 bitlik bir zamanlayıcı / sayaçtır:
- 8 bit zamanlayıcı / sayıcı
- Okunabilir ve yazılabilir
- Yazılım programlanabilir ön ölçekleyici / 1:16’ya kadar PostScaler
- FFh’den 00h’ye taşma kesintisi
TIMER2 Kayıtları
Aşağıdaki tabloda PIC16f877A Timer0 modülüyle ilişkili kayıtlar gösterilmektedir.
| Register | Açıklama |
|---|---|
| T2CON | Bu kayıtlar TIMER2 Prescalar, Saat Kaynağı vb. |
| TMR2 | Bu kayıt, prescalar yapılandırmaya bağlı olarak artırılacak zamanlayıcı sayım değerini tutar |
| PIR1 | Bu kayıt Timer2 taşma bayrağını (TMR2IF) içerir. |
| PIE1 | Bu kayıt Timer2 Kesme Etkinleştirme işaretini (TMR2IE) içerir. |
| T2CON | |||||||
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| – | TOUTPS3 | TOUTPS2 | TOUTPS1 | TOUTPS0 | TMR2ON | T2CKPS1 | T2CKPS0 |
TOUTPS3: TOUTPS0:
Timer2 Çıkışı Son Ölçek Seçme bitleri
0000 = 1: 1 postscale
0001 = 1: 2 postscale
0010 = 1: 3 postscale
•
•
•
1111 = 1:16 postscale
TMR2ON:
Zamanlayıcı2 Açık bit
1-Zamanlayıcı2 açık
0-Zamanlayıcı2 kapalı
T2CKPS1: T2CKPS0:
Timer2 Clock Prescale Seçim bitleri
00 = Ön ölçekleyici 1
01 = Ön ölçekleyici 4
1x = Ön ölçekleyici 16

Timer2 kullanarak 1sn gecikme oluşturma: Timer2
8-bit olduğundan ve 1:16 prescalar’ı desteklediğinden, 1sn gecikmeyi doğrudan oluşturmak mümkün değildir. 1:16 ön ölçekleyici ile maksimum gecikme:![]()
Şimdi 500us, 1 saniyelik bir gecikme elde etmek için sayacı 2000 kez artırmak için kullanılacak zamanlayıcılar kullanılarak oluşturulabilir.
Prescalar ile 500usec @ 20Mhz için Gecikme Hesaplamaları 16: ![]()
Program Kodu
Gecikme üretimi için Timer2’yi yapılandırma ve kullanma adımları aşağıdadır:
- Gereken gecikme için Zamanlayıcı Sayısını hesaplayın.
- Gecikme hesaplamalarına göre T2CON’daki Ön ölçekleyici bitlerini ayarlayın .
- Zamanlayıcı değerini TMR2 kaydına yükleyin.
- TMR2IE bitini ayarlayarak Timer2 Interrupt’ı etkinleştirin.
- GIE ve PIE bitlerini ayarlayarak Global ve Çevresel kesintileri etkinleştirin.
- Son olarak TMR2ON bitini ayarlayarak Timer2’yi başlatın.
Aşağıda LED’leri 1 sn gecikmeyle yanıp sönecek örnek kod verilmiştir.

PIC18F veri sayfasına buradan ulaşabilirsiniz.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.
