Post on 23-Dec-2021
ADC: Anolog-Digital Çevirici
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
ADC, girişlerine uygulanan akım, gerilim, sıcaklık gibi analog büyüklükleri değerleri ile
orantılı olarak çıkışında digital sinyale çeviren devredir.
PIC16F877a’da 8 kanallı ADC modülü bulunmaktadır.10 bit çözünürlüğe sahiptir.
2^10=1024
Vref+=5v,Vref-=0v
Adım Sayısı=5/1024=0.00482812
Her 0.00482812 volt değişiminde (adımında) 10 bit’in dijitinde değişim olur.
DAC ise, girişindeki sayısal değerlere karşılık analog bir gerilim veya akım üreten
devredir. ADC lerde olduğu gibi bit çözünürlüğü, adım büyüklüğü gibi bir çok kavram
DAC ler içinde geçerlidir.
Bir MCU da ADC birimi yoksa
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
ADC0831, Üç kontrol hattı, DO (data out), CLK
(clock), _CS (chip seçim) kullanır.
MCU da ADC birimi yoksa (Örneğin 16F84 gibi) ADC0831 entegresini kullanarak
dönüştürme yapabilirsiniz.
Orta Ölçekli PIC ADC Yapısı
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
PIC ADC Çevrim Algoritması
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
1. Hangi kanalları A/D çevrimine açacağınızı ve çevrim sonucunu nasıl yazdırmak istediğinizi göz önünde bulundurarak ADCON1 kaydedicisinin değerini ayarlayın.
2. Çevrimi açmak ve bu çevrimi hangi kanaldan(A/D çevrimini birkaç kanaldan aynı anda yapamazsınız) yapacağınızı ve çevrim periyodunu ayarlamak için ADCON0 kaydedicisine gerekli değerleri ayarlayın.
3. ADCON0’ın Go/Done bitini 1 yaparak çevirme işlemini başlatın.Öncesinde ADON biti ‘1’ olmalı.
4. Go/Done bitinin 0 değerini almasını bekleyin. Bu değerin 0 olması işlemin bittiğinin, sonucunda ADRESH ve ADRESL’ye yazıldığını belirtir.
5. Sonuç yazılma ayarlarınızı göz önünde bulundurarak sonucu değerlendirebilirsiniz.
Sonucu 10 bit üzerinden değerlendirmeniz gerekir. Elde edilen sonucun kaç volta karşılık geldiğini şu şekilde formülize edebiliriz. ((ADRESH:ADRESL) x (Vref+ - Vref-) ) / 1024Örnek olarak sonuç değerimiz 0110101010 olsun, referans olarakta Vdd ve Vss’yi seçtiğimizi varsayarsak Vo=(426x(5-0)) / 1024 ‘den yaklaşık olarak V0=2.1 volt sonucunu elde ederiz.
Veya Vin=Vo*adım buyuklugu Adım buyuklugu=5/2^10=4.88 mV
PIC16f877 ADC yapısı
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
PIC16F877’de 8 kanallı ADC modülü bulunmaktadır, bu modüllerden 10 bitlik giriş alınabilir. Bukanallar PIC16F877’de ise’ PORTA ve PORTE’de bulunur. ADC modül işlemlerinde 4 önemlikaydedici vardır. Bunlar ADCON0, ADCON1, ADRESH, ADRESL’dir. ADCON’lar A/D çevrimininkontrolünü yönetirler. ADRES’ler ise sonuçların yazıldığı yazmaçlardır.
Dr. Bülent ÇOBANOĞLU
I/O Portları: Analog/Digital Seçimi
ADFM biti dönüştürme işlemi sonunda 10 bitlik sayının formatını belirler.1: Sayı sağa kaydırılır.0: Sayı
sola kaydırılır. PCFG3 – PCFG0 bitleri A/D portlarının durumunu belirler. Tümü 0 yapılırsa bu durumda 8 tane
analog kanal seçilmiş olur ve her kanalın referans gerilimi VDD olarak ayarlanır.
16F877’de 8 tane 10 bitlik A/D çevirme kanalı bulunur. A / D
kanalları için RA4 hariç diğer A ve E portları kullanılır. A/D
çevirme işlemi 4 adet kaydediciyle yapılmaktadır.
Aşağıda ilgili register lar ve adresleri gösterilmiştir.
ADRESH 0x1E ; A / D sonuç kaydedicisi (high register)
ADRESL 0x9E ; A / D sonuç kaydedicisi (low register)
ADCON0 0x1F ; A / D kontrol kaydedicisi 0
ADCON1 0x9F ; A / D kontrol kaydedicisi 1
ADCON1, PORTA ve PORTE
portlarını dijital veya analog
giriş-çıkış olarak ayarlamaya
yarar. Default olarak bu portlar
analogtur ADCON1
kaydedicisine ilgili değerler
yüklenerek bütün pinler digital
veya analog işlemler için
ayarlanabilir. Ayrıntılı bilgi için
lütfen datasheet’e ve ileride
anlatacağımız ADC konusuna
göz atınız.
I/O Portları: Analog/Digital Seçimi :ADCON1
I/O Portları: Analog/Digital Seçimi : ADFM biti ve ADRESL-ARESH
I/O Portları: Analog/Digital Seçimi : ADCON0
TAD:Bir bitlik dönüşüm süresidir. 10 bitlik dönüşüm için 11TAD süresi çeker.
PIC16f877 ADC yapısı
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
CHS2, CHS1, CHS0 : Kanal seçme bitleridir.
GO/DONE : ADC çevrimini başlatan bittir, çevrim bitince 0
olur.
ADON : ADC birimini açan bittir.
ADCS1, ADCS0 : Frekans kaynağı seçim bitleridir
ADFM: ADRES kaydedicisi formatını belirler
ADCS2 : Yardımcı frekans seçme biti.
PCFG3, PCFG2, PCFG1, PCFG0 : Portların
görevlerini ayarlayan bitler.
(ADCS1: ADCS0 (Bit özel isimleri)) Bu
yazmaçın 7 ve 6. bitleri TAD değerini
ayarlamaya yarar. TAD, A/D çevrim
periyodudur. Bir çevrim için minimum
11TAD süresi gerekir. TAD süresi için
dört seçenek vardır.
00 = Fosc/2
01 = Fosc/8
….
TAD süresi minimum 1.6 mikro saniye
olmalıdır. Bunun 4 Mhz’likte 2 veya 8,
20 MHZ’likte ise hepsi seçilebilir.
ADC Örnek
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
ADC Örnek
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
#include <xc.h>void main() {TRISA = 0xFF; // PORTA inputTRISD = 0x00; // portd çıkışTRISB = 0; // PORTB çıkışPORTC=0;PORTD=0;ADCON1=0b11000000; // AN ler analog, ADFM=1,ADcs2=1ADCON0=0b00010001; //fosc/4, AN2, GODONE=0, ADON=1for(;;){ADCON0bits.GO=1; // çevrime başlawhile (ADCON0bits.nDONE); //bitene kadar beklePORTB = ADRESL; // ilk 8 bit PORTB e gönderPORTD = ADRESH; //Son iki biti (MSB leri) PORTD e gönder} }
ADFM biti
Soru: Referans gerilimlerini farklı seçtiğinizde elde edilen sonuçları bir önceki örnek değerleri ile karşılaştırınız
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
LCD UYGULAMASI
LCD (Liquid Crystal Display) göstergeli mikro denetleyici uygulamalarıile hayatımızın her alanında (cep telefonları, fotokopi makineleri,otomobiller, kameralar, oyuncaklar, güvenlik sistemleri gibi)karşılaşılmaktadır.
Karakter tabanlı dot matrix LCD (paralel/seri) ve grafik LCD olmak üzereiki çeşit LCD vardır.
LED gösterge ile sadece sayısal değerler ve sınırlı sayıdaki karakterlergösterilebilmektedir. Buna karşılık LCD göstergeler ile her türlü yazı vesayısal değeri göstermek mümkündür. LCD’ler çeşitli firmalar tarafındanüretilmesine rağmen kontrolleri standartlaşmıştır.
Tüm LCD göstergelerde yetki (Enable), oku yaz (R/W), ve kaydediciseçim (RS) uçları ile veri giriş hatları vardır.
Bağlantı şekillerine göre LCD göstergeler seri ve paralel olaraksınıflandırılmaktadırlar. Paralel LCD’ler ucuz oluşları nedeniyle çokyaygın olarak kullanılmaktadır.
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
LCD Kontrol İşlemleriLCD göstergeye gönderilen veri ya bir komut kodu veya bir karakterdir. Şekil 3. deLCD göstergeye yazma işlemine ait zamanlama diyagramı görülmektedir. RS ucudüşük seviyeye çekilirse yapılacak işlem bir kontrol işlemidir. Eğer yüksek seviyedetutulursa gönderilen bir karakterdir. LCD’ye her 8 bitlik veri, önce yüksek değerlikli 4- bit, sonra düşük değerlikli 4 - bit olmak üzere iki defada gönderilir. LCD ekranaveriler ASCII karakter kodları gönderilerek gösterilirler. Mesela ekrana 0 göstermekiçin, sıfırın ASCII kodu olan 48’i göndermek gerekir. RW=0 ise LCD ye yazma,RW=1 ise LCD den okuma işlemi yapılıyordur.
LCD ekrana veri yazmak için aşağıdaki adımlar
izlenir;
• Veri, veri yoluna konulur,
• RS ucu lojik 1 yapılarak, yazma işleminin komut
olmadığı belirtilir,
• RW ucu lojik 0 yapılır,
• E ucuna lojik “1–0” şeklinde bir saat (clock)
darbesi verilir.
LCD ekrana komut yazmak için ise aşağıdaki
adımlar izlenir;
• Komut, veri yoluna konulur,
• RS ucu lojik 0 yapılarak, yazma işleminin komut
olduğu bildirilir,
• RW ucu lojik 0 yapılır,
• E ucuna lojik “1–0” şeklinde bir saat (clock)
darbesi verilir.YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
LCD Bacak Bağlantıları
AçıklamaFonksiyonPin ismiPin No
GNDToprak/ŞaseVss1
+ 5 VKaynak / PowerVdd2
(-2) 0 - 5 VKontrast /ParlaklıkVee3
0: Komut, 1: VeriKomut/Veri SeçiciRS4
0:LCD’ye yaz, 1: LCD den okuOku/YazR/W5
LCD’ye veri gönderme için aktif yapılır. E bacağının lojik 1 den lojik 0’ a geçişi ile LCD’ye veri transfer olur. Bacağın lojik 0’dan lojik 1’e geçmesi ile LCD’den
durum okunabilir.
Enable
/EtkinleştirmeE6
Data LSBI/OD07
DataI/OD18
DataI/OD29
DataI/OD310
DataI/OD411
DataI/OD512
DataI/OD613
Data MSBI/OD714
LCD dış dünyaya 14 pinlik bir konnektör ile bağlanır. Tablo’da LCD nin pin (bacak)
numaraları ve her pinin görevi verilmiştir.
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
Karakter gösterimiKarakter LCD’lerin oluşturabileceği her
bir karakter ise karakter LCD’nin özelCGROM hafızasına kaydedilmişlerdir.ASCII karakter uyumu olankarakterlerin listesi şekil’degörülebilmektedir.
Şekilde görüleceği üzere CGROM’un ilk8 karakterlik (0x00..0x0F) kısmı boşturve yazılabilirdir. Bu kullanıcıya tablodaolmayan karakterleri (CGRAM ile)kendisinin tanımlamasına imkan tanır.
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
LCD
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
LCD nin kullanıma hazır hale getirilmesi
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
PIC- Assembly: 8 bitlik LCD ye yazı yazmakLIST P=16F84
INCLUDE "P16F84.INC«
CBLOCK H'0C'
SAY1,SAY2
ENDC
CLRF PORTB
BSF STATUS,5
CLRF TRISA
CLRF TRISB
BCF STATUS,5
BASLA
MOVLW 0X01; DISPLAY TEMIZLE
CALL KOMUTYAZ
MOVLW 0X30 ;8 BITLIK BAGLANTI, 1 SATIR
CALL KOMUTYAZ
MOVLW 0X0C ;EKRANI AÇ,KURSORU KAPAT, YANIP SONME YOK
CALL KOMUTYAZ
CALL SATIRYAZ
DUR
GOTO DUR
KOMUTYAZ
BCF PORTA,1 ;RS=0 İLE KOMUT YAZ
MOVWF PORTB
BSF PORTA,0 ;E=1
CALL BEKLE
BCF PORTA,0 ;E=0
RETURN
DATAYAZ
BSF PORTA,1 ;RS=1 İLE VERI YAZ
MOVWF PORTB
BSF PORTA,0 ;E=1
CALL BEKLE
BCF PORTA,0 ;E=0
RETURN
SATIRYAZMOVLW 'B'CALL DATAYAZMOVLW 'U'CALL DATAYAZMOVLW 'L'CALL DATAYAZMOVLW 'E'CALL DATAYAZMOVLW 'N'CALL DATAYAZMOVLW 'T'CALL DATAYAZRETURN
BEKLEMOVLW H'FF'MOVWF SAY1
DON1MOVLW H'FF'MOVWF SAY2
DON2DECFSZ SAY2,FGOTO DON2DECFSZ SAY1,FGOTO DON1RETURNEND
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
Devre Şeması
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
PIC- C: 8 bitlik LCD ye yazı yazmak
#include <xc.h>
#define RS RB0
#define RW RB1
#define E RB2
void lcdKomut (unsigned char);
void lcdVeri (char);
void bekle(unsigned int);
void lcdKomut(unsigned char k){PORTD=k;RS=0;RW=0;E=1;bekle(1);E=0;}
void lcdVeri(char veri){PORTD=veri;RS=1;RW=0;E=1;bekle(1);E=0;}
void bekle(unsigned int sn){unsigned int i,j;for (i=0; i<sn; i++)for (j=0; j<135; j++);}
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
void main(){TRISD=0;TRISB=0;E=0;bekle(250);lcdKomut(0x38);//2 satır 5*7 LCD
bekle(250);lcdKomut(0x0E); //ekran ve kursor açıkbekle(15);lcdKomut(0x01);//Ekranı temizlebekle(15);lcdKomut(0x06);//Kursor sağakaysınbekle(15);lcdKomut(0x86);//1. satır,6.sırabekle(15);lcdVeri('S');bekle(15);lcdVeri('A');bekle(15);lcdVeri('U');}
Hitech PIC- C: Hazır fonksiyon kullanarak 4 bitlik LCD ye yazı yazmak
Kod Değişikliği:Hitech klasörünün altındaki ‘LCDemo’ klasörü
içerisindeki «lcd.c» dosyasındaki PORTD yi PORTB,
TRISD’yi de TRISB ye şeklinde değiştirmeliyiz.
lcd.h içindeki fonksiyonlar;
lcd_init(): lcd yi hazırla
lcd_clear(): lcd yi temizle
lcd_goto(p): belirtilen pozisyona git
lcd_write(): Karakter gönder
lcd_puts(): String gönder
lcd_putch(): karakter gönder
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
MikroC LCD kütüphanesi kullanımı
Mikrodenetleyiciler 24
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.
MikroC LCD kütüphanesi kullanımı
Mikrodenetleyiciler 25
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.
MikroC LCD kütüphanesi kullanımı
Mikrodenetleyiciler 26
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
Seri LCD
MCU ya seri olarak sadece bir kablo ile bağlanırlar ve normal olarak RS232 seri
iletişim protokolüne göre çalışırlar. Fiyatları paralel LCD ye göre daha pahalıdır.
VSS
RXD
VDD
LCD2
MILFORD-2X16-BKP
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
Basılan tuşu seri LCD de gösteren uygulama
YRD.DOC.Dr.BÜLENT ÇOBANOĞLU
Not: printf bazı lite derleyici
sürümlerinde çalışmıyor o zaman
bu örnek atlanabilir!