1 BLGM423 Gömülü Sistem Tasarımı İkinci Çalışma Sayısal giriş ucunun çeşitli konum ve hareketlerini algılama Bu çalışmada tipik bir anahtara bağlanmış olarak kullanılan sayısal giriş ucundaki konum ve değişimleri algılayacağız. Bir anahtarın bir giriş ucuna bağlanması SPST (tek kutup tek atım) anahtar ve buton anahtar iki uçlu elle-anahtarlama elemanlarıdır. Bir SPST anahtarı ya da butonu işlemcinin giriş ucuna bağlarken kullanılan iki yaygın yöntemden birincisi anahtarın bir ucunu port girişine diğer ucunu toprağa bağlamaktır. Bu durumda anahtar devreyi kapatınca port girişi sıfır okur. Anahtar devreyi açınca 1 port girişindeki gerilimin yükselebilmesi için port girişinden kaynak gerilimine uygun değerde bir direnç (örneğin 10kOhm) yerleştirilir. Diğer yöntemde ise, anahtarın bir ucu port girişine, öbür ucu kaynak gerilimine bağlanır. Bu durumda anahtar devresi kapalıyken port ucundaki gerilim yüksektir ve porttan 1 okunur. Portun anahtar açıldığında sıfır okumasına sağlamak üzere de giriş ucu uygun bir dirençle (10k civarı) topraklanır. Bir ucu toprakta olan anahtar, devreden uzakta bile olsa bağlantı hatlarının biri toprakta olduğundan devreye ilettiği gürültü bir ucu gerilim kaynağında olma durumuna nazaran daha azdır. Biz devrelerimizde özel bir neden yoksa ucu topraklanmış anahtarları tercih edeceğiz. Anahtar durumunu ve değişimini okuma Diyelim ki diğer ucu toprağa bağlı bir anahtarı işlemcinin portlarından birine bağladık ve gömülü sistemimizin zaman tabanında düzenli olarak okuyup anahtarın çeşitli durumları ve bu durumlardaki değişimleri algılayarak gereken işleri yapmak istiyoruz. Öncelikle algılayabileceğimiz durumlarla tanışalım. Yazdığımız kod, anahtara daha ana döngüye girmeden bakıyorsa daha sonra açıp kapamanın çalışmaya etkisi olmaz. Bu kullanımı anahtar 0. dereceden algılanıyor olarak niteleyebiliriz. Gömülü sistem kodu anahtarın durumuna ana döngü içinde her gerektiğinde bakıyorsa, ve her seferinde açık ya da kapalı olmasına göre gereken işleri yapıyorsa bu kullanımı 1. dereceden algı olarak niteleyebiliriz. Anahtarın yalnızca açık ya da kapalı olmasına göre değil, açıktan kapalıya ya da kapalıdan açığa durum değiştirdiğinde gereken işleri yapmak üzere kullanılması tipik 2. dereceden algı olarak nitelenebilir.
2 Daha üst dereceden algıya, örneğin 3. dereceye örnek olarak anahtarın kapalı kaldığı süreyi de sayıp, anahtar açıldığında, mesela kapalı kaldığı süre 3 saniyeyi geçmemiş ise yapılmasını örnek verebiliriz. Böyle bir düğme yanlışlıkla basıldığında biraz uzun basılı tutarak işin iptal edilmesini, ya da farklı süreler için farklı işler yapılmasını sağlayabilir. Bu çalışmada bir port giriş ucuna bağlı bir buton anahtarın birinci, ikinci ve üçüncü derecede algılanmasına örnekler vereceğiz. Kullanacağımız devre Birinci bölüm sonunda oluşturduğumuz devreyi bu çalışmada kullanmaya devam edeceğiz. Anahtarın çeşitli durumlarını veya hareketlerini algıladığımızda yapılacak iş olarak bir sayıyı arttıracağız, ve sayıyı her döngüde PORTCden çıkaracağız. Birinci Bölüm: 1. dereceden anahtar koşulu algısı Bu çalışmanın amacı, BT1 ve BT2 butonlarından 1- BT1 basılı (kapalı devre) olduğu sürece sayi yı her döngüde arttırmak, 2- BT2 bırakılmış (açık devre) olduğu sürece sayi yı her döngüde arttırmak, ve her döngü sonunda sayıyı RC0... RC7 çıkış portu uçlarından çıkararak görebilmemizi sağlamaktır. Kodda yapılması gereken işleri şöyle sayabiliriz. i. BT1 ve BT2 nin durumuna bağlı olarak arttırılacak sayi ile, yakıp söndüreceğimiz LED gösterge için yaksondursayac ı tanımla (Satır- 7) ii. ana döngünün zaman tabanı için sure adlı sayacı tanımla (satır-8) iii. yaksondur() prosedürünü tanımla (satır 9-12) iv. Ana programda giriş çıkışları yapılandır (satır 14-18)
3 v. Ana döngüye girmeden yaksondursayac ve sayiyı sıfırla Ana döngüde vi. vii. viii. ix. BT1 basılıysa sayıyı arttır (satır-21). BT2 bırakılmışsa sayıyı arttır (satır-22) Sayiyı PORTC ye yolla. yaksondur() prosedürünü çağırıp LED i yak. x. 0.1 saniye bekle ve ana döngüyü tekrarla Bu işleri yapan aşağıdaki C programını D2A.C adıyla yazıp derleyebiliriz. 1. // LED durum gostergesi 2. // Amac: BT1 ve BT2 yi 3. // 1.Basılı durumda sayıyı arttırmak uzere 4. // 2.Tam basildigi anda sayiyi arttirmak uzere 5. // kullanmak ve sayıyı C portundan cıkarmak 6. // 7. char yaksondursayac,sayi; 8. int16 sure; 9. void yaksondur(void){ 10. if(yaksondursayac==0) PORTB.0=0; // LED yandi 11. else PORTB.0=1; 12. yaksondursayac++; if(yaksondursayac>9) yaksondursayac=0;} 13. void main(void){ 14. //Yapilandirma 15. TRISB.0=0; // RB0'i cikis yaptik 16. TRISB.1=1; // RB1'i giris yaptik 17. TRISB.2=1; // RB2'i giris yaptik 18. TRISC=0; // RC portu cikis oldu 19. yaksondursayac=0; sayi=0; 20. do{ 21. if(!portb.1){sayi++;}//bt1 basiliysa sayi artti 22. if(portb.2){++sayi;} //BT2 basili degilse sayi artar 23. PORTC=sayi; 24. yaksondur(); 25. sure=14285; do{}while(--sure);// 0.1 saniye bekle 26. }while(1); 27. } Hex kodunu ISISteki devrede çalıştırmadan önce işlemcimizin osilatör frekansının 4MHz, watchdog timer seçeneği off olmalı, program koduna D2A.hex ı bağlamalıyız. ISIS simulasyonu penceredeki görsel durumu her 50ms de bir güncellediğinden 10 ms de bir artan sayaç ve port çıkışı ekranda dört-beş artışa neden olur. Düğmeler basılı ve bırakılmışken PORTC çıkışındaki artışları daha kolay gözlemek üzere işlemcinin hızını 10 kez düşürebiliriz. Bunun için işlemcinin properties penceresinde osilator frekansı kutusuna 0.4MHz yazmamız yeterlidir. Böylece döngüdeki kod, butonu saniyede bir kez okuyup gereğini yapacaktır. İkinci Bölüm: 2. dereceden anahtar koşulu algısı Bu çalışmanın amacı, sayıyı BT1 ve BT2 butonlarından 1- BT1 basıldığı an (eskiden açık devreyken son okunuşta kapalı devre olduğunda) arttırmak,
4 2- BT2 bırakıldığı an (eskiden kapalı devreyken son okunuşta açık devre) olduğunda) arttırmak, ve her döngü sonunda sayıyı RC0... RC7 çıkış portu uçlarından çıkararak görebilmemizi sağlamaktır. Kodda yapılması gereken değişiklikleri şöyle sayabiliriz. 1- Anahtar durum değişikliğini algılamak için anahtarın hem önceki hem de son okunan durumuna bakmamız gerekir. Önceki durumu için eskiport, son durumu için yeniport adında iki yeni değişken kullanacağız. 2- Ana döngüye girmeden yeniportun değerini PORTB den okuyarak başlatacağız. 3- Döngünün başında yeniport u eskiport a aktarıp PORTB yi eskiport a okuyacağız (satır 21). 4- BT1 in basıldığı an eskiportun bit-1i 1 ve hem de yeniportun bit-1i 0 okunur. Bu koşul sağlanırsa sayi yı bir arttıracağız (satır 22-23). 5- BT2 nin bırakıldığı an için eskiportun bit-2 si 0, yeniport un bit-2si 1 olduğunda sayiyı arttıracağız (satır 24-25). Programı D2B.C dosyasına yazıp derlediğimiz D2B.hex dosyasını işlemciye bağlamalıyız. İşlemcinin watchdog timer opsiyonu off olmalıdır. 1- // LED durum gostergesi 2- // Amac: BT1 ve BT2yi 3- // 3.Basildigi anda sayiyi arttirmak uzere 4- // 2.Birakildigi anda sayuyu artturmak uzere 5- // kullanmak ve C portundan cikarmak 6- // 7- char yaksondursayac,sayi,eskiport,yeniport; 8- int16 sure; 9- void yaksondur(void){ 10- if(yaksondursayac==0) PORTB.0=0; // LED yandi 11- else PORTB.0=1; 12- yaksondursayac++; if(yaksondursayac>9) yaksondursayac=0;} 13- void main(void){ 14- //Yapilandirma 15- TRISB.0=0; // RB0'i cikis yaptik 16- TRISB.1=1; // RB1'i giris yaptik 17- TRISB.2=1; // RB2'i giris yaptik 18- TRISC=0; // RC portu cikis oldu 19- yaksondursayac=0; sayi=0; yeniport=portb; 20- do{ 21- eskiport=yeniport; yeniport=portb; 22- if(!yeniport.1 && eskiport.1) 23- {sayi++;}//bt1 basildigi anda sayi artti 24- if(yeniport.2 &&!eskiport.2) 25- {++sayi;}//bt2 basili degilse sayi artar 26- PORTC=sayi; 27- yaksondur(); 28- sure=14285; do{}while(--sure);// 0.1 saniye bekle 29- }while(1); 30- }
5 Üçüncü Bölüm: 3. dereceden anahtar koşulu algısı Bu çalışmanın amacı, BT1 butonu bırakıldığı an, eğer üç saniyeden az basıldıysa sayiyı arttırmak, üç saniyeyi geçtiyse sayıyı arttırmamaktır. Ayrıca her döngü sonunda sayıyı RC0... RC7 çıkış portu uçlarından çıkararak görebilmemizi sağlayacağız. Kodda yapılması gereken değişiklikleri şöyle sayabiliriz. 1- Anahtar durum değişikliğini algılamak için eskiport ve yeniport değişkenlerinin yanı sıra basılı kaldığı üç saniye süreyi sayacak ucsan değişkenine ihtiyaç var. 2- Ana döngüye girmeden yeniportun değerini PORTB den okuyarak başlatacağız. 3- Döngünün başında yeniportu eskiport a aktarıp PORTB yi eskiport a okuyacağız (satır 21). 4- BT1 in basıldığı an uçsanı sıfırlayacağız (satır 22-23). 5- BT1 basıldığı sürece ücsanı arttırıp 0.1 saniyeleri sayacağız (satır 24). 6- BT1 bırakıldığında an uçsan<30 ise sayiyı arttıracağız (satır 22-23). Programı D2C.C dosyasına yazıp derleyince oluşan D2C.hex dosyasını işlemciye program kodu olarak tanıtmalıyız. 1- // LED durum gostergesi 2- // Amac: BT1 ve BT2yi 3- // 5. Birakildigi anda sayiyi arttirmak uzere 4- // ama 3 saniye gecerse arttirmamak uzere 5- // kullanmak ve C portundan cikarmak 6- // 7- char yaksondursayac,sayi,eskiport,yeniport,ucsan; 8- int16 sure; 9- void yaksondur(void){ 10- if(yaksondursayac==0) PORTB.0=0; // LED yandi 11- else PORTB.0=1; 12- yaksondursayac++; if(yaksondursayac>9) yaksondursayac=0;} 13- void main(void){ 14- //Yapilandirma 15- TRISB.0=0; // RB0'i cikis yaptik 16- TRISB.1=1; // RB1'i giris yaptik 17- TRISB.2=1; // RB2'i giris yaptik 18- TRISC=0; // RC portu cikis oldu 19- yaksondursayac=0; sayi=0; eskiport=portb; 20- do{ 21- eskiport=yeniport; yeniport=portb; 22- if(!yeniport.1 && eskiport.1) 23- {ucsan=0;}//bt1 basildigi anda ucsani saymaya basla 24- if(!yeniport.1) ucsan++; // basiliysa ucsani arttir 25- if(yeniport.1 &&!eskiport.1)//bt1 birakilinca 26- {if(ucsan<30)++sayi;} // hem de ucsan<30 ise sayiyi arttir 27- PORTC=sayi; 28- yaksondur(); 29- sure=14285; do{}while(--sure);// 0.1 saniye bekle 30- }while(1); 31- }
6 Deney Sonrası Raporu Deney sonunda kalan sürede programı aşağıdaki işleri yapacak biçime getirmeniz istenecektir. 1- Raporunuza BLGM423 Deney 2 Raporu başlığını, ve hemen aşağısına Hazırlayan:.......... satırında adınız, soyadınız ve öğrenci numaranızı yazın. 2- Son programa gerekli değişiklikleri yaparak oluşturacağınız D2D.C programına BT1 butonu bırakılınca sayiya char olarak tanımlı ve içinde 1 olan artis değerinin eklenmesini sağlayın. Eğer buton bırakıldığında 3 sanıyeden uzun basılmışsa, sayıya artısı eklemek yerine artıs=-artıs yapın ki artısın değeri 1 ise -1, -1 ise 1 olsun. Böylece bir düğmeyle sayıyı hem arttırmak hem de azaltmak mümkün olsun. Program başlığı altında programınızı ve Test Prosedürü başlığı altında devrenin nasıl test edilebileceğini raporunuza yazın. Raporunuza bu deneyden öğrendiklerinizi belirten bir sonuç bölümü yazın ve BLGM423LAB@GMAIL.COM adresine deneyin yapıldığı gün içinde yollayın.