Adı Soyadı - Bilecik Şeyh Edebali Üniversitesi Bilgisayar Mühendisliği
Transkript
Adı Soyadı - Bilecik Şeyh Edebali Üniversitesi Bilgisayar Mühendisliği
Adı Soyadı: No: Bilecik Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü Mikroişlemcili Sistemler Ara Sınav II. (05.11.2011) Aşağıdaki şekilde bir kronometre uygulaması verilmiştir. Sayma işlemi 4 dört sekmeli displayde gösterilmektedir. Sağdan ilk 2 sekme saniyeyi sonraki 2 sekme dakikayı göstermektedir.Saniye sekmesi 1sn de bir artmakta (TIMER2 kullanılacak) ve 59. sn den sonra sıfırlanmakta dakika sekmesi 1 artmaktadır. Dakika sekmesi 59 a ulaşınca sayma işlemi sıfırlanmaktadır. RB0/INT pinine bağlı Start/Stop butonuna basınca kronometre sayma işlemi durmakta tekrar basınca saymaya devam etmektedir. RA4/T0CKI pinine bağlı İleri butonuna sırayla 4 defa basınca (TIMER0 kullanılacak) kronometre ileri sayma moduna geçmekte, RC0/T1OSO/T1CKI pinine bağlı geri butonuna sırayla 4 defa basınca (TIMER1 kullanılacak) kronometre geri sayma moduna geçmektedir. Aşağıdaki hususları da dikkate alarak sistemin C kodunu yazınız (100p) • Kristal frekansı 4 Mhz • Kronometre sayma işleminde 1sn lik zamanlayıcı olarak TIMER2 kullanılacak • (RB0/INT) butonu kesmeli çalışacak : Kronometreyi Start /Stop yapacak • (RA4/T0CKI) TIMER0 sayıcı girişi : Butona 4 defa basınca kronometre ileri sayma moduna geçecek ve D2 LED yanacak • (RC0/T1CKI) TIMER1 sayıcı girişi : Butona 4 defa basınca kronometre geri sayma moduna geçecek ve D1 LED yanacak • (RB4) butonu kesmeli çalışacak : Butona her basınca saniye 1 artırma yapacak • (RB5) butonu kesmeli çalışacak : Butona her basınca saniye 1 azaltma yapacak • (RB6) butonu kesmeli çalışacak : Butona her basınca dakika 1 artırma yapacak • (RB7) butonu kesmeli çalışacak : Butona her basınca dakika 1 azaltma yapacak • Displeyler 74LS48 entegresi ile sürülecek • Displayler (Common Catode) ortak katot yapıda, seçme girişleri(1234) aktif "0" olacak yani seçmek istediğiniz dipleye "0" göndereceksiniz. +5V C1 R13 R15 R17 R18 10k 10k 10k 10k R3 10k R21 R22 10k 10k X1 22pF +5V 8 9 10 R1 10k RESET RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7 15 16 17 18 23 24 25 26 Dakika 19 20 21 22 27 28 29 30 D2 R86 R89 220 220 D1 İleri Sayıcı İleri Butonu RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA4/T0CKI RA5/AN4/SS RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RE0/AN5/RD RC2/CCP1 RE1/AN6/WR RC3/SCK/SCL RE2/AN7/CS RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT 33 34 35 36 37 38 39 40 Geri Butonu RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD Saniye + 2 3 4 5 6 7 OSC1/CLKIN OSC2/CLKOUT MCLR/Vpp/THV Saniye - 22pF Dakika + U1 13 14 1 Dakika - C2 Start / Stop Butonu CRYSTAL FREQ=4MHz Saniye Geri Sayıcı PIC16F877 U2 7 1 2 6 4 5 3 A B C D BI/RBO RBI LT 7x220 Ohm QA QB QC QD QE QF QG 13 12 11 10 9 15 14 74LS48 +5V Süre: 65 dk. BAŞARILAR Yrd.Doç. Dr. Metin KESLER /****************************************************** Bilecik Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü Mikroişlemcili Sistemler Ara Sınav II. Cevap (05.11.2011) *******************************************************/ #include <16f877A.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor. //***********Denetleyici konfigürasyon ayarları************ #fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD #use delay(clock=4000000) // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor #use fast_io(a) // Port yönlendirme komutları a portu için geçerli #use fast_io(b) // Port yönlendirme komutları b portu için geçerli #use fast_io(c) // Port yönlendirme komutları d portu için geçerli #use fast_io(d) // Port yönlendirme komutları d portu için geçerli #define #define #define #define #define #define arttirSn pin_b4 // arttir butonu pin_b4 ile eşleniyor azaltSn pin_b5 // azalt butonu pin_b5 ile eşleniyor arttirDk pin_b6 // arttir butonu pin_b6 ile eşleniyor azaltDk pin_b7 // azalt butonu pin_b7 ile eşleniyor LED_Geri pin_c6 LED_Ileri pin_c7 #define dspBirler #define dspOnlar #define dspYuzler #define dspBinler 0b01110000 0b10110000 0b11010000 0b11100000 char IleriGeri=1,StartStop=0,Sn=0,Dk=0,birler=0, onlar=0,yuzler=0,binler=0,counter=0; // int tipinde değişkenler tanımlanıyor // Ortak katot display için veri değerleri const int digit[10]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}; /********* KESME FONKSİYONLARI ********/ #INT_EXT void Int_External() { StartStop=!StartStop; // veya if (StartStop) StartStop=0 else StartStop=1; if(StartStop) { setup_timer_2(T2_DIV_BY_16,255,16); // Timer2 ayarları yapılıyor enable_interrupts(INT_timer2); // int_timer2 kesmesini aktif yapar } else { setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı disable_interrupts(INT_timer2); // int_timer2 kesmesini pasif yapar } } #INT_RB void Int_RBChange() { if (!input(arttirSn)) // arttır butonuna basıldığında { Sn++; // Sn değerini 1 arttır if (Sn>=60) {Dk++;Sn=0;} // Sn kontrolü yapılıyor birler=Sn%10; onlar= Sn/10; yuzler=Dk%10; binler=Dk/10; } if (!input(azaltSn)) // azalt butonuna basıldığında { Sn--; // Sn değerini 1 arttır if (Sn<=0) {Dk--;Sn=59;} // Sn kontrolü yapılıyor birler=Sn%10; onlar= Sn/10; yuzler=Dk%10; binler=Dk/10; } if (!input(arttirDk)) // arttır butonuna basıldığında { Dk++; // Sn değerini 1 arttır if (Dk>=60) {Dk=0;Sn=0;} // Dk kontrolü yapılıyor birler=Sn%10; onlar= Sn/10; yuzler=Dk%10; binler=Dk/10; } if (!input(azaltDk)) // azalt butonuna basıldığında { Dk--; // Sn değerini 1 arttır if (Dk<=0) {Dk=59;Sn=59;} // Dk kontrolü yapılıyor birler=Sn%10; onlar= Sn/10; yuzler=Dk%10; binler=Dk/10; } } #INT_TIMER0 // Timer0 kesmesi void timer0_kesme () // Kesme fonksiyonu ismi { clear_interrupt(int_timer0); set_timer0(254); // TMR0 değeri belirleniyor output_high(LED_Ileri); output_low(LED_Geri); IleriGeri=1; } #INT_TIMER1 // Timer1 kesmesi void timer1_kesme () // Kesme fonksiyonu ismi { clear_interrupt(int_timer1); set_timer1(65532); // TMR1 değeri belirleniyor output_low(LED_Ileri); output_high(LED_Geri); IleriGeri=0; } #INT_TIMER2 // Timer2 kesmesi void timer2_kesme () // Kesme fonksiyonu ismi { clear_interrupt(int_timer2); set_timer2(0); // TMR2 PRD değeri belirleniyor counter++; if (counter >=20) //couter*0.050176sn=20*0.050176sn= 1.00352 sn de bir sayma işlemi yapacak { counter=0; if(IleriGeri) { Sn++; // Sn değerini 1 arttır if (Sn>=60) {Dk++;Sn=0;} // Sn kontrolü yapılıyor if (Dk>=60) {Dk=0;Sn=0;} birler=Sn%10; onlar= Sn/10; yuzler=Dk%10; binler=Dk/10; } else { Sn--; // Sn değerini 1 arttır if (Sn<=0) {Dk--;Sn=59;} // Sn kontrolü yapılıyor if (Dk<=0) {Dk=59;Sn=59;} birler=Sn%10; onlar= Sn/10; yuzler=Dk%10; binler=Dk/10; } } } /********* ANA PROGRAM FONKSİYONU********/ void main () { setup_psp(PSP_DISABLED); // PSP birimi devre dışı setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok setup_adc(ADC_OFF); // ADC birimi devre dışı setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı set_tris_a(0xFF); // A portu tümüyle giriş olarak yönlendiriliyor set_tris_b(0xFF); // B portu tümüyle giriş olarak yönlendiriliyor set_tris_c(0x0F); // C portu ilk4 giriş ve Son4 çıkış olarak yönlendiriliyor set_tris_d(0x00); // D portu tümüyle çıkış olarak yönlendiriliyor output_d(0x00); output_c(0x00); setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_2); // Timer0 ayarları yapılıyor (RTCC_DIV_BY_2 * 256-254)=2*2=4 pulse gelince kesme oluşturacak set_timer0(254); // TMR0 değeri belirleniyor setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1); // Timer1 ayarları yapılıyor set_timer1(65532); // TMR1 değeri belirleniyor (T1_DIV_BY_1 * 65536-65532)=4 pulse gelince kesme oluşturacak setup_timer_2(T2_DIV_BY_16,196,16); // Timer2 ayarları yapılıyor Tkesme=1us*T2_DIV_BY_16*196*16=1us*50176=0.050176sn de kesme oluşacak set_timer2(0); enable_interrupts(INT_timer0); // int_timer0 kesmesini aktif yapar enable_interrupts(INT_timer1); // int_timer1 kesmesini aktif yapar // enable_interrupts(INT_timer2); // int_timer2 kesmesini aktif yapar //#int_ext kesmesi içinde aktif pasif yapılıyor ext_int_edge(H_TO_L); enable_interrupts(INT_EXT); enable_interrupts(INT_RB); enable_interrupts(GLOBAL); while(1) // Sonsuz döngü { birler=Sn%10; onlar= Sn/10; yuzler=Dk%10; binler=Dk/10; output_d(digit[birler]|(dspBirler)); // 1.display aktif, diğer displeyler pasif ve birler basamağı gönderiliyor delay_ms(5); // Gecikme veriliyor output_d(digit[onlar]|(dspOnlar)); // 2.display aktif, diğer displeyler pasif ve onlar basamağı gönderiliyor delay_ms(5); // Gecikme veriliyor output_d(digit[Yuzler]|(dspYuzler)); // 3.display aktif, diğer displeyler pasif ve yuzler basamağı gönderiliyor delay_ms(5); // Gecikme veriliyor output_d(digit[Binler]|(dspBinler)); // 4.display aktif, diğer displeyler pasif ve binler basamağı gönderiliyor delay_ms(5); // Gecikme veriliyor } }
Benzer belgeler
Display Uygulaması-3(Kesme Yöntemi Kullanarak 7448 Entegresi
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RE0/AN5/RD
RC2/CCP1
RE1/AN6/WR
RC3/SCK/SCL
RE2/AN7/CS
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
butonu kesmeli çalışacak:butona basınca birler basamağı
RA0/AN0
RA1/AN1
RA2/AN2/VREFRA3/AN3/VREF+
RA4/T0CKI
RA5/AN4/SS
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RE0/AN5/RD
RC2/CCP1
RE1/AN6/WR
RC3/SCK/SCL
RE2/AN7/CS
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
UYGULAMA 4 DEVRE BAĞLANTISI VE ĠSTENENLER
RA4/T0CKI
RA5/AN4/SS
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
RE0/AN5/RD
RC2/CCP1
RE1/AN6/WR
RC3/SCK/SCL
RE2/AN7/CS
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT