MÜHENDİSLİK VE DOĞA BİLİMLERİ FAKÜLTESİ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BÖLÜMÜ EEM0212 MİKROİŞLEMCİLER LABORATUVARI DENEY ÖNCESİ HAZIRLIK SORULARI Deney 1 Genel Amaçlı Giriş/Çıkış (GPIO) İşlemleri Laboratuvar Sorumlusu Dr. Öğr. Üyesi Mustafa ÖZDEN Arş. Gör. Esat AKKÖSE Deney Öncesi Hazırlık (%25) Deney Performansı (%50) Ödev Raporu (%25) Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı 1. PIC16F877A, GPIO işlemleri için kullanılan saklayıcıları ve kullanılış biçimlerini açıklayınız. (10p) TRISx (Tri-State Control Register): TRISx saklayıcısı, herhangi bir I/O portunun hangi pinlerinin giriş (input) veya çıkış (output) olarak kullanılacağını belirler. Her bir TRISx biti, ilgili I/O pininin durumunu belirler. "1" olarak ayarlanan bitler, giriş modunu belirtirken, "0" olarak ayarlananlar çıkış modunu belirtir. Örneğin, TRISA saklayıcısındaki bir bitin "1" olarak ayarlanması, ilgili pinin giriş modunda olduğunu gösterirken, "0" olarak ayarlanması çıkış modunda olduğunu gösterir. PORTx (Port Register): PORTx saklayıcısı, ilgili I/O portunun mevcut çıkış durumunu içerir. Her bir PORTx biti, ilgili I/O pininin durumunu temsil eder. Bu bitler, belirli bir porttaki pinlerin durumunu okumak veya değiştirmek için kullanılır. Örneğin, bir PORTA bitinin "1" olarak ayarlanması, ilgili pinden bir yüksek (high) seviye çıkışı gönderirken, "0" olarak ayarlanması düşük (low) seviye çıkışı gönderir. LATx (Latch Register): LATx saklayıcısı, ilgili I/O portunun çıkışlarını kontrol etmek için kullanılır. Her bir LATx biti, ilgili I/O pininin çıkışını belirler. Bu saklayıcı doğrudan çıkışları kontrol etmek için kullanılır ve PORTx'ten farklı olarak çıkışlar üzerinde doğrudan etki yapar. Örneğin, bir LATA bitinin "1" olarak ayarlanması, ilgili pinin yüksek seviyede çıkış vereceğini belirtirken, "0" olarak ayarlanması düşük seviyede çıkış vereceğini belirtir. 2. PIC C derleyicisine ait port okuma, yazma, port modu belirleme ve gecikme fonksiyonlarının kullanımını açıklayınız. (10p) set_tris_x(değer) , set_tris_b(0b00001111), set_tris_b(0x0F) x portunun bitlerinin giriş mi çıkış mı olduğunu tanımlamamızı sağlar get_tris_x() , x portunun bitlerinin nasıl tanımlandığımızı öğrenmemizi sağlar set_tris_a(0xFA);x portunun bitlerinin nasıl tanımlandığımızı öğrenmemizi sağlar output_low(pin ismi); output_low(pin_A2); İstenen portun istenen biti Lojik-0 yapılır. output_high(pin ismi); output_high(pin_A2); İstenen portun istenen biti Lojik-1 yapılır. output_bit(pin ismi,değer); output_bit(PINC4,1); İstenen portun istenen biti Lojik-1 ya da Lojik-0 yapılır. output_x(değer); output_b(0x0F); (00001111) Bir portun tüm bitlerine tek komutla çıkışlar yüklenir. output_toggle(pin_ismi); output_toggle(pin_c4); (0->1) İstenen portun istenen bitinin değerini değiştirir. Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı 3. PIC C derleyicisinde kullanılan konfigürasyon bitleri (FUSE) nelerdir? Hangi amaçla, nasıl kullanılırlar? Açıklayınız. (10p) #fuses LP: Low Power Osc. XT: Kristal veya seramik resonatör. HS: High Speed. Yüksek Hızlı kristal veya seramik resonatör. RC: Resistor Capacitor. Direnç-Kondansatör osilatör WDT: Watch Dog Timer.PIC’e gömülü bulunan bir RC osilatördür. NOWDT: No Watch Dog Timer. İstemediğinde seçilir. PUT: Power Up Timer. Seçildiğinde PIC Mikrodenetleyicisi yaklaşık 72ms süre boyunca reset durumunda kalır. Süre sonunda denetleyici hafızasına yüklü programı çalıştırmaya başlar. NOPUT: No Power Up Timer. İstemediğinde seçilir. LVP: Low Voltage Programming. Düşük gerilimle programlama modu seçilir. PIC Mikrodenetleyicisini programlamak için MCLR ucundan 13V gerekmektedir. Ancak bu ifade ile değerin 5V olması yeterli olacaktır. NOLVP: No Low Voltage Programming. İstemediğinde seçilir. CPD: Code Protect Data. Data EEPROM belleğinin korumalı olması istendiğinde seçilir. NOCPD: No Code Protect Data. EEPROM belleği koruması istenmediğinde kullanılır. NOWRT: Program Hafızası yazmaya korumalı değil. NOWRTD: Data EEPROM hafızası yazmaya korumalı değil. PROTECT: Program belleğine (ROM) yazılan verilerin okunmasını engeller. PROTECT_5%: ROM belleğin %5’lik kısmını okumaya karşı korur. PROTECT_50%: ROM belleğin %50’lik kısmını okumaya karşı korur. NOPROTECT: ROM belleği okumaya karşı koruma koymaz. BROWNOUT: Aktif edildiğinde Vdd gerilimi Vbor (Brown out reset) gerilimin değerinden yaklaşık 4V aşağı düşerse ve bu yaklaşık 100 mikrosaniye sürerse BOR aktif olur ve PIC’i sıfırlar. NOBROWNOUT: DEBUG: Debug modu gereklidir. 4. Ön bilgi kısmında verilen örnek uygulamadaki setup_xxx() fonksiyonlarının işlevlerini ve kullanım şeklini açıklayınız. (10p) setup_xxx() fonksiyonları, PIC mikrodenetleyicilerde kullanılan ve donanımın başlangıç ayarlarını yapılandırmak için tasarlanmıştır. Örneğin, bir ADC (AnalogDigital Converter) modülü için setup_adc() fonksiyonu, ADC modülünü başlatmak ve çeşitli özelliklerini ayarlamak için kullanılır. Bu fonksiyon, ADC'yi kullanmadan önce gerekli yapılandırmaları yapar. #include <xc.h> // PIC donanım tanımları void main() { // PIC donanımını başlat // ... // ADC yapılandırmasını yap setup_adc(); // ADC'yi başlat Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı // Ana işlem döngüsü while (1) { // ADC'den veri oku ve işle // ... } } 5. CCS C dilinde bit düzeyi işlemlerini (bitwise operations) ve kullanım şekillerini açıklayınız. (15p) &=AND işlemini yapar. |=OR işemi yapar ^.XOR işlemi yapar. ~=Terseleme yapar. <<=biti sola kaydırır. >>=biti sağa kaydırı. 6. Keypad tarama uygulaması için gerekli tanımlamaları yaparak sadece ilk satırı tarayan ve basılan tuş değerini “tus” değişkenine kaydeden kod parçasını yazınız. (15p) #include <16F877A.h> #device adc=10 #fuses XT,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) // Keypad bağlantıları için tanımlamalar #define KEYPAD_ROWS 4 #define KEYPAD_COLS 4 #define ROW_PORT getenv("SFR:PORTD") // Satır portu tanımı #define COL_PORT getenv("SFR:PORTC") // Sütun portu tanımı #define ROW_MASK 0xF0 // Satır maskesi #define COL_MASK 0x0F // Sütun maskesi // Keypad tuşları char keys[KEYPAD_ROWS][KEYPAD_COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; // Keypad tarama fonksiyonu char keypad_scan() { int row, col; char key_pressed = 0; Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı // Satırları tara for (row = 0; row < KEYPAD_ROWS; row++) { output_d(ROW_MASK | (1 << (4 + row))); // İlgili satırı 1 yap delay_us(10); // Bir miktar gecikme col = input_c() & COL_MASK; // Sütun durumunu oku if (col != COL_MASK) { // Eğer bir tuş basıldıysa key_pressed = keys[row][col]; // Basılan tuşu al break; } } return key_pressed; // Basılan tuş değerini döndür } void main() { char tus; while (TRUE) { tus = keypad_scan(); // Keypad'i tarayıp basılan tuşu al if (tus) { // Eğer bir tuş basıldıysa printf("Basilan Tus: %c\n", tus); // Basılan tuşu yazdır delay_ms(500); // Bir süre bekle } } } 7. 7 segment displayde (ortak katot) ‘0’dan ‘9’ a tüm rakamları göstermek için D portuna gönderilmesi gereken değerleri binary ve hexadecimal formatta yazınız. Ve bir dizi içerisinde bulunduğu indise ait rakamı gösterecek şekilde tanımlayınız. (15p) Rakam Binary (D Port Değeri) 0 0b00111111 0x3F 1 0b00000110 0x06 2 0b01011011 0x5B 3 0b01001111 0x4F 4 0b01100110 0x66 5 0b01101101 0x6D 6 0b01111101 0x7D 7 0b00000111 0x07 8 0b01111111 0x7F 9 0b01101111 0x6F Hexadecimal (D Port Değeri) Aşağıdaki gibi bir dizi içinde, her rakamın bu değerlere karşılık geldiği bir gösterim oluşturabiliriz: #include <stdint.h> Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı // 7 segment displayde gösterilecek rakamların D portuna gönderilmesi gereken değerleri const uint8_t segment_values[10] = { 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111 // 9 }; 8. “sure” değişkende programın başlangıcından itibaren geçen zamanın saniye biriminden tutulduğunu düşünerek sure değişkeninden; Saniye ve dakika bilgisini (Örn: sure=137, dakika=2, saniye=17) saniye ve dakika bilgisinin onlar ve birler basamağını (Örn: dakika=2, d_birler=2, d_onlar=0, saniye=17, s_birler=7, s_onlar=1) oluşturan kod parçasını yazınız. (15p) int sure = 137; int dakika = sure / 60; int saniye = sure % 60; int d_onlar = dakika / 10; int d_birler = dakika % 10; int s_onlar = saniye / 10; int s_birler = saniye % 10; printf("Dakika: %d\n", dakika); printf("Dakika Onlar Basamağı: %d\n", d_onlar); printf("Dakika Birler Basamağı: %d\n", d_birler); printf("Saniye: %d\n", saniye); printf("Saniye Onlar Basamağı: %d\n", s_onlar); printf("Saniye Birler Basamağı: %d\n", s_birler); Bursa Teknik Üniversitesi Elektrik-Elektronik Mühendisliği Bölümü Mikroişlemciler Laboratuvarı