Uploaded by Enes Musapasaoglu

Ön Hazırlık SON HALİ

advertisement
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ı
Download