PIC18F4520 Timer/ Zamanlayıcı Modülleri
Bu yazımızda PIC18F4520’nin zamanlayıcı modülü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.
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 )) $ RegValue = TimerMax – (( Gecikme * Fosc) / (Prescalar * 4)) $
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 | $ RegValue = 256 – ((Gecikme * Fosc) / (Prescalar * 4)) $ |
TIMER1 | 16 bit | $ RegValue = 65536 – ((Gecikme * Fosc) / (Prescalar * 4)) $ |
TIMER2 | 8 bit | $ RegValue = 256 – ((Gecikme * Fosc) / (Prescalar * 4)) $ |
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ğı Bit
1’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: $$ RegValue = 256- (Gecikme * Fosc) / (Prescalar * 4)) = 256 – ((1ms * 20Mhz) / (32 * 4)) = 256-156 = 100 $$
Program Kodu
- Gereken gecikme için Zamanlayıcı Sayısını hesaplayın.
- Presaclar bitlerini gecikme hesaplamalarına göre OPTION_REG olarak ayarlayın .
- Prescalar kullanmak için PSA bitini temizleyin.
- 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.
#include<pic16f877a.h> char value = 0; #define SBIT_PS2 2 void interrupt timer_isr() { if(TMR0IF==1) { value=~value; // complement the value for blinking the LEDs TMR0 = 101; /*Load the timer Value, (Note: Timervalue is 101 instaed of 100 as the TImer0 needs two instruction Cycles to start incrementing TMR0 */ TMR0IF=0; // Clear timer interrupt flag } } void main() { TRISD=0x00; //COnfigure PORTD as output to blink the LEDs OPTION_REG = (1<<SBIT_PS2); // Timer0 with external freq and 32 as prescalar TMR0=100; // Load the time value for 1ms delay TMR0IE=1; //Enable timer interrupt bit in PIE1 register GIE=1; //Enable Global Interrupt PEIE=1; //Enable the Peripheral Interrupt while(1) { PORTD = value; } }
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 bit
1- Timer1’i etkinleştirir
0-Timer1’i durdurur
Prescalar ile 100ms @ 20Mhz için Gecikme Hesaplamaları 8: $$ RegValue = 65536- (Gecikme * Fosc) / (Prescalar * 4)) = 65536 – ((100ms * 20Mhz) / (8 * 4)) = 3036 = 0xBDC $ $
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.
#include<pic16f877a.h> char value = 0; #define SBIT_PS1 5 #define SBIT_PS0 4 void interrupt timer_isr() { if(TMR1IF==1) { value=~value; // complement the value for blinking the LEDs TMR1H=0x0B; // Load the time value(0xBDC) for 100ms delay TMR1L=0xDC; TMR1IF=0; // Clear timer interrupt flag } } void main() { TRISD=0x00; //COnfigure PORTD as output to blink the LEDs T1CON = (1<<SBIT_PS1) | (1<<SBIT_PS0); // Timer0 with external freq and 8 as prescalar TMR1H=0x0B; // Load the time value(0xBDC) for 100ms delay TMR1L=0xDC; TMR1IE=1; //Enable timer interrupt bit in PIE1 register GIE=1; //Enable Global Interrupt PEIE=1; //Enable the Peripheral Interrupt TMR1ON = 1; //Start Timer1 while(1) { PORTD = value; } }
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:
$$ Gecikme = 256 * (Ön ölçek * 4) / Fosc = 256 * 16 * 4 / 20Mhz = 819us $$
Ş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: $$ RegValue = 256- (Gecikme * Fosc) / (Prescalar * 4)) = 256 – ((500us * 20Mhz) / (16 * 4)) = 256-156 = 100 $$
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.
#include<pic16f877a.h> #define SBIT_T2CKPS1 1 char value = 0; int count = 0; void interrupt timer_isr() { if(TMR2IF==1) { TMR2 = 101; /*Load the timer Value, (Note: Timervalue is 101 instead of 100 as the Timer2 needs two instruction Cycles to start incrementing TMR2 */ TMR2IF=0; // Clear timer interrupt flag if(count>=2000) //500us * 2000=1000000us=1sec { count=0; value=~value; // complement the value for blinking the LEDs } else { count++; // Keep incrementing the count till it reaches 2000 to generate 1sec delay } } } void main() { TRISD=0x00; //COnfigure PORTD as output to blink the LEDs T2CON = (1<<SBIT_T2CKPS1); // Timer2 with external freq and 16 as prescalar TMR2=100; // Load the timer value for 500us delay TMR2IE=1; //Enable timer interrupt bit in PIE1 register GIE=1; //Enable Global Interrupt PEIE=1; //Enable the Peripheral Interrupt TMR2ON = 1; while(1) { PORTD = value; } }
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.