BÖLÜM 3 CAPTURE/COMPARE/PWM ve TUŞ TAKIMI İŞLEMLERİ

Benzer belgeler
BÖLÜM 2 INTERRUPT ve TIMER İŞLEMLERİ

Sayfa 1

Ön Söz. Fırat Deveci Ağustos 2009 Elektrik ve elektroniğe gönül veren herkese. FxDev.org Sayfa 1

TUŞ TAKIMI (KEYPAD) UYGULAMALARI

ÖRNEKTİR KULLANILAMAZ

Komutların İşlem Süresi

BÖLÜM 4 KAREKTER LCD ve ADC İŞLEMLERİ

Ön Söz. Fırat Deveci Ağustos 2009 Elektrik ve elektroniğe gönül veren herkese. FxDev.org Sayfa 2

PİC HAKKINDA KISA KISA BİLGİLER GİRİŞ/ÇIKIŞ PORTLARI

Komutların İşlem Süresi

BÖLÜM 6 RS232 SERİ İLETİŞİM İŞLEMLERİ

PIC MCU da Komutların İşlem Süresi

Mikroişlemciler. Microchip PIC

Alıcı Devresi; Sinyali şu şekilde modüle ediyoruz;

DERS 12 PIC 16F84 ile KESME (INTERRUPT) KULLANIMI İÇERİK

DENEY-7. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

DENEY-1. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

TIMER. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

PIC 16F877 nin kullanılması

PIC MCU ile UYGULAMALAR

DENEY-5. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

BÖLÜM 1: MİKRODENETLEYİCİLER

Erzurum Teknik Üniversitesi RobETÜ Kulübü Robot Eğitimleri. ARDUİNO EĞİTİMLERİ I Arş. Gör. Nurullah Gülmüş

T.C. MİLLÎ EĞİTİM BAKANLIĞI MEGEP (MESLEKİ EĞİTİM VE ÖĞRETİM SİSTEMİNİN GÜÇLENDİRİLMESİ PROJESİ) ELEKTRİK ELEKTRONİK TEKNOLOJİSİ

# PIC enerjilendiğinde PORTB nin 0. biti 1 olacak #PIC enerjilendiğinde PORTA içeriğinin tersini PORTB de karşılık gelen biti 0 olacak

Eğitim - Öğretim Yöntemleri Başlıca öğrenme faaliyetleri Kullanılan Araçlar Dinleme ve anlamlandırma

LPC2104 Mikro Denetleyicisini KEIL İle Programlamak

DENEY-4. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

EEM 306 Mikroişlemciler ve Lab. Doç.Dr. Mehmet SAĞBAŞ

PIC MİKROKONTROLÖR TABANLI MİNİ-KLAVYE TASARIMI

5.Eğitim E205. PIC16F628 ve PIC16F877 Hakkında Genel Bilgi IF THEN ELSE ENDIF HIGH-LOW GOTO-END- PAUSE Komutları Tanıtımı ve Kullanımı PIC16F628:

EasyPic 6 Deney Seti Tanıtımı

DENEY-2. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

Birol Çapa Özen Özkaya Güz Dönemi Eğitimleri

MİKRODENETLEYİCİLER ÖRNEK PROGRAMLAR

Ön Söz. Fırat Deveci Ağustos 2010 Elektrik ve elektroniğe gönül veren herkese. Sayfa 1

Yrd.Doç. Dr. Bülent ÇOBANOĞLU. Sakarya Üniversitesi, Teknoloji Fakültesi

EEM 419-Mikroişlemciler Güz 2017

Deney No Deney Adı Tarih. 3 Mikrodenetleyici Portlarının Giriş Olarak Kullanılması / /201...

DC motorların sürülmesi ve sürücü devreleri

7. Port Programlama. mikroc Dili ile Mikrodenetleyici Programlama Ders Notları -42- Şekil 2.1. Atmega16 mikrodenetleyici pin şeması

Program Kodları. void main() { trisb=0; portb=0; while(1) { portb.b5=1; delay_ms(1000); portb.b5=0; delay_ms(1000); } }

DENEY 9-A : PIC 16F877 ve LM-35 ile SICAKLIK ÖLÇÜM UYGULAMASI

İçİndekİler. 1. Bölüm - Mİkro Denetleyİcİ Nedİr? 2. Bölüm - MİkroDenetleyİcİlerİ Anlamak

BM-311 Bilgisayar Mimarisi

PIC MCU ile UYGULAMALAR-II

BM-311 Bilgisayar Mimarisi. Hazırlayan: M.Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

7 Segment Display ve Kesmeler (Interrupts) Hafta6-7. Dr. Bülent Çobanoğlu-SAÜ 1

PD103 BUTON LED UYGULAMA DEVRESİ UYGULAMA ÖRNEKLERİ MALZEME LİSTESİ

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUVARI KESMELİ GİRİŞ/ÇIKIŞ

PIC Mikrodenetleyicileri

İÇİNDEKİLER 1. KLAVYE KLAVYE RB KLAVYE RBHIGH DİSPLAY... 31

KONTROL VE OTOMASYON KULÜBÜ

DERS 13 PIC 16F84 ile DONANIM SAYICI KULLANIMI İÇERİK KESME

PIC 16F84 VE TEK BUTONLA BĐR LED KONTROLÜ

Assembler program yazımında direkt olarak çizgi ile gösterilmemesine rağmen ekranınız ya da kağıdınız 4 ayrı sütunmuş gibi düşünülür.

PRO NA011 DĐJĐTAL OTOMATĐK TEKRAR KAPAMALI 3 FAZ AŞIRI AKIM

B.Ç. / E.B. MİKROİŞLEMCİLER

void setup() fonksiyonu: Bu fonksiyon program ilk açıldığında bir kere çalışır ve gerekli kalibrasyon, setup komutlarını buraya yazarız.

PIC16F84 VE PIC C LITE COMPILER. Giriş / Çıkış port sayısı. Capture / Comp / PWM

Bu dersimizde pic pinlerinin nasıl input yani giriş olarak ayarlandığını ve bu işlemin nerelerde kullanıldığını öğreneceğiz.

FULMATIC 7 GÜMÜŞ SERİSİ PLC PLC KULLANMA KLAVUZU

C-Serisi PLC İleri Seviye Eğitim

GAZİ MESLEK YÜKSEK OKULU ELEKTRONİK TEKNOLOJİSİ

BUTON KONTROLÜ. Pull-Down Bağlantı (Ters Bağlantı) Butona basılmadığında Giriş=1 Butona basıldığında Giriş=0

VTIY DERS-4 YARDIMCI NOTLARI -2018

Örnek. int analogpin = 3; int val = 0; void setup() { Serial.begin(9600); } void loop() { val = analogread(analogpin); Serial.

CPU ONE PLC KULLANMA KLAVUZU

Programlamada Kullanılan Temel Parametreler

UYGULAMA 1 24V START CPU V LO. Verilen PLC bağlantısına göre; START butonuna basıldığında Q0.0 çıkışını aktif yapan PLC programını yazınız.

M20R PH Kullanma Talimatı

SAYISAL MANTIK LAB. PROJELERİ

BLGM423 Gömülü Sistem Tasarımı

KAÇAK AKIM RÖLESİ. Sayfa 1

DENEY-6. SABANCI ATL ÖĞRETMENLERİNDEN YAVUZ AYDIN ve UMUT MAYETİN'E VERDİKLERİ DESTEK İÇİN TEŞEKKÜR EDİYORUZ

DELTA PLC EĞİTİM SETİ KİTAPÇIĞI

İLERI MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

Deney 3: Asenkron Sayıcılar

ROKAY. Robot Operatör Kayıt Cihazı KULLANMA KILAVUZU V:1.0

T.C. MİLLÎ EĞİTİM BAKANLIĞI ELEKTRİK ELEKTRONİK TEKNOLOJİSİ MİKRODENETLEYİCİYLE ANALOG İŞLEMLER 523EO0022

NB Ekran Seri Port Üzerinden Veri Okuma/Yazma. Genel Bilgi Protokol Oluşturma Veri Okuma Veri Yazma

LCD (Liquid Crystal Display )

İÇİNDEKİLER ÖZELLİKLER. 3-4 KONTROL PANELİ HARİCİ KONTROL ÜNİTESİ BAĞLANTILAR VE HABERLEŞMELER 23-24

ADUC841 MİKRODENETLEYİCİ TABANLI GELİŞTİRME KARTININ TANITIMI:

DS18B20. İsmail VarıĢlı

DELTA PLC DE ZAMANLAYICILAR

P IC 16F877. Program. Belleği

MİLLİ SAVUNMA ÜNİVERSİTESİ KARA HARP OKULU DEKANLIĞI BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ DERS TANITIM BİLGİLERİ

Kullanım Uygulamaları Ön Görünüş. Dijital Ekran Mode Butonu Programlama Tuşu Sıcaklık Değiştirme tuşu ( - ) Sıcaklık Değiştirme tuşu ( +)

SAVİOR OTOMASYON TEKNİK DESTEK BİRİMİ

BÖLÜM 10 KAYDEDİCİLER (REGİSTERS) SAYISAL TASARIM. Bu bölümde aşağıdaki konular anlatılacaktır

DENEY 10-A : PIC 16F877 ile DARBE GENİŞLİK MODÜLASYONU (PWM) SİNYAL KONTROL UYGULAMASI

16F84 ü tanıt, PORTB çıkış MOVLW h FF MOWF PORTB

WIRELESS TECHNOLOGIES Uygulama Notu. ARX-34 ve ATX-34 KULLANARAKDATA GÖNDERMEK VE ALMAK ÇN GEREKL YAZILIM ve DONANIM

PIC Programlama. Devrim Çamoğlu

BÖLÜM 2 2. PROGRAMLAMA MANTIĞI

BÖLÜM 7 XTAL2 XTAL1. Vss. Şekil Mikrodenetleyicisi osilatör bağlantı şekli. Bir Makine Çevrimi = 12 Osilatör Periyodu

PULSE ÇIKIŞI İLE SERVO MOTOR KONTROLÜ. Giriş PLS2 Komutunun Açıklanması CP1H ve Smart Step 2 Kablo Bağlantıları Sonuç

* Şehir isimleri TIME/CALENDAR SETTINGS (Saat/Takvim Ayarları), WORLD TIME (Dünya Saati) ve ALARM modlarında, sağdan sola doğru değişir.

PIC TABANLI, 4 BASAMAKLI VE SER

Transkript:

BÖLÜM 3 CAPTURE/COMPARE/PWM ve TUŞ TAKIMI İŞLEMLERİ 3.1) Hi-Tech te CCP İşlemleri Pic içerisinde dahili olarak bulunan CCP modülü Copture (yakalama), Compare (karşılaştırma) ve PWM bölümlerinin baş harflerinin bir araya gelmesinden oluşur. Pic 16f877a nın içinde 2 adet CCP modülü bulunmaktadır. CCP için kullanılan kaydedici şekil-26 da görüleceği üzere 16 bitliktir. CCPRx kaydedicisi Timer 1 in kaydedicisi ile ortak çalışarak Capture ve Caompare işlemlerinde kullanılabilir. Şekil 26 CCP Kaydedicileri Genel itibari ile CCP işlemleri CCPxCON registeriyle kontrol edilir. x ifadesi bu bölümde kullanılan birime göre 1 ya da 2 olabilir. CCPxCON registerinin yapısı ve göreci şekil-27 de gözükmektedir. Şekil 27 CCPxCON Kaydedicisi Şekil-27 de verilen kaydedicinin bit bit görevleri ise şöyledfir; CCPxX, CCPxY CCPxM3, CCPxM2, CCPxM1, CCPxM0 : PWM düşük değerlikli bitleri. Yüksek değerlikli 8 bit ise CCPRxL kaydedicisinde bulunur. : CCP mod seçme bitleri. Modların ne olacakları aşağıdaki tabloda gösterilmiştir. 0000 : CCP etkin değil 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, her 16. yükselen kenarda 1000 : Compare modu, denklik durumunda CCPx pini 1 olsun, CCPxIF bayrağı çekilsin 1001 : Compare modu, denklik durumunda CCPx pini 0 olsun, CCPxIF bayrağı çekilsin 1010 : Compare modu, denklik durumunda CCPx pini değişmesin, CCPxIF bayrağı çekilsin 1011 : Compare modu, denklik durumunda CCPx pini değişmesin, CCPxIF bayrağı çekilsin, timer 1 resetlensin ve ADC başlasın 11xx : PWM modu FxDev.org Sayfa 1

3.1.1) Capture Modu Pic içerisinde bulunan Capture birimi şekil-28 den de görüleceği üzere Timer 1 ile ortak çalışır. Capture biriminin görevi yakalama yapmaktır. Modlarına göre her düşen, yükselen, 4. veya 16. yükselen kenarda yakalama yaparak ne kadar süre geçtiyse, geçen süreyi Timer 1 zamanlayıcısından alarak CCP biriminin özel kaydedicilerine yükler. Daha sonra CCP birimine kaydedilen zamanlar okunarak gerekli işlemler yapılır. Şekil 28 Capture Bölümü Capture birimini kullanmak için öncelikle Timer 1 ve CCP birimi ayarları yapılır. Kesmeden yararlanılacaksa CCPxIE ve CCPxIF birimleri set edilir veya temizlenir. Capture uygulamamızda CCP1 in her yükselen kenar yakalamasında bir değişkeni artırması, CCP2 nin ise her 4. yükselen kenar yakalamasında yine aynı değişkeni bir azaltması ve bu değişkenin PORTB den görülmesi amaçlanmıştır. Öncelikle uygulamamızla ilgili aşağıdaki şekil-29 daki Proteus devremizi çiziyoruz. Şekil 29 Capture Uygulaması FxDev.org Sayfa 2

Devremizi kurduktan sonra Hi-Tech te kodumuzu yazalım. #include <htc.h> char i; void main(void) TRISB=0x00; TRISC=0x06; PORTB=0x00; PORTC=0x00; CCP1M0=1; CCP1M1=0; CCP1M2=1; CCP1M3=0; CCP2M0=0; CCP2M1=1; CCP2M2=1; CCP2M3=0; CCP1IF=0; CCP2IF=0; CCP1IE=1; CCP2IE=1; PEIE=1; GIE=1; // Genel değişken tanımlanıyor // Ana fonksiyon alanı // PORTB çıkış olarak ayarlanıyor // CCP1 ve CCP2 giriş // PORTB sıfırlanıyor // PORTC sıfırlanıyor // CCP1 her yükselen kenar modunda // CCP1 her 4. yükselen kenar modunda // CCP1 ve CCP2 kesme bayrakları temizleniyor // CCP1 ve CCP2 kesme izinleri veriliyor // Yardımcı kesme izni veriliyor // Genel kesme izni veriliyor for(;;); static void interrupt isim(void) if(ccp1if) GIE=0; i++; PORTB=i; // Kesme fonksiyonu // Kesme fonksiyon ismi (önemsiz) // CCP1 kesmesi varsa // Başka kesme gelmesi engelleniyor // Değişken bir artırılıyor // Değişken değeri PORTB'ye yansıtılıyor CCP1IF=0; GIE=1; // Yeni CCP1 kesmesi için bayrak temizleniyor // Genel kesme izni veriliyor if(ccp2if) GIE=0; i--; PORTB=i; // CCP2 kesmesi varsa // Başka kesme gelmesi engelleniyor // Değişken bir azaltılıyor // Değişken değeri PORTB'ye yansıtılıyor CCP2IF=0; GIE=1; // Yeni CCP2 kesmesi için bayrak temizleniyor // Genel kesme izni veriliyor Yukarıda görüldüğü gibi genel kesme fonksiyonun içinde birden çok kesme bayrağı kontrolü yapılabilir. FxDev.org Sayfa 3

3.1.2) Compare Modu Compare modu pic içerisinde karşılaştırma işlemlerinde kullanılan birimdir. Şekil-30 dan da görüleceği üzere Timer1 iler ortaklaşa çalışırlar. Genel itibariyle çalışma mantığı şöyledir; - Öncelikle Timer1 ve Compare modu ayarları yapılır, - CCPRxH ve CCPRxL kaydedicilerine yakalanmak istenen sayı yüklenir, - Genellikle Timer1 harici kaynak beslemesi kullanılır - TMR1 kaydedicisi ile CCPRx kaydedicisi birbirine eşit olduğunda kesme bayrağı set edilir. Şekil 30 Compare Birimi Compare uygulamamızda CCP1 birimine 500 yüklenerek dahili Timer1 birimi değeri sayılarak CCP1 eşitliğinde RB0 a bağlı ledin yanıp sönmesi sağlanacaktır. Bu uygulama için öncelikle şekil-31 deki devreyi çiziyoruz. Şekil 31 Compare Uygulaması FxDev.org Sayfa 4

Şekildeki devreyi çalıştıran C kodu ise aşağıdaki gibidir; #include <htc.h> void main(void) TRISB=0x00; PORTB=0x00; TMR1CS=0; T1SYNC=0; TMR1ON=1; CCP1M0=1; CCP1M1=1; CCP1M2=0; CCP1M3=1; CCPR1H=500/256; CCPR1L=500%256; CCP1IF=0; CCP1IE=1; PEIE=1; GIE=1; // Ana fonksiyon alanı // PORTB çıkış olarak ayarlanıyor // PORTB sıfırlanıyor // Timer1 Harici kaynaktan besleniyor // Senkronizasyon yok // Timer1 açılıyor // CCP1 compare modunda, timer1 resetlenecek // 500'e eşitlenecek // CCP1 ve CCP2 kesme bayrakları temizleniyor // CCP1 ve CCP2 kesme izinleri veriliyor // Yardımcı kesme izni veriliyor // Genel kesme izni veriliyor for(;;); static void interrupt // Kesme fonksiyonu isim(void) // Kesme fonksiyon ismi (önemsiz) char i,j; // Değişkenler tanımlanıyor if(ccp1if) // CCP1 kesmesi varsa GIE=0; // Başka kesme gelmesi engelleniyor i++; // Değişken bir artırılıyor if(i==1) // Değişken 1 ise RB0=1 olur RB0=1; else if(i==2) // Değişken 2 ise RB0=0 olur RB0=0; i=0; CCP1IF=0; GIE=1; // Yeni CCP1 kesmesi için bayrak temizleniyor // Genel kesme izni veriliyor Esasen kurulan devre 1000Hz lik sinyal oluşturacaktır. Bu değeri şekil-31 de bulunan frekansmetreden görebilirsiniz. FxDev.org Sayfa 5

3.1.3) PWM Modu PWM, Pulse Width Modulation ın kısaltmasıdır. 16f877a da iki adet PWM modülü bulunmaktadır. Şekil-32 de görüldüğü üzere PWM modülü Timer 2 ile ortaklaşa çalışmaktadır. Şekil 32 PWM Birimi Pic ile PWM sinyalini üretmek için aşağıdaki adımlar izlenir; - PWM periyodunu ayarlayarak PR2 değerine yazılır, - PWM Duty Cycle CCPRxL ve CCPxCON<5:4> e yazılır, - CCPx output yapılır, - Timer 2 prescale oranı belirlenir ve Timer 2 çalıştırılır, - CCPx modülü PWM olarak ayarlanır. Şekil 33 PWM Periyodu ve Doluluk Oranı FxDev.org Sayfa 6

Burada önemli olan bir diğer faktörde şekil-33 te gözüken PWM periyodu ve doluluk oranıdır. Bu oranlar aşağıdaki matematiksel işlemler izlenerek hesaplanır ve ilgili kaydedicilere yüklenirler. PWM Periyodu=[(PR2)+1].4.Tosc.[TMR2 Prescale Değeri] PWM Duty Cycle=[CCPRxL:CCPxCON<5:4>].Tosc.[TMR2 Prescale Değeri] 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 çözünürlüğü ise aşağıdaki formülle hesaplanır; PWM uygulamamızda pic in CCP1 birimindeki PWM kullanarak, duty cycle ı değiştirmeden, sadece periyodu değiştirerek buzzer sayesinde sesi nasıl değiştiğini görelim. Duty Cycle periyodunu 1ms kabul edelim. Periyodu ise iki butonla artırıp azaltalım. Öncelikle bu uygulama için şekil-34 teki devreyi çizelim. Şekil 34 PWM Uygulaması FxDev.org Sayfa 7

İstediğimiz işlemi yapan Hi-Tech kodu ise aşağıdaki gibi olacaktır. #include <htc.h> void main(void) char i=100; ADCON1=0x07; TRISA=0x03; TRISC=0x00; PORTA=0x00; PORTC=0x00; CCPR1L=0x3E; CCP1X=1; CCP1Y=0; T2CKPS1=1; T2CKPS0=1; TOUTPS3=0; TOUTPS2=0; TOUTPS1=0; TOUTPS0=0; CCP1M0=1; CCP1M1=1; CCP1M2=1; CCP1M3=1; TMR2ON=1; // Ana fonksiyon alanı // PORTA dijital oluyor // RA0 ve RA1 giriş // PORTC çıkış olarak ayarlanıyor // PORTA sıfırlanıyor // PORTC sıfırlanıyor // Duty registere 250 yükleniyor // Duty cycle 1ms periyodunda // Prescaler 1:16 oluyor // Postscale 1:1 oluyor // CCP1 PWM modunda // Timer 2 çalıştırılıyor for(;;) if(ra0) // Azalt butonuna basılmış mı while(ra0); // Butondan elin çekilmesi bekleniyor i-=5; // PR2 birimi 5 azaltılıyor if(i<65) // Değişken 65'ten küçükse i=65; // Tekrar 65'e eşit olsun if(ra1) // Artır butonuna basılmış mı while(ra1); // Butondan elin çekilmesi bekleniyor i+=5; if(i>250) // Değişken 250'den bütükse PR2=i; i=250; // Tekrar 250'ye eşit olsun // Değişken PR2'ye eşitleniyor İşlemler karışık gibi görünse de aslında tüm iş Duty Cycle ve PWM periyodunu ayarlamaktadır. Bunun için internette birçok program bulabilirsiniz. FxDev.org Sayfa 8

3.2) Tuş Takımı Uygulaması Dışarıdan bilgi girmek için en çok kullanılan ve şekil-35 te gözüken keypad, esasen belirli şekillerde oluşturulmuş pull-up butonlardan oluşur. Şekil 35 4x4 Keypad Bu bölümde keypad i kullanmak için tarama yöntemi irdeleyeceğiz. Uygulamamızda D portuna bağlanmış, açık şeması bulunan keypad in tarama yöntemiyle sürülüp, B portuna bağlı ledlere hangi butonun basıldığı yansıtılacaktır. Bunun için öncelikle şekil-36 daki devreyi çiziyoruz. Şekil 36 4x4 Keypad Uygulaması - 1 Görüldüğü üzere açık devresi görülen keypad in aslında normal pull-up butonlarından farkı yoktur. İstediğimiz işlemi yapan Hi-Tech kodu ise aşağıdaki gibi olacaktır. FxDev.org Sayfa 9

#include <htc.h> #include <delay.h> // Gecikme fonksiyonu #define sut1 #define sut2 #define sut3 #define sut4 #define sat1 #define sat2 #define sat3 #define sat4 RD0 // sut1 ifadesi RD0 ifadesine eşitleniyor RD1 // sut2 ifadesi RD1 ifadesine eşitleniyor RD2 // sut3 ifadesi RD2 ifadesine eşitleniyor RD3 // sut3 ifadesi RD3 ifadesine eşitleniyor RD4 // sat1 ifadesi RD4 ifadesine eşitleniyor RD5 // sat2 ifadesi RD5 ifadesine eşitleniyor RD6 // sat3 ifadesi RD6 ifadesine eşitleniyor RD7 // sat4 ifadesi RD7 ifadesine eşitleniyor char keypad_oku(void) // Fonksiyon ismi char tus=0; PORTD=0x00; // D portu çıkışı sıfırlanıyor sat1=1; // 1. satır lojik-1 yapılıyor if(sut1) // 1. sütun okunuyor tus=1; if(sut2) // 2. sütun okunuyor tus=2; if(sut3) // 3. sütun okunuyor tus=3; if(sut4) // 4. sütun okunuyor tus=0x0a; sat1=0; // 1. satır lojik-0 yapılıyor sat2=1; // 2. satır lojik-1 yapılıyor if(sut1) // 1. sütun okunuyor tus=4; if(sut2) // 2. sütun okunuyor tus=5; if(sut3) // 3. sütun okunuyor tus=6; if(sut4) // 4. sütun okunuyor tus=0x0b; sat2=0; // 2. satır lojik-0 yapılıyor FxDev.org Sayfa 10

sat3=1; // 3. satır lojik-1 yapılıyor if(sut1) // 1. sütun okunuyor tus=7; if(sut2) // 2. sütun okunuyor tus=8; if(sut3) // 3. sütun okunuyor tus=9; if(sut4) // 4. sütun okunuyor tus=0x0c; sat3=0; // 3. satır lojik-0 yapılıyor sat4=1; // 4. satır lojik-1 yapılıyor if(sut1) // 1. sütun okunuyor tus=0x0e; if(sut2) // 2. sütun okunuyor tus=0; if(sut3) // 3. sütun okunuyor tus=0x0f; if(sut4) // 4. sütun okunuyor tus=0x0d; sat4=0; // 4. satır lojik-0 yapılıyor return tus; // Fonksiyon "tus" değeri ile geri döner void main(void) // Ana fonksiyon alanı TRISB=0x00; TRISD=0x0F; PORTB=0x00; PORTD=0x00; for(;;) PORTB=keypad_oku(); FxDev.org Sayfa 11

Görüldüğü üzere tarama metodu özellikle büyük projelerde sorun yaratacak düzeyde uzundur. Tarama işlemini 2. bölümde gördüğümüz Timer 0 kesmesiyle yapmak, programsal açıdan sürekli kontrol işlemini gereksiz hale getirip, projenize etkinlik kazandırabilirsiniz. FxDev.org Sayfa 12