MikroC ile PIC Programlama 8.Hafta Mikrodenetleyiciler
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; // Myvar isimli char tipi degisken olusturulur sbit AnotherBit at MyVar.B0; // degiskenin bit0 i AnotherBit olarak tanimlandi. MikroC ile bit değişken tipi ile bir bitlik değişkenler kullanılabilir. bit bf; // bf bit tipi değişken atanır, hafizada belirli bir adresi yoktur. bit *ptr; // bu nedenle pointer atamasida yapilamaz: bit arr [5]; // bit tipi dizi atmasi yapilamaz. Mikrodenetleyiciler
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
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 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
MikroC LCD kütüphanesi kullanımı LCD kütüphanesi içerisindeki fonksiyonlar: Lcd_Cmd : LCD ye bazı komutlar gönderir, bu komutların tanımladıkları iş icra edilir. Komutlar: _LCD_FIRST_ROW Kursörü 1. satıra taşı. _LCD_SECOND_ROW Kursörü 2. satıra taşı. _LCD_THIRD_ROW Kursörü 3. satıra taşı. _LCD_FOURTH_ROW Kursörü 4. satıra taşı. _LCD_CLEAR Ekranı temizle. _LCD_RETURN_HOME Kursörü başa taşı. (Yazılı bilgi etkilenmez) _LCD_CURSOR_OFF Kursörü kapat. _LCD_UNDERLINE_ON Alt Çizgi biçimli kursör. _LCD_BLINK_CURSOR_ON Yanıp Sönen biçimli kursör. _LCD_MOVE_CURSOR_LEFT Kursör bir karakter sola. _LCD_MOVE_CURSOR_RIGHT Kursör bir karakter sağa. _LCD_TURN_ON Lcd displayi aç. _LCD_TURN_OFF Lcd displayi kapat. _LCD_SHIFT_LEFT Display metnini sola kaydır. _LCD_SHIFT_RIGHT 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
Ö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; 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 } void main(){ ADCON1 = 7; // A portu dijital I/O Lcd_Init(); // LCD baslat Lcd_Cmd(_LCD_CLEAR); // Ekrani sil Lcd_Cmd(_LCD_CURSOR_OFF); // Kursörü kapat Lcd_Out(1,6,txt3); // İlk satira txt3 ü yaz. Lcd_Out(2,6,txt4); // İkinci satira txt4 yaz. Delay_ms(2000); // 2 sn bekle Lcd_Cmd(_LCD_CLEAR); // Ekrani temizle Lcd_Out(1,1,txt1); // İlk satira txt1 ü yaz. Lcd_Out(2,5,txt2); // İkinci satira 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); for(i=0; i<8; i++) { // 7 kez saga kaydir
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; // A portu dijital I/O Lcd_Init(); // LCD baslat Lcd_Cmd(_LCD_CLEAR); // Ekrani sil Lcd_Cmd(_LCD_CURSOR_OFF); // Kursörü kapat Lcd_Out(1,2,txt1); // İlk satira txt3 ü yaz. txt2[0]= (deger/100) +48; // Yuzler basamagi txt2[1]= (deger%100)/10 +48; // Onlar basamagi txt2[2]= (deger%10)+48; // Birler basamagi ohm[0] = 0xf4; Lcd_Out(1,10,txt2); // deger degiskeni yazdirilir Lcd_Out(1,14,ohm); // İ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
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.
PCFG3:PCFG0 : PortA ve PortE için port yapılandırma bit konfigürasyonu 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 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; void main() { ADCON0 = 0x01; // fosc/2 - kanal0 - ADON=1 ADCON1 = 0x1e; // format0 - AN0 – analog, 1-7 digital I/O TRISA = 0xFF; // PORTA giris TRISC = 0; // PORTC cikis TRISB = 0; // 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; // PORTB ye ADRESL yazilir PORTC = high_b; // PORTC ye ADRESH yazilir } while(1); // sonsuz dongu unsigned int temp_res; void main() { ADCON0 = 0x01; ADCON1 = 0x1e; TRISA = 0xFF; // PORTA giris TRISC = 0; // PORTC cikis TRISB = 0; // 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; char txt1[] = "Volt: "; char txt2[] = "0000"; char txt3[] = "mV."; unsigned int deger; void main() { ADCON0 = 0x01; ADCON1 = 0x1e; Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,1,txt1); do { deger = ADC_Read(0); // ADC okuma 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); // deger degiskeni yazdirilir Lcd_Out(1, 12, txt3); // birim yazilir } while(1); }
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