PIC Assembly Ders 5 7 Segment Display Kullanımı Ve LOOK-UP (dönüşüm tablosu) oluşturma Bu dersimize kadar bahsettiğimiz örneklerde mikrodenetleyicimizin dış dünyaya gönderdiği komutları mikrodenetleyicinin ilgili bacağına led bağlayarak devremizi oluşturmuştuk. Ledi bağlamamızdaki amaç görsel olarak bize bazı anlamlar ifade etmesiydi örneğin problemimizde mikrodenetleyicinin bir sistemi açıp kapadığını varsayarsak biz bu sistemi led kullanarak modellemiştik (klimayı aç/kapa örneğini hatırlayabilirsiniz). Bu modellemenin dışında led ler bize bazı sayısal anlamlar da ifade edebilmekteydi, yine bizden çözmemiz beklenen probleme bağlı olarak yanan led sayısı yada sırası bizim için mikrodenetleyicinin dış dünyaya verdiği çıktı idi. Mikrodenetleyicimizi kullanarak bir dijital sayaç programı yazmamızın istendiğini varsayın..yazdığımız programda çıkış olarak doğrudan rakamları ifade edebilmemiz gerekiyor. Örneğin sayaçta 8 ifade edebilmek için mikrodenetleyici 8 i belirtecek bazı çıkış vermeli. Peki bu 8 rakamını ifade tarzları nasıl olabilir? Mikrodenetleyicinizin çıkışına bağladığınız ledlerin 8 tanesini yakarak kullanıcıya sayacın 8 olduğunu belirtebilirsiniz. Tabi kullanıcının sayacın 8 de olduğunu anlaması için kaç tane ledin yandığını sayması gerekecek.
8 sayısını ikilik sisteme çevirip, yanan ledlerin kaçıncı sırada olduklarına göre ikilik sistemde hesaplayabilirsiniz. Bu durumda kullanıcının sayacın 8 de olduğunu bilmesi için ikilik sistemi 10luk sisteme çevirebiliyor olması lazım. Geldik en kolay yönteme, ledleri 8 sayısını oluşturabilecek şekilde dizip yakarsınız. Böylece kullanıcı herhangi bir zihinsel işlem yapmasına gerek kalmadan sizin ifade ettiğiniz rakamın kendisini görecektir. 7 segment display kullanımı da bu noktdan çıkmıştır. Kullanıcıya doğrudan rakamları ifade edebilmektedir. Şekilde de görüldüğü gibi 7 segment, (adından da anlaşılacağı gibi) 7 parçadan oluşmuş ledler topluluğudur. Bu 7 farklı ledlerin yanma kombinasyonuna göre farklı rakamlar oluşmaktadır.
Şimdi led lerin yapısından basitçe bahsedelim. Bildiğiniz gibi ideal olarak Led (Light Emitting Diode ) in anotu ve katatu arasına Pozitif gerilim uygularsanız led ışık vermeye başlar. Verdiği ışığın parlaklığı da led in üzerinden geçen akımla orantılıdır. Mikrodenetleyicimizden +5Volt verdiğimizde yanan ledleri nasıl sürdüğümüze bir bakalım. +5V gelince Anot ve katot arasında pozitif bir gerilim oluşmakta ve led yanmakta. Görüldüğü gibi kullandığımız ledlerin katot bacağı ortak olarak toprağa gitmekte. Bu tüm bacaklar toprak hattında birleşmekte.
Bir başka şekilde mikrodenetleyicimizden 0 V verdiğimiz ledleri nasıl yakabileceğimize bakalım. Bu sefer de tüm ledlerin anotlarının ortak olarak +5V a bağlandığını görebilirsiniz. 7 Segment üreticileri Bu 7 farklı ledi tek bir paket içerisinde ürettikleri için bu ortak bacakları (anot veya katot) üretim aşamasındayken birbirine bağlayıp sadece ortak bacak olarak 7 segment paketine koymuşlardır. Bunlar nasıl olsa birleşeceği için her led için iki bacak koymak boş yere alan israfı oluşturacaktı.
7 Segmentler hangi bacaklarının ortak olduğuna göre sınıflandırılır. Eğer katot bacakları ortak iste ORTAK KATOT(common cathode), anot bacakları ortak ise ORTAK ANOT (common anode) olarak adlandırılırlar. Ayrıca bazı 7Segmentlerde ondalık noktasını belirtebilmek için nokta da bulunmaktadır. (http://robot.ee.hacettepe.edu.tr/dosyalar/makaleler/9_geri_sayim_cihazi.pdf adresindeki makalemizde de 7segmentler anlatılmıştır makalemizden de faydalanabilirsiniz.) Ortak Katotlu 7 segment kullanarak bazı rakamları oluşturalım: Her bacağın sorumlu olduğu bir kısım mevcuttur. 8 sayısını oluşturmak için tüm bacaklara +5V vermeliyiz. 7 rakamını oluşturmak için 7segmentin bacaklarına +5V vermeliyiz.
7 Segmentlerde herhangi bir rakamı gösterebilmek için gördüğünüz gibi 7segment in bazı pinlerini ( ortak katot için 1) (ortak anot için 0) ayarlamamız gerekiyor. Eğer 7 Segmentin tüm bacakları PortB ye bağlı olduğunu düşünürsek 8 sayısı için portb = b 01111111 7 sayısı için portb = b 00000111' 6 sayısı için portb = b'01111101'.... PortB nin alt 7 biti 7 segmentin parçalarını kontrol etmek için kullanılıyor. 8. bit istenirse ondalık noktasına bağlanabilir. Rakamları ifade etmek için gereken Portb çıkışlarının doğrudan sayılarla bir ilişkisi yok. Gördüğünüz gibi bir rakamı ifade edebilmemiz için Portb ye sabit bazı değerleri atamalıyız. Örnek: SAYAC yazmacının içeriği 0 ve 9 arasında değiştiğine göre bu yazmacın içeriğini portb ye bağlı 7segmentte gösteriniz. SIFIRMI MOVFW SAYAC XORLW D 0 BTFSS STATUS,Z GOTO SIFIR_DEGIL MOVLW B 00111111' MOVWF PORTB GOTO DONGU SIFIR_DEGIL MOVFW SAYAC SUBLW D 1 BTFSS STATUS,Z GOTO BIR_DEGIL MOVLW B'00000110' MOVWF PORTB GOTO DONGU BIR_DEGIL MOVFW SAYAC XORLW D 2 BTFSS STATUS,Z GOTO IKI_DEGIL MOVLW B'01011011' MOVWF PORTB GOTO DONGU IKI_DEGIL Sayac içeriğini W ya attıktan sonra 0 sayısıyla W yazmacını XOR(eşit değil) işlemine tabi tutuyoruz. Eğer W sayıya eşit ise işlemin sonucu 0 olacaktır dolayısıyla STATUS,Z biti 1 olacaktır. Eğer W daki değer XOR işlemine girdiği sayıdan farklı ise sonuç 0 olmayacak STATUS,Z biti de 0 olacaktır. Bu sayde STATUS,Z bitini kontrol ederek iki sayının birbirine eşit olup olmadığını da kontrol ettik. XOR işleminden kafası karışanlar eşitliği kontrol etmek için Çıkarma komutunu da kullanabilirler. W dan bir sayıyı çıkardığınızda sonuç 0 ise(status,z=1) çıkarılan sayı w ya eşit demektir. Bu tip kodları SAYAC registerının aralığına göre yazıyoruz. Eğer Hangi sayı olduğunu bulursak 7 segmentte gösterebilmek için gerekli çıkışları portb den yönlendiriyoruz.
Yukarda yaptığımız işlemi tekrar özetleyecek olursak önce SAYAC ın içeriğinin ne olduğunu buluyoruz sonra bulduğumuz sayıyı oluşturacak 7 SEGMENT kısımlarını yakıyoruz. Bu işlem SAYAC yazmacının içerebileceği sayılara göre uzayıp gidiyor. Bu noktada LOOK-UP tablosu bize yardımcı olmak için imdadımıza yetişecektir. LOOK-UP tablosuna geçmeden önce mikrodenetleyicimizin program kodlarını nasıl işlediğine değinelim. ORG 0X08 MOVLW D 4 ;8. program satırı MOVWF SAYAC1 ;9. program satırı MOVLW D 8 ;10. program satırı MOVWF SAYAC2 ;11. program satırı MOVLW D 15 ;12. program satırı MOVWF SAYAC3 ;13. program satırı ORG satırı kendisinden sonra gelen komutun program hafızasında kaçıncı satıra yazılacağını belirttiğini hatırlıyorsunuzdur. Burdaki kodlarımız 8. program satırından başlayarak 13. program satırında son buluyor. Mikrodenetleyici bir komutu işlerken hangi satırı işleyeceğini özel bir yazmaca (PCL program counter low) bakarak karar veriyor. Örneğin PCL in içeriği 8 iken MOVLW D 4 komutunu işliyor. Bu komutu işlemeyi bitirdiği zaman PCL in değerini mikrodenetleyici kendisi 1 arttırıyor ve PCL in içeriği otomatikman 9 oluyor. PIC hangi komutu işleyeceğini bu PCL yazmacına bakarak karar verdiği için 9. program satırını işlemeye koyuyor. PCL her komuttan sonra mikrodenetleyici tarafından 1 arttırıldığı için eğer siz PCL e müdahle etmezseniz yada GOTO veya BTFSS tarzı bir dallanma yoksa bir komutu bitirince bir alttaki komutu işlemeye devam ediyor. Diyelimki PCL e müdahele ediyoruz: ORG 0X08 INCF PCL ;8. program satırı MOVLW D 8 ;9. program satırı MOVWF SAYAC2 ;10. program satırı MOVLW D 15 ;11. program satırı MOVWF SAYAC3 ;12. program satırı PCL in içeriği 8 ise PIC 8. satırdaki komutu işleyecektir. 8. satırda yanda görebileceğiniz gibi INCF PCL komutu var yani PCL i bir arttır. Bu komut PCL in içeriğini bir arttırıp 9 yapacaktır. Ve bir komut işlendiği için mikrodenetleyici kendisi de PCL in içeriğini bir arttıracak böylece PCL in içeriği 10 olacak INCF PCL komutu bitince PCL in değeri böylelikle 10 oldu. Mikrodenetleyici yeni işleyeceği komutu bu yazmaca bakarak seçiyor dediğimize göre mikrodenetleyici artık 10. satırdaki komutu işleyecektir. Bu şekilde 9. program satırını atlamış olduk bu yöntem bizim LOOK-UP(dönüşüm tablosu) oluşturmamızı sağlayacaktır.
Dönüşüm tablosu diyip duruyorsun peki bu ne diyenlerin merakını gidermeden önce bir başka komuttan daha bahsetmemiz gerekiyor. Bu komut da RETLW komutu bu komut MOVLW ve RETURN komutunun birleşmiş halidir. Bildiğiniz gibi bir altprogramdan çıkmak için return komutunu kullanıyorduk, MOVLW komutunu ise W ya bir sabit değer atmak için kullanıyorduk. Böylelikle RETLW komutu bizim W ya bir değer atayıp altprogramdan çıkmamızı sağlayacak. ALTPROGRAM. RETLW D 10 ;W ya 10 atayıp altprogramdan çıkıyoruz. Bu W ya sabit bir değer atama işi Dönüşüm tablosu ve 7Segment Display arasındaki bağlantı hakkında size bir ipucu verebiliyordur. Đlk yazdığımız programa bakarsanız SAYAC ın içeriğine göre önce W ya bir değer atıyorduk sonra da bu değeri PORTB ye atayarak 7Segmentte istediğimiz değerin oluşmasını sağlıyorduk. w ya atama işini artık dönüşüm tablosunda (altprogramda) yapacağız. Nihayet söyledik Dönüşüm Tablosu bir altprogramdır. ANAPROGRAM MOVFW SAYAC CALL DONUSUM_TABLOSU MOVWF PORTB GOTO DONGU DONUSUM_TABLOSU ADDWF PCL RETLW B'00111111' ; 7 segmentte 0 görünmesi için gereken değer RETLW B'00000110' ; 1 RETLW B'01011011' ; 2 RETLW B'01001111' ; 3 RETLW B'01100110' ; 4 RETLW B'01101101' ; 5 RETLW B'01111101' ; 6 RETLW B'00000111' ; 7 RETLW B'01111111' ; 8 RETLW B'01101111' ; 9 Anaprogramda ilk önce W ya SAYAC yazmacının içeriğini atıyoruz ve ardından donusum tablosu altprogramını çağırıyoruz. Bu noktada W nun içeriği SAYAC yazmacının içeriği olduğunu unutmayınız!! Donusum tablosuna girince W ile PCL yazmacını topluyoruz. Yani dolaylı yoldan SAYAC yazmacı ile PCL i toplamış oluyoruz. Bu noktadan sonra sayı vererek gidelim. Örneğin Sayac yazmacının içeriği 0 olsun PCL ile toplayınca PCL in değeri değişmedi. Toplama komutu bitince mikrodenetleyici PCL i bir arttırdı dolayısıyla bir
alttaki komutu işlemeye başladı. Peki bu komutta ne var? 7 segmentte 0 ı (SAYAC YAZMACINI) gösterebilmemiz için gerekli değeri W ya atıp altprogramdan çıkıyoruz. Ana programda kaldığımız yer MOVWF PORTB komutu, bu komut W daki değeri PORTB ye atacaktır böylece 7 segmentte 0 sayısını göstermiş olacağız. Dönüşüm tablosuna girdiğimizde W nun değeri 1 olsaydı yani SAYAC yazmacı 1 olsaydı ne olacaktı? ADDWF PCL komutundan dolayı PCL in içeriği 1 artacaktı.komut işlendiği için de mikrodenetleyici PCL in içeriğini 1 arttırınca toplamda PCL in değeri 2 artmış olacaktı. Bu da demek oluyorki enson işlediğimiz komuttan 2 sonraki komutu işleyeceğiz. Bu noktada da RETLW B. Komutunda 1 sayısını 7 segmentte göstermek için gerekli değeri W ya atıp ana programa geri döneceğiz. Ana programda da w daki değeri Portb ye atıp 7segmentte 1 sayısının görünmesini sağlayacağız. Dönüşüm Tablosunu elbette sadece 7Segmentler için kullanmıyoruz. Dönüşüm tablosu bir değeri başka bir değere çevirmek istediğimiz tüm işlemlerde kullanabiliriz.örneğin yazdığımız programda sinus alma işlemi yaptığımızı varsayalım. ANA_PROGRAM MOVFW DERECE CALL SINUS_DONUSUM_TABLOSU MOVWF SIN_DERECE GOTO BIYERLERE SINUS_DONUSUM_TABLOSU ADDWF PCL RETLW D..... BIRDEN FAZLA 7SEGMENT BAĞLAMA 7 segmentin ne olduğunu ve dönüşüm tablosunun nasıl hazırlanabileceğini öğrendik. Şimdi tekrar dersin başındaki örneğe geri dönelim. Örnekteki sayaç şimdi de 108 değerinde olsun. Kullanıcıya 7Segment vasıtasıyla 108 sayısını nasıl belirtiriz? En rahat yöntem 3 tane 7 segment display kullanarak her rakamı bir 7segmentin göstermesi olacaktır fakat burada ufak bir problem karşımıza çıkabilir. 7 segmentin yapısı gereği 7 tane girişe ihtiyaç vardır ve eğer siz her 7 segmentin sadece 1 rakamı göstermesini istiyorsanız mikrodenetleyicinin 3*7=21 tane bacağına ihtiyacınız olacak.mikrodenetleyicinizdeki bacak sayısı az ise bu sizin için önemli bir problem olacaktır. 7segmentlerin muhatabı insanlar olacağından bu sorunun üstesinden gelebilmek için insanların fark edemeyeceği düzeyde değişiklikler yapabiliriz. Bu sorunu çözmek için sinemalarda kullanılan tekniğin bir benzerini kullanacağız. Bildiğiniz gibi sinema filmlerinde filmin her saniyesinde 24 kare yer almaktadır. Đnsan gözü bir saniyede geçen 24 kare arasındaki aralıkları fark edemiyor ve de görüntüyü kare kare olarak değil de sürekli hareket eden bir biçimde algılıyor.
Birden fazla 7Segmenti bağlarken her 7 segmentin sayıları ifade eden bacaklarını birbirlerine paralel olarak bağlıyoruz. Bu sistemle eğer 1 sayısını görüntüleyecek çıkışları verirsek 3 7Segmentte de 1 sayısı görülecektir. Fakat biz sadece ilk 7segmentte 1 sayısının görülmesini istiyoruz dolayısıyla istediğimiz 7Segmenti çalıştırabilecek bir sistem geliştirmeliyiz. Bu sistemi geliştirmeden önce 7 segmentteki ortak bacağı hatırlayalım. Eğer ortak katot a sahip 7segmentleri kullanıyorsanız ve eğer bu ortak katot 0V a bağlı değilse verdiğiniz giriş ne olursa olsun 7segmentin hiçbir parçası yanmayacak dolayısıyla bu 7segment pasif durumda olacaktır. Kullanacağımız sistemde istediğimiz 7Segmenti pasif yapabilmemiz için bazı 7segmentlerin ortak bacaklarının bağlantısını bir transistor vasıtasıyla keseceğiz.
Önce transistorun ne olduğuna da temel olarak değinmemiz gerekirse NPN tipi bir transistor için eğer Base ile emiter arası 0.6V tan büyük ise Kollektor ve emiter arasında akım geçer yani kollektor ve emiter arasında bir bağlantı oluşur. Fakat Base ile emiter arası 0.6V tan düşük ise Kollektor ve emiter arasında akım geçmeyecek dolayısıyla herhangi bir bağlantı olmayacaktır.(7 segmentleri sürmek için BC337 gibi bir transistör kullanabilirsiniz) Yukarıdaki devrede eğer transistorun base i 0.6V tan büyük ise 7segmentin ortak bacağı toprağa bağlanacak ve 7segment aktif olarak çalışabilecek fakat transistorun base i 0.6Vtan küçük ise 7 segmentin ortak bacağının topraktan bağlantısı kesilecek böylelikle 7 segment pasif duruma geçecektir. Bizim burada yapacağımız işlem bir süre ilk 7 segmenti aktif yapıp display e 1 değerini yazdırmak, ardından ilk 7segmenti pasif 2. 7segmenti aktif yapıp display e 0 değerini yazdırmak yine bir süre sonra son 7 segmenti aktif diğerlerini pasif yapıp displayde 8 değerini göstermek. Aslında olayın sinemada kullanılan sistemle olan benzerliği bu noktada ortaya çıkmaktadır. siz ilk 7segmente 1 değerini yazdırırken diğer 7segmentler boş olacak yani herhangi bir değer görülmeyecek. Đkinci 7segmente 0 yazdırırken de diğer 7segmentlerde hiçbir değer olmayacak. Eğer siz 7segmentlerin tek başına aktif olduğu süreyi insan gözünün fark edebileceği süreden daha kısa bir süre alırsanız, insan gözü 1, 0 ve 8 rakamlarını 3 7segmentte aynı anda görür ve
hepsinin tek tek yandığını fark edemez. Bu sayede toplamda PIC in 10 bacağını kullanarak normalde 21 PIC bacağıyla yapabileceğimiz işlemi gerçekleştirebiliriz. Alıştırmalar: 1) 7 segment display in her segmentini portb nin hangi bacağının kontrol ettiğini belirledikten sonra 0 dan 9 a kadar rakamları ifade edebileceğiniz bir dönüşüm tablosu hazırlayınız. 2) PORTA,0 a bağlı bir butona her basıldığında 7 segmentte gösterilen değeri 1 azaltan PORTA,1 e bağlı bir butona basıldığında da 7segmentte gösterilen değeri 1 arttıran bir program yazınız. 7 segmentte gösterilen ilk değerin 5 olduğunu varsayın. 3) 108 değerini 7 segmentlerle gösterebilecek bir program yazınız 4) ders 3 ün sonundaki alıştırmalarda yaptığınız 6. alıştırmayı 7 segment kullanacak şekilde geliştirin. 7 segmentte göstermeniz gereken değer zaten ARACSAYISI yazmacında olacaktır. Kaynaklar ve ilgili makaleler: Çoklu 7segment displaylerle yapılmış güzel bir geri sayım cihazı örneği için http://robot.ee.hacettepe.edu.tr/dosyalar/makaleler/9_geri_sayim_cihazi.pdf adresindeki makalemizi inceleyebilirsiniz. dersleri yazarken herhangi bir kaynaktan faydalanmadım ama pic programlamayı öğrenirken Orhan altınabaşak ın kitabını takip ettiğim için farkında olmadan bazı yerler benzemiş olabilir