9. Hafta - MikroC derleyicisi ve Uygulamalar

Download Report

Transcript 9. Hafta - MikroC derleyicisi ve Uygulamalar

MikroC ile PIC
Programlama
9.Hafta
Mikrodenetleyiciler
1
16F877 CCP Modülü
16f877 içerisinde 2 adet CCP donanım modülü bulunmaktadır. Bunlar CCP1 ve
CCP2 olarak adlandırılmaktadır.
CCP modülü sayesinde donanımsal olarak yakalama (capture), karşılaştırma
(compare) ve PWM sinyali üretme işlemleri yapılabilir. CCP modülünün çalışma
modları için ihtiyaç duyulan zamanlama/sayma referansı 16f877 içerisinde bulunan
Timer/Counter birimleri tarafından karşılanır.
Bu amaçla, Capture ve Compare için Timer1 zamanlayıcısı, PWM modu için Timer2
zamanlayıcısı kullanılmaktadır.
Mikrodenetleyiciler
2
CCP1 Modülü
CCP modülü, düşük kısmı 8 bit olan CCPR1L ,yüksek kısmı 8 bit olan CCPR1H olan ve
CCPR1 olarak adlandırılan bir kaydediciden oluşmaktadır (2 adet 8-bit yazmaç).
CCP1 modülünün işlemleri ise CCP1CON kaydedicisi tarafından kontrol edilmektedir. Bu
modüldeki kaydedicilerin tümü yazılabilir ve okunabilir özelliktedirler.
PIC 16F877’nin CCP modülleri olan CCP1 ve CCP2’nin çalışmaları özel tetikleyicileri
dışında hemen hemen aynıdır.
CCP Timer İlişkisi
CAPTURE (Yakalama) Modu
Capture modunda; RC2/CCP1 pinindeki bir takım olaylarla (RC2/CCP1 pini üzerinde bir
olay oluştuğunda) TMR1’in 16 bitlik değerini yakalanır ve CCPR1H:CCPR1L e kaydedilir.
RC2/CCP1’deki olaylar şu şekilde tanımlanmaktadır:
•
•
•
•
Her düşen kenar
Her yükselen kenar
Her 4. yükselen kenar
Her 16. yükselen kenar
RC2/CCP1’deki bu durumlardan birisi CCPxM0:CCPxM3 bitleri sayesinde seçilir. Bir
yakalama işlemi gerçekleştiğinde CCP1IF (PIR1,2) kesme bayrağı set olur ve bir kesme
talebinde bulunulur. Eğer yeni bir yakalama gerçekleşirse CCP1R kaydedicisine yeni
değer kaydedilir ve eski değer tamamıyla silinir.
CCP1CON – CCP2CON Kaydedicisi
CCP modüllerinin yaptığı işlemleri denetler ve yetkilendirmeleri yapar.
CCPxCON,0:3(CCPxM0:CCPxM3): CCP birimleri için mod seçim bitleridir. Bu bitlerin
aldığı değerlere göre CCP1 modülü capture/compare/PWM modlarında çalıştırılabilir.
0000 = Capture/Compare/PWM etkin değil (CPM kullanım dışı )
0100 = Capture modu, her düşen kenarda
0101 = Capture modu, her yükselen kenarda
0110 = Capture modu,her 4. yükselen kenarda
0111 = Capture modu, every 16. yükselen kenarda
1000 = Compare modu, denklik durumunda çıkışı 1’le(H) (CCPxIF=1)
1001 = Compare modu, denklik durumunda çıkışı 0’la (L) (CCPxIF=1)
1010 = Compare modu, denklik durumnda yazılım kesmesi üret
1011 = Compare modu, özel tetikleme (CCPxIF=1, CCP1 TMR1’i resetler, CCP2 TMR1’i resetler ve
A/D çevirme başlar.(Eğer A/D çevirme modülü yetkilendirilmişse).)
11xx = PWM modu
CCP1CON,4:5(CCPxX:CCPxY): CCP modülün PWM modundaki Lsb ayarlarını
gerçekleştiren bitlerdir.
CCP1CON – CCP2CON Kaydedicisi
CCP modüllerinin yaptığı işlemleri denetler ve yetkilendirmeleri yapar.
CCP’de prescaler ayarlarını gerçekleştirmek üzere;
CCP1M3:CCP1M0 bitleri ayrılmıştır. CCP modülü kullanım dışı ise veya CCP modülü
capture modunda kullanılmıyorsa prescaler sayıcısı temizlenmiş vaziyette durur. Bu
herhangi bir resetleme durumunda prescalerin temizleneceği anlamına gelir. Capture
prescaler’i diğer bir kesmenin üretilmesi durumunda değişim gösterir. Örnekde CCP
prescalerin kurulmasına dair bir örnek verilmiştir. Bu örnek programda prescaler sayıcı
temizlenmiştir ve hata kesmelerinin üretilmesi engellenmiştir.
0100 = Capture modu, her düşen kenarda
0101 = Capture modu, her yükselen kenarda
0110 = Capture modu,her 4. yükselen kenarda
0111 = Capture modu, every 16. yükselen kenarda
Capture Modunda Pin Durumu
Capture modunda RC2/CCP1 pini TRISC<2> vasıtasıyla giriş olarak ayarlanmalıdır. Bu
sayede RC2/CCP1 pini capture işlemi için gerekli saat palsini alabilecektir.
Şekilde capture modunda veri yakalama işleminin nasıl gerçekleştiğini gösteren
diyagram bulunmaktadır.
 Capture birimini kullanmak için;
 Timer1
 CCP
birimlerinin ayarları yapılır.
 Kesmeden yararlanılacaksa CCPxIE ve
CCPxIF birimleri set edilir veya temizlenir.
 Olay yakalama yaparak ne kadar süre
geçtiyse, geçen süreyi Timer1
zamanlayıcısından alarak CCP biriminin özel
kaydedicilerine yükler. Daha sonra CCP
birimine kaydedilen zamanlar okunarak
gerekli işlemler yapılır.
 Encoder ile hız hesaplaması, frekans
hesaplaması, .. vs uygulamalarda
kullanılabilir.
MikroC ile Capture örneği
Örnek: RC2 pinine bağlı butona 4 kez basıldığında Timer değeri yakalanır. PortB içeriği
bir arttırılır.
void interrupt()
{
if (CCP1IF) portb++;
CCP1IF_bit = 0;
// CCP1 yakalama oluştu, portb içeriğini 1 artır
// TMR1'in içeriği otomatik olarak CCPR1 içeriğine aktarılır.
// CCP1IF bayrağı temizlendi
}
void main() {
ADCON1 = 0x07;
CMCON = 0;
TRISB = 0x00;
PORTB = 0x00;
TMR1L = 0x00;
TMR1H = 0x00;
T1CON = 0x33;
TRIS.RC2 = 1;
CCPR1L = 0x00;
CCPR1H = 0x00;
CCP1CON = 0x06;
CCP1IE_bit = 1;
INTCON = 0xC0;
while(1) { }
}
// AN pinleri dijital I/O yapılandırıldı
// Comparators (karşılaştırıcılar) pasif edildi
// PORTB çıkış yapıldı
// PORTB temizlendi
// TMR1L ve TMR1H kaydedici çifti sıfırlandı
// TMR1 1:8 prescaler ve T13CKI girişinden gelen
// her 8. yükselen darbe kenarında 1 artmaya ayarlandı
// RC2 pini giriş yapıldı
// CCPR1L ve CCPR1H kaydedici içeriği temizlendi
// CCP1 donanımı sinyalin her yükselen 4. kenarını
// yakalar. CCP1 donanımı aktif edildi.
// GIE, PEIE bitleri set edildi
// Sonsuz döngü.
COMPARE (Karşılaştırma) Modu
COMPARE (Karşılaştırma) Modu
 Öncelikle Timer1 ve Compare modu
ayarları yapılır.
 CCPRxH ve CCPRxL kaydedicilerine
yakalanmak istenen sayı yüklenir,
(Örneğin 20 kez tuşa basılması.)
 Timer1 harici kaynak beslemesi
kullanılır. Timer1 dış osilatör girişine
bağlanan butonla TMR1 kaydedicisinin
değeri artar.
Örnek uygulama devresi
 TMR1 kaydedicisi ile CCPRx
kaydedicisi birbirine eşit olduğunda
kesme bayrağı set edilir. (Tuşa 20 kez
basıldığında C2 pini set edilir)
MikroC ile Compare örneği
Örnek: CCPR1 değeri 3, timer1 8 darbede artım için Compare örneği, 3*8=24 darbede
sayan program
void interrupt()
{
if (CCP1IF) portb.rb7 = 1;
CCP1IF_bit = 0;
// CCP1IF bayrağı temizlendi
}
void main() {
ADCON1 = 0x07;
CMCON = 0;
TRISB = 0x00;
PORTB = 0x00;
TRISC.RC0 = 1;
TMR1L = 0x00;
TMR1H = 0x00;
T1CON = 0x33;
// AN pinleri dijital I/O yapılandırıldı
// Comparators (karşılaştırıcılar) pasif edildi
// PORTB çıkış yapıldı
// PORTB temizlendi
// RC0/T13CKI pini giriş yapıldı.
// TMR1L ve TMR1H kaydedici çifti sıfırlandı
// TMR1 1:8 prescaler ve PORTC0/T13CKI girişinden gelen
// her 8. yükselen darbe kenarında 1 artmaya ayarlandı
CCPR1L = 0x03;
// TMR1 ile CCPR karşılaştırması için CCPR1L = 0x03
CCPR1H = 0x00;
// değeri yüklendi.
CCP1CON = 0x0B; // CCP1 donanımı Compare modu, özel tetikleme modu
CCP1IE_bit = 1;
// CCP1 donanımı aktif edildi.
INTCON = 0xC0;
// GIE, PEIE bitleri set edildi
while(1);
}
// Sonsuz döngü.
PWM (Pulse Width Modulation)
Darbe Genişlik Modülasyonu
PWM, Darbe Genişlik Modülasyonu), üretilecek olan darbelerin, genişliklerini kontrol
ederek, çıkışta üretilmek istenen analog elektriksel değerin veya sinyalin elde edilmesi
tekniğidir.
PWM elektrik ve elektronikte birçok alanda, farklı amaçlar için kullanılmaktadır.
Telekomünikasyon, güç elektroniği, motor sürücüler, voltaj düzenleyiciler, ses üreteçleri
veya yükselteçler gibi çeşitli uygulama alanları ve farklı uygulamaları bulunmaktadır.
 Analog olarak testere dişi sinyalin, DC
yada AC kontrol voltajı ile
karşılaştırılması ile elde edilir.
PWM (Pulse Width Modulation)
Üretilen kare dalga darbe sinyallerinin genişliklerinin ortalaması, çıkışta üretilecek olan analog değerin
elde edilmesini sağlar.
Ymin = 0 olduğunda ortalama gerilim Yort= D . Ymax olmaktadır.
D: Duty (İş yapma periyodu)
T: PWM periyodu
PWM
 CCP biriminin PWM modu, istenen
CCPx ucundan istenen görev
çevrimine (duty cycle - doluluk oranı)
sahip PWM sinyali elde etmek için
kullanılır. PWM birimi Timer2
zamanlayıcısını kullanır.
 PIC16f877'de iki adet CCP modülü
olduğundan 2 adet de 10 bit PWM
çıkış ucu vardır.
 PWM modunda, PWM çıkışı olarak
kullanılan RC1/T1OSI/CCP2 ve
RC2/CCP1 pin'leri çıkış olarak
yönlendirilmelidir.
 Duty periyodunu için üst 8bit CCPRxL
de, alt 2 bit CCPxX, CCPxY tir. (x=1,2).
Bu bitlerin CCPxCON<5:4>
kaydedicisindeki isimleri DCxB0,
DCxB1 dir.
PWM
PWM
PWM sinyali aşağıdaki adımlarda oluşur;
- TMR2, PR2’ye eşit olduğunda TMR2
temizlenir,
- CCPx pini set edilir (Duty cycle=%0 ise
set edilmez),
- CCPRxL’den CCPRxH’a yükleme
gerçekleşir.
- Duty cycle, PWM periyodundan büyük
olamaz.
PWM başlatılması
1. PWM periyodu PR2 kaydedicisine yazılarak ayarlanır.
2. PWM duty periyodu CCPR1L and CCP1CON<5:4> kaydedici ve
bitlerine yazılarak kurulur.
3. CCP1 modülü için TRISC<2> biti çıkış olarak alınır.
4. Set the TMR2 prescale değeri ayarlanır ve Timer2, T2CON kullanılarak
etkinleştirilir (enable biti ile)
5. CCP1 modulü PWM operasyonu için CCP1CON ile ayarlanır.
Mikrodenetleyiciler
19
MikroC ile PWM örneği
Örnek: RC2 pinine PWM1 modülü üzerinde 8 Mhz osc, Fpwm= 2 kHz için uygulama.
void main() {
ADCON1 = 0x07;
CMCON = 0;
TRISC.RC2=0;
// PWM1 modulu çıkışı
T2CKPS1_bit=0;
// 0b01 icin TMR2 prescaler 4
T2CKPS0_bit=1;
PR2=0xFF;
CCPR1L=0x01;
// PWM için Yüksek 8 bit
CCP1CON.CCP1X= 0; CCP1CON.CCP1Y= 0; // PWM için Düşük 2 bit
TMR2ON_bit=1;
CCP1CON=0b00001100;
// 0bxxxx11xx icin PWM modu
while(1){
CCPR1L=0x3F;
// Yüzde 25 Duty
Delay_Ms(500);
CCPR1L=0x7F;
// Yüzde 50 Duty
Delay_Ms(500);
CCPR1L=0xC0;
// Yüzde 75 Duty
Delay_Ms(500);
CCPR1L=0xFE;
// yaklaşık Yüzde 95 Duty
Delay_Ms(500);
}
// Sonsuz döngü.
}
MikroC PWM kütüphanesi
MikroC PWM rutinleri
 PWM1_Init
 PWM1_Set_Duty
 PWM1_Start
 PWM1_Stop
PWM1_Init :
PWM1 modülünü içerisine yazılan PWM frekansı olacak şekilde tüm gerekli
kaydedicileri ile birlikte ayarlar. Frekans değeri long tipi ve Hertz cinsindendir.
void PWM1_Init(const long freq);
Örnek: 5 kHz için PWM modülü ayarlanması , PWM1_Init(5000);
PWM1_Set_Duty :
Duty periyonun yüzdesini değiştirilip belirlenmesini sağlar. %0 için 0, %50 için
127 ve %100 duty için 255 olacak şekilde 0-255 arası short tipi değer girilir.
Örnek: %75 duty nin ayarlanması,
PWM1_Set_Duty(192);
PWM1_Start : PWM modülünü başlatır.
PWM1_Start();
PWM1_Stop : PWM modülünü durdurulur. PWM1_Stop();
Mikrodenetleyiciler
21
MikroC ile PWM örneği
Örnek: RC2 pinine PWM1 modülü üzerinde 8 Mhz osc, Fpwm= 2 kHz için uygulama.
Kütüphanesiz
Kütüphane ile
void main() {
void main() {
ADCON1 = 0x07;
CMCON = 0;
TRISC.RC2=0;
// PWM1 modulu çıkışı
T2CKPS1_bit=0;
// 0b01 icin TMR2 prescaler 4
T2CKPS0_bit=1;
PR2=0xFF;
CCPR1L=0x01;
// PWM için Yüksek 8 bit
CCP1CON.CCP1X= 0;
CCP1CON.CCP1Y= 0; // PWM için Düşük 2 bit
TMR2ON_bit=1;
CCP1CON=0b00001100;
// 0bxxxx11xx icin PWM modu
while(1){
CCPR1L=0x3F;
Delay_Ms(500);
CCPR1L=0x7F;
Delay_Ms(500);
CCPR1L=0xC0;
Delay_Ms(500);
CCPR1L=0xFE;
Delay_Ms(500); }
}
ADCON1 = 0x07;
CMCON = 0;
TRISC.RC2=0;
// PWM1 modulu çıkışı
PWM1_Init(2000); // 2kHz PWM frekansı
PWM1_Set_Duty(192);
PWM1_Start();
while(1){
PWM1_Set_Duty(63); // Yüzde 25 Duty
Delay_Ms(500);
PWM1_Set_Duty(127); // Yüzde 50 Duty
Delay_Ms(500);
PWM1_Set_Duty(192); // Yüzde 75 Duty
Delay_Ms(500);
PWM1_Set_Duty(250); // yaklaşık Yüzde 95 Duty
Delay_Ms(500); }
// Sonsuz döngü.
// Yüzde 25 Duty
// Yüzde 50 Duty
// Yüzde 75 Duty
// yaklaşık Yüzde 95 Duty
// Sonsuz döngü.
}
Analog Comparator (Karşılaştırıcı)
16f877A içerisinde 2 adet ANALOG KARŞILAŞTIRMA donanım modülü
bulunmaktadır.
Modüller 8 farklı modda çalışabilmektedir…
RA0 – RA3 pinleri modül1
RA1 – RA2 pinleri modül2
Mikrodenetleyiciler
23
Analog Comparator (Karşılaştırıcı)
 Karşılaştırma yapabilmek için RA0 – RA3 pinleri analog giriş olarak
ayarlanmalıdır.
 Karşılaştırıcı modül çıkışı olarak ise RA4 ve RA5 pinleri kullanılabilir.
 RA4 pini açık kollektör yapı içerdiğinden dolayı çıkış olarak kullanabilmek
için pull-up direnci bağlanmalıdır.
 CMCON kaydedicisi kullanılarak modül ayarları yapılır.
Mikrodenetleyiciler
24
Analog Comparator (Karşılaştırıcı)
CMCON : Karşılaştırıcı kontrol ve ayar kaydedicisi
CVRCON : Karşılaştırıcı gerilim referans kontrol ve ayar kaydedicisi
INTCON : Kesme kontrol ve ayar kaydedicisi
PIR2 : Kesme bildirim kaydedicisi
PIE2 : Kesme ayar kaydedicisi
PORTA : Giriş ve çıkış pin kaydedicileri
TRISA : pin yönlendirme kaydedicileri
Mikrodenetleyiciler
25
Analog Comparator (Karşılaştırıcı)
Mikrodenetleyiciler
26
Analog Comparator (Karşılaştırıcı)
Mikrodenetleyiciler
27
Analog Comparator (Karşılaştırıcı)
Mikrodenetleyiciler
28
Karşılaştırıcı Gerilim Referans Modülü
Mikrodenetleyiciler
29
MikroC ile Komparatör örneği
void main() {
TRISA = 0x0f;
PORTA = 0;
// RA3:RA0 giriş, diğerleri çıkış
// PORTA sıfırlandı
CMCON = 3;
// İki bağımsız karşılaştırıcı, çıkış PIC çıkışları
TRISB.RB0=0;
// PORTB0 çıkış
while(1){
PORTB.RB0=C2OUT_bit; // karşılaştırıcı çıkışı B0'a da yazılıyor.
}
}