8. Hafta - MikroC derleyicisi ve Uygulamalar

Download Report

Transcript 8. Hafta - MikroC derleyicisi ve Uygulamalar

MikroC ile PIC
Programlama
8.Hafta
Mikrodenetleyiciler
1
MikroC bit ve sbit değişken tipleri
MikroC ile bit yada sbit değişken tipleri ile bir bitlik değişkenler kullanılabilir. sbit değişken tipi PIC’in
özel fonksiyonlarının (SFR) bitlerini kullanılmasını sağlar.
Örnek1:
sbit Abit at PORTB.B0; // PortB0, Abit şeklinde 1 bitlik değişken olarak adlandirilmistir
...
void main()
{
... }
Örnek2:
char MyVar;
sbit AnotherBit at MyVar.B0;
...
void main()
{
... }
// Myvar isimli char tipi degisken olusturulur
// degiskenin bit0 i AnotherBit olarak tanimlandi.
MikroC ile bit değişken tipi ile bir bitlik değişkenler kullanılabilir.
bit bf;
bit *ptr;
bit arr [5];
Mikrodenetleyiciler
// bf bit tipi değişken atanır, hafizada belirli bir adresi yoktur.
// bu nedenle pointer atamasida yapilamaz:
// bit tipi dizi atmasi yapilamaz.
2
MikroC LCD kütüphanesi kullanımı
MikroC nin HD44780 uyumlu LCD ler için kütüphanesi
4bit data hattı üzerinden iletişimi desteklemektedir.
// Lcd pinlerin ayarlanmasi
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
// Port yonlendirme
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
Yukarıdaki pin atamaları ve yönlendirme kaydedicileri
atamalarından sonra LCD kullanıma hazır hale gelmektedir.
Diğer derleyicilerden farklı olarak MikroC de kütüphane
programları #include komutu kullanılmaksızın pin
tanımlamaları ile aktif hale gelir.
Mikrodenetleyiciler
3
MikroC LCD kütüphanesi kullanımı
LCD kütüphanesi içerisindeki fonksiyonlar:
Lcd_Init
: Lcd modulünü etkin hale getirir (başlatır). Program ilk çalıştırıldığında bir
kez kullanımı yeterlidir.
Kullanımı : Lcd_Init();
Lcd_Out
: İstenen satırın, istenilen kolonundan başlayarak, girilen metni yazar.
Kullanımı : Lcd_Out(1, 3, "Merhaba"); // 1.satır 3. kolondan itibaren «Merhaba» yazar
Lcd_Out(2, 4, msg1);
// 2. satır, 4. kolondan itibaren msg1, char tipi
degiskenin icerigini yazar
Lcd_Out_Cp
: Aktif kursörden itibaren metni yada char tipi değişken içeriği yazılır.
Kullanımı : Lcd_Out_Cp("Merhaba"); // O anki kursörden itibaren «Merhaba» yazar
Lcd_Out_Cp (msg1);
// O anki kursörden itibaren msg1, char tipi
degiskenin icerigini yazar
Lcd_Chr
: İstenen satırın, istenilen kolona, bir karakter yazar.
Kullanımı : Lcd_Out(1, 3, ‘i’);
// 1.satır 3. kolona «i» yazar.
Lcd_Chr_Cp
: Aktif kursöre bir karakter yazar.
Kullanımı : Lcd_Out(1, 3, ‘i’);
// O anki kursöre «i» yazar.
Mikrodenetleyiciler
4
MikroC LCD kütüphanesi kullanımı
LCD kütüphanesi içerisindeki fonksiyonlar:
: LCD ye bazı komutlar gönderir, bu komutların tanımladıkları iş icra edilir.
Lcd_Cmd
Komutlar:
_LCD_FIRST_ROW
_LCD_SECOND_ROW
_LCD_THIRD_ROW
_LCD_FOURTH_ROW
_LCD_CLEAR
_LCD_RETURN_HOME
_LCD_CURSOR_OFF
_LCD_UNDERLINE_ON
_LCD_BLINK_CURSOR_ON
_LCD_MOVE_CURSOR_LEFT
_LCD_MOVE_CURSOR_RIGHT
_LCD_TURN_ON
_LCD_TURN_OFF
_LCD_SHIFT_LEFT
_LCD_SHIFT_RIGHT
Kursörü 1. satıra taşı.
Kursörü 2. satıra taşı.
Kursörü 3. satıra taşı.
Kursörü 4. satıra taşı.
Ekranı temizle.
Kursörü başa taşı. (Yazılı bilgi etkilenmez)
Kursörü kapat.
Alt Çizgi biçimli kursör.
Yanıp Sönen biçimli kursör.
Kursör bir karakter sola.
Kursör bir karakter sağa.
Lcd displayi aç.
Lcd displayi kapat.
Display metnini sola kaydır.
Display metnini sağa kaydır.
Kullanımı : Lcd_Cmd(_LCD_CLEAR);
// Ekran temizlenir
Lcd_Cmd(_LCD_BLINK_CURSOR_ON); // Yanıp-Sönen kursör tanımlanır
Mikrodenetleyiciler
5
Örnek: LCD kullanimi
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
Lcd_Out(1,1,txt1);
Lcd_Out(2,5,txt2);
yaz Delay_ms(2000);
for(i=0; i<4; i++) {
// Metni 4 kez saga kaydir.
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
while(1) {
// Sonsuz dongu
for(i=0; i<8; i++) {
// 7 kez sola kaydir
Lcd_Cmd(_LCD_SHIFT_LEFT);
Move_Delay();
}
char txt1[] = "mikroElektronika";
char txt2[] = "EasyPIC4";
char txt3[] = "Lcd4bit";
char txt4[] = "ornek";
char i;
// Dongu degiskeni
void Move_Delay() {
//Text in hareketi icin fonksiyon
Delay_ms(500);
// Gecisler icin gecikme zamani
}
for(i=0; i<8; i++) {
// 7 kez saga kaydir
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
}
}
void main(){
ADCON1 = 7;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,6,txt3);
Lcd_Out(2,6,txt4);
yaz.
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
// İlk satira txt1 ü yaz.
// İkinci satira txt2
// A portu dijital I/O
// LCD baslat
// Ekrani sil
// Kursörü kapat
// İlk satira txt3 ü yaz.
// İkinci satira txt4
// 2 sn bekle
// Ekrani temizle
HD44780 LCD karakter tablosu
Örnek: LCD ile sayısal değerlerin ve özel karakterlerin ekrana yazdırılması
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
char txt1[] = "Direnc =";
char txt2[]="000";
unsigned short deger = 175;
char ohm[]="0";
void main(){
ADCON1 = 7;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,2,txt1);
txt2[0]= (deger/100) +48;
txt2[1]= (deger%100)/10 +48;
txt2[2]= (deger%10)+48;
ohm[0] = 0xf4;
Lcd_Out(1,10,txt2);
Lcd_Out(1,14,ohm);
}
// A portu dijital I/O
// LCD baslat
// Ekrani sil
// Kursörü kapat
// İlk satira txt3 ü yaz.
// Yuzler basamagi
// Onlar basamagi
// Birler basamagi
// deger degiskeni yazdirilir
// İlk satira ohm simgesi yaz
Analog – Dijital Çevirici Modülü
PIC 16 F877’de 8 kanallı 10 bit’e kadar çevirme işlemi yapabilen bir analog-dijital çevirici
(ADC) modülü bulunmaktadır.
PIC 16F877 üzerindeki ADC modülün çalışması şu şekildedir. Analog giriş örnekle ve tut
kondansatörünü şarj eder. Örnekle ve tut kondansatörünün çıkışı dönüştürücünün girişine
uygulanır. Dönüştürücü, ardışık yaklaştırma yoluyla bu analog düzeyin sayısal sonucunu üretir.
Bu A/D dönüşümde, analog giriş sinyali 10 bitlik sayı karşılaştırması ile sonuçlanır. ADC bir
özelliği de işlem yapmazken uyuma moduna geçer.
ADC Modül dört (4) kaydediciye sahiptir. Bunlar;
1- A/D Yüksek sonuç kaydedicisi (ADRESH)
2- A/D Düşük sonuç kaydedicisi (ADRESL)
3- A/D Kontrol kaydedici 0 (ADCON0)
4- A/D Kontrol kaydedici 1 (ADCON1)
Mikrodenetleyiciler
9
PIC 16F877‟de analog giriş için E Portunda 3 ve A Portunda 5 pin bulunmaktadır. Bu
uçlara bağlanacak olan sıcaklık, ışık, ses veya sensörler yardımıyla analog veri alınabilir.
Kendi iç devre saatini için ise RC osilatörünü kullanır. AD çevrim işlemleri için 4 adet
yazmaç kullanılır Bu yazmaçlardan ADRESH ve ADRESL, AD dönüşüm sonucunun üst
ve alt byte’larını tutulduğu kısımdır. Diğer yazmaçlar ise kontrol yazmaçlarıdır. ADCON0,
AD çevirme işlemlerinin kontrolün de, ADCON1 ise port pinlerinin konfigürasyonlarında
kullanılır.
ADCS1, ADCS0 - A/D Çevirici saat darbesi seçim biti.
ADCON0 Kaydedicisi
ADCS1, ADCS0 - A/D Çevirici saat darbesi seçim biti.
ADON: A/D çeviriciyi yetkilendirme bitidir.
ADON=1 ise A/D çevirici açıktır ve işlem yapılabilir durumdadır.
ADON=0 ise A/D çevirici kapalıdır.
GO/DONE: Eğer ADCON biti de 1 ise A/D çevirici statü biti görevini üstlenir.
GO/DONE=1 ise A/D çevirici işlem yapıyor demektir.
GO/DONE=0 ise A/D çevirici üzerinde herhangi bir işlem yapılmıyordur.
ADCON0 Kaydedicisi
CHS0:CHS2: A/D çevirici için kanal seçim bitlerini oluşturur. Bu bitlere verilecek değerlerle
A/D çevirme için hangi kanalın seçileceği belirlenir. Daha önceden de belirtildiği gibi PIC
16F877’de A/D çevirici için 8 kanal mevcuttur.
000 = kanal 0, (RA0/AN0)
001 = kanal 1, (RA1/AN1)
010 = kanal 2, (RA2/AN2)
011 = kanal 3, (RA3/AN3)
100 = kanal 4, (RA5/AN4)
101 = kanal 5, (RE0/AN5)
110 = kanal 6, (RE1/AN6)
111 = kanal 7, (RE2/AN7)
ADCON1 Kaydedicisi
PCFG0:PCFG3: A/D çevirici portunun biçimini düzenlemeyi sağlayan bitlerdir. Yani A/D
çevirme işleminde kullanılacak pinlerin nasıl davranacağını belirlememize olanak
sağlarlar.
ADFM: A/D çevirme işlemi esnasında meydana gelen verinin biçimini belirlemeye yarayan
bittir.
1 : ADRESH kaydedicisinin MSB kısmındaki 6 biti 0 kabul edilir ve A/D çevirme
sonucunda elde edilen veri ADRESH’ın 2 bitlik LSB kısmına ve ADRESL’ye yazılır.
0 : ADRESL’nin LSB kısmındaki 6 biti 0 kabul edilir ve A/D çevirme sonucu elde
edilen veri ADRESL’nin son iki bitine ve ADRESH’a yazılır.
ADCON1 Kaydedicisi
PCFG3:PCFG0 : PortA ve PortE için port yapılandırma bit konfigürasyonu
ADRESH:ADRESL
kaydedicileri A/D dönüşümün 10 bit sonucunu kapsar. A/D dönüşümü bittiği
zaman, sonuç A/D sonuç kaydedicisinin içine yüklenir. A/D modülü şekilde görülmektedir.
ADC Çevirim Adım Aralığı
A/D Modülü biçimlendirildikten sonra, dönüştürme işlemi başlamadan önce kanal
seçilmiş olmalıdır. Analog giriş kanallarında ilgili TRIS bitleri giriş için seçilmiş
olmalıdır.
Aşağıdaki adımlar, A/D dönüşüm yapmak için takip edilmelidir.
1- A/D Modülü Konfigürasyonu
• Analog pinler, referans voltajlar ı ve dijital I/O konfigürasyonu (ADCON1)
• A/D giriş kanalı seçimi (ADCON0)
• A/D dönüşüm saat sekimi (ADCON0)
• A/D Modülünü açma
2- A/D Kesme Konfigürasyonu (Kesme kullanılacak ise)
• ADIF bitinin temizlenmesi
• ADIE bitinin ayarlanması
• GIE bitinin ayarlanması
3- Gerekli zamanı bekleme işlemi (100ns)
4- Dönüşümün başlaması
• GO/DONE bitinin ayarlanması
5- A/D dönüşümünün beklenmesi), ya Sıfıra düşmesi yada kesme gelmesi beklenir.
6- A/D dönüşüm sonucunu okuma ve kaydetme
7- Diğer dönüşüm için 2. veya 4. adımları tekrarlama
Örnek: ADC programları, kütüphane kullanmadan ve kütüphane ile.
unsigned short low_b, high_b;
unsigned int temp_res;
void main() {
ADCON0 = 0x01; // fosc/2 - kanal0 - ADON=1
ADCON1 = 0x1e; // format0 - AN0 – analog, 1-7 digital I/O
void main() {
ADCON0 = 0x01;
ADCON1 = 0x1e;
TRISA = 0xFF;
TRISC = 0;
TRISB = 0;
// PORTA giris
// PORTC cikis
// PORTB cikis
do {
ADCON0.GO_DONE= 1;
// AN0 dan 10-bitlik ADC okuma icin Go/Done biti 1 yapilir
while (ADCON0.GO_DONE = 1) {}
// ADC isleminin tamamlandiginda bu bit modul tarafindan
sifira cekilir. Bu komutla sifir olana kadar beklenir.
low_b = ADRESL;
high_b = ADRESH;
PORTB = low_b;
PORTC = high_b;
}
while(1);
}
// PORTB ye ADRESL yazilir
// PORTC ye ADRESH yazilir
// sonsuz dongu
TRISA = 0xFF;
TRISC = 0;
TRISB = 0;
// PORTA giris
// PORTC cikis
// PORTB cikis
do {
temp_res = ADC_Read(0); // AN0 dan 10-bitlik ADC okuma
sonucu alinir
PORTB = temp_res; // PORTB ye dusuk anlamli bitler yazilir
PORTC = temp_res >> 8; // RC1, RC0 en yuksek anlamli
bitler
}
while(1);
// sonsuz dongu
}
Örnek: ADC den okunan degeri voltaj karşılığına dönüştüren ve LCD ekranda gösteren
program (Voltmetre)
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
do
{
deger = ADC_Read(0);
deger *= 5; // mv dönüşümü
txt2[0]= (deger/1000) +48;
// Binler basamagi
txt2[1]= (deger%1000)/100 +48; // Yuzler basamagi
txt2[2]= (deger%100)/10 +48;
// Onlar basamagi
txt2[3]= (deger%10)+48;
// Birler basamagi
Lcd_Out(1,7,txt2);
Lcd_Out(1, 12, txt3);
} while(1);
char txt1[] = "Volt: ";
char txt2[] = "0000";
char txt3[] = "mV.";
}
unsigned int deger;
void main() {
ADCON0 = 0x01;
ADCON1 = 0x1e;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,txt1);
// ADC okuma
// Initialize LCD
// Clear display
// Cursor off
// deger degiskeni yazdirilir
// birim yazilir
Signal Conditioning (Sinyal Şartlandırıcı)
Herhangi bir fiziksel işaretin mikrodenetleyicili bir sistem tarafından örneklenmeden önce
ihtiyaca göre, yükseltme, zayıflatma, filtreleme, anti-aliasing, izolasyon, kaydırma (offset
ekleme), lineerizasyon gibi amaçlarla tasarlanmış analog ön-sinyal işleme devreleridir.
Genellikle, Op-ampla gerçekleştirilen eviren veya evirmeyen amplifikatör, toplayıcı, buffer,
alçak-geçiren filtre devreleri kullanılmaktadır.
Örnek devre:
Mikrodenetleyiciler
20