Mersin üniversitesine ait ders notları hazırlayan: ÖĞR. GÖR. A. Osman Yağlıoğlu
“Mikro denetleyici tabanlı kontrol” hakkın da çok detaylı bilgiler bulunmakta çözümleri assembly yazılımları ile örnek devreler soru ve çözümler….
ALT PROGRAMLAR
Alt program nedir ? : Programlamada döngü kadar etkili bir diğer kullanım şekli de alt programlardır. Bu sistemde işlemin birkaç yerinde lazım olan bir program parçasını tekrar tekrar yazmak yerine, bu bölümü bir kez ayrı bir program gibi yazıp, bu parçanın gerekli olduğu yerde programın bu kısmını çağırmak (ya da o kısma atlamak) metodu kullanılır. Bu sadece bir program yazımından kısaltma ile kurtulmak değildir. Bir tablodan istenilen verinin seçilmesi veya programın çok fazla hafıza isteyip işlemcinizin bunu karşılayamadığı durumlarda, alt programlar adeta bir can yeleğidir.
Alt program yazımının bir programı ne kadar kısaltacağını görebilmek için, döngüler kısmında çözülen trafik ışığı öneğini birde alt program kullanarak çözelim.
Örnek 1.1: Bir kavşaktaki trafik ışıklarının aşağıda verilen zaman ve sıra içerisinde çalışması isteniyor. Trafik ışığı olarak led kullanarak gerekli devreyi tasarlayınız ve programını yazınız.
Şekil 1.1: Trafik ışığı sorusu devre şekli
Çözüm: Devre şekli üstte verilmiştir. Yine zamanlama için 200*200=40000 turluk bekleme döngüsünü, 1 saniye olarak kabul ediyoruz.
;Trafik ışığı problemi, ;Lambalar:RB0:Yaya-kırmızı, RB1:Yaya-Yeşil ;RB2:Araç-sarı, RB3:Araç-Yeşil, RB4:Araç-Kırmızı ;Süre ve durumlar ;15 sn Araç-Yeşil,Yaya-Kırmızı ;5 sn Araç-Sarı,Yaya-Kırmızı ;15 sn Araç-Kırmızı,Yaya-Yeşil ;15 sn Araç-Sarı-Kırmızı,Yaya-Kırmızı LIST P=16F84 ; Registerler STATUS EQU 3h PORTA EQU 5h PORTB EQU 6h TRISA EQU 5h TRISB EQU 6h ; Değişkenler ZD1 EQU 0Fh ZD2 EQU 0Eh zaman EQU 0Dh X1 org 0h ; Power on goto START ; 0000 START bsf STATUS,5 ; Page 1 movlw 0h ; 0000-0000 sayısını W registerine al movwf TRISB ; PortB yi çıkış olarak ayarla ;TRISB=00000000 bcf STATUS,5 ; Page 0 TOP movlw 09h ; 0 0 0 0 1 0 0 1 movwf PORTB ; Araç Yeşil, Yaya Kırmızı movlw 0Fh movwf zaman call BEKLE ; Bekle 15 saniye movlw 05h ; 0 0 0 0 0 1 0 1 movwf PORTB ; Araç Sarı, Yaya Kırmızı movlw 05h movwf zaman call BEKLE ; Bekle 5 Saniye movlw 12h ; 0 0 0 1 0 0 1 0 movwf PORTB ; Araç Kırmızı, Yaya Yeşil movlw 19h movwf zaman call BEKLE ; Bekle 25 saniye movlw 15h ; 0 0 0 1 0 1 0 1 movwf PORTB ; Araç Sarı-Kırmızı, Yaya Kırmızı movlw 05h movwf zaman call BEKLE ; Bekle 5 Saniye goto TOP ; Tekrarla ;******************************************************** ; BEKLE alt programı ;******************************************************** BEKLE movlw .200 movwf ZD1 D1 movlw .200 movwf ZD2 D2 decfsz ZD2,F goto D2 decfsz ZD1,F goto D1 decfsz zaman,F goto BEKLE return END
Örnek 1-2: Port B’de bağlı olan 8 adet ledi yakıp söndüren bir flip,flop programı yazınız. Bu programı yazarken zaman gecikmesini alt programlar şeklinde
yazınız?
Şekil 1.2: 8 adet led devresi (Yürüyen ışık devresi)
Çözüm:
LIST P=16F84 INCLUDE “P16F84.INC” S1 EQU h’00’ S2 EQU h’0D’ CLRF PORTB BSF STATUS,5 CLRF TRISB BCF STATUS,5 TEK MOVLW h’00’ MOVWF PORTB CALL GECİKME MOVLW h’FF’ MOVWF PORTB CALL GECİKME GOTO TEK GECİKME MOVLW h’FF’ ;Alt program kısmı MOVWF S1 DÖN1 MOVLW h’FF’ MOVWF S2 DÖN2 DECFSZ S2,F GOTO DÖN2 DECFSZ S1,F GOTO DÖN1 RETURN ;Altprogram sonu END
Programın birinci kısmı port ayar işlemi yapmakta yani portB’nin tüm uçlarını çıkış olarak ayarlamaktadır.İkinci kısım ise porta b’00000000’ bilgisi ile b’11111111’ sayısını sırası ile göndererek port ucundaki ledlerin sönmesini ve yanmasını sağlamaktadır. Gecikme isimli son kısım ise porta yanma ya da sönme bilgisi gönderildikten sonra bekleme süresini ayarlamakta ve alt program şeklinde kullanılmaktadır.
Örnek 1.5: Zeminden üst katlara yük taşıyan bir asansörün bakım sistemi için şöyle bir düzenek isteniyor. Asansörün yukarı çıkıp aşağı dönüşü 1 tur sayılmak kaydıyla 40.000 tur sonunda bakım zamanının geldiğine dair bir sarı ikaz lambasının yanması isteniyor.
Eğer bakım yapılmadan çalışmaya devam eder ise 48.000 turdan sonra kırmızı ikaz lambasının yanması isteniyor. Şayet asansör bakım yapılmadan 2.000 tur daha çalıştırılırsa bu durumda asansörün çalışmasını engellemesi isteniyor. Bakım yapıldığında tur sayısının sıfırlanarak aynı işlemin tekrar devreye girmesi isteniyor. Bu işlem için gerekli devrenin prensip şemasını çiziniz ve programını yazınız.
(İpucu: Asansörün her bir turunu zeminde iken algılatma şeklinde düşünebilirsiniz.)
Çözüm: Burada esas olay asansörün iniş çıkış turlarını saydırmaktır. Normal sayıcı mantığıyla düşündüğünüzde bir değişkenle sayabileceğiniz en büyük sayı 255’tir. Bu şekilde düşündüğünüzde birler, onlar basamağı mantığı ile düşünüp 2 veya 4 değişken kullanarak program yazılabilir ki biraz uzunca bir program olur.
Ancak iç içe iki döngü ile tuş basmasını saydırırsak, bu durumda iç içe olmak üzere her ikisi de 200 turluk 2 döngü ile 200*200=40000 tur sonunda döngü tamamlanır. Sonunda 40000 tur sonunda yapılacak işlem yaptırılır. 8000 ve 2000 tur içinde aynı teknik kullanılabilir. Aşağıdaki çözüm bu mantığa göre tasarlanmıştır.
;Asansör koruma-bakım problemi ;RA0 ucunda asansor turlarını sayan buton sensor ;RB0 Sarı ışık ikaz ;RB1 Kırmızı ışık ikaz ;RB2 Asansor aktif/Pasif ucu, RB2=0 iken asansor calısır durumda LIST P=16F84 STATUS EQU 3h PORTA EQU 5h PORTB EQU 6h TRISA EQU 5h TRISB EQU 6h say EQU 0Ch ; D0 EQU 0Dh ; döngü degiskeni 0 D1 EQU 0Eh ; döngü degiskeni 1 D2 EQU 0Fh ; döngü degiskeni 2 X1 org 0h ; Power on goto START ; 0000 START bsf STATUS,5 movlw 0h movwf TRISB movlw 0fh movwf TRISA bcf STATUS,5 clrf PORTB movlw .200 ;Asansor 40000 tur calıstı mı movwf D1 ;sorusu icin 200*200=40000 ZD1 movlw .200 ;turluk dongu icinde movwf D2 ;tus programı tekrarlanır ZD2 call tus decfsz D2,F goto ZD2 decfsz D1,F goto ZD1 bsf PORTB,0 ;40000 tur olmuştur SARI led yanar movlw .40 ;Asansor 8000 tur daha calıstı mı? movwf D1 ;sorusu icin 40*200=8000 ZD3 movlw .200 ;turluk dongu icinde movwf D2 ;tus programı tekrarlanır ZD4 call tus decfsz D2,F goto ZD4 decfsz D1,F goto ZD3 bcf PORTB,0 ;48000 tur olmuştur SARI led söner bsf PORTB,1 ;48000 tur olmuştur KIRMIZI led yanar movlw .10 ;Asansor 2000 tur daha calıstı mı? movwf D1 ;sorusu icin 10*200=2000 ZD5 movlw .200 ;turluk dongu icinde movwf D2 ;tus programı tekrarlanır ZD6 call tus decfsz D2,F goto ZD6 decfsz D1,F goto ZD5 ZD7 bsf PORTB,2 ;50000 tur olmuştur KIRMIZI led zaten ;yanıktır, goto ZD7 ;Asansor duması için RB2 ucu 1 yapılır ve ;Bu konumdan çıkmak için RESET butonuna ;basılana kadar beklenir. ;*********************************** ; TUS Altprogramı ;*********************************** tus btfss PORTA,0 ;Asansorun 1 turu icin zemindeki goto tus ;butona basılıp bırakıldı mı? şeklinde tus2 btfsc PORTA,0 ;programla test etmek gerekir goto tus2 ;tus ikilemesi gerekmez return END
ÇEVRİM TABLOLARI
Bazı programlarda, bir tablodan belirli değerlerin seçtirilmesi, sıkça lazım olan bir durumdur. Bunun için CALL komutu RETLW komutu ile birlikte kullanılır. Sistemde CALL komutu ile bir alt program çağırılırken eğer W registerinde bir değer varsa ve bu değer PCL ile toplanırsa bu sistem bir index gibi kullanılır. Bu index ile atlanan adımda RETLW değer şeklinde bulunan komut satırındaki değer W registerine aktarılarak alt programdan çıkılır ve böylece ilgili indexteki değer tespit edilmiş olur.
INTERRUPT
Interrupt nedir ?: Kelime anlamı olarak kesilim isteği anlamına gelen interrupt kelimesi, işlemcinin herhangi bir programı icra ederken, bu programa dışarıdan gelen bir sinyal sebebiyle ara verip, başka bir programa (interrupt alt programı) atlayıp, atladığı programı tamamladıktan sonra tekrar geri dönüp ilk kaldığı programdan devam etmesi işlemidir. Bu anlatımdan anlaşılacağı gibi interrupt bir alt program çalıştırma işleminin aynısı gibidir. Ancak, alt programın çağrılma şekli farklıdır.
Bu fark ise normal alt programı çağırma işlemi CALL komutu ile yapılırken, interrupt alt programının ise, normal programın herhangi bir anında dışarıdan gelecek bir sinyal ile çağırılması olayıdır.
Interrupt Çeşitleri:
Mask Edilemeyen Interruptlar:
Mask Edilebilen Interruptlar:
Pic16f84 için Interrupt çeşitleri:
Intcon Registeri:
Option Register
ADC KULLANIMI
Mikrodenetleyici kullanırken en çok rastlanan husus, bir fiziksel büyüklüğün ölçülmesi ya da ayarlanması şeklindedir. Mesela ortam sıcaklığının ölçülmesi ya da ayarlanması, ortam ışıklandırılması vb… Bu gibi durumlarda ADC kullanılması gerekmektedir. Bazı PIC serisi işlemcilerde kendi içerisinde ADC mevcuttur, ancak biz burada 16f84 ile ADC kullanarak yapılabilecek işlemlere bakacağız.
İşlemlerimizde ADC olarak ADC804 elemanını kullanacağız. 8 bit ADC uygulamaları için, B portunun ADC çıkışlarına birebir olacak şekilde bağlandığını kabul edeceğiz. Böylece diğer işlemler için sadece A portunu kullanacağız. Tabii ki burada dışarıdan çoğullama kullanılarak çok farklı çözümler üretmenin mümkün olduğu unutulmamalıdır
Şekil 3.1: ADC ile sıcaklık ölçme için ADC-PIC bağlantısı
Şekilde görüldüğü gibi ADC çıkışları B portuna direk girilmiştir. Burada ADC’nin Vref/2 ucuna Vcc/2=2,5 Volt verildiği için ADC’nin çıkışındaki her bir sayı 5/256=19,53 milivolta karşılık gelmektedir. Böylece girişteki PTC ile R1 direncinden oluşan gerilim bölücü devre sayesinde, çıkışında sıcaklık değişimi sebebiyle oluşan her 19,53 milivolt değişimde bir sayı değişecektir. Burada kullanılan direncin değeri, PTC’nin istenilen sıcaklıktaki değerine yakın seçilirse sistemin çalışma hassasiyeti artar.
Örnek 3.2: Bir süpermarkette iç ortam sıcaklığının 22oC ile 25oC arasında ayarlanması isteniyor. Bu iş için sıcaklığı ölçmek amacıyla aşağıda değerleri verilen PTC kullanılmıştır. Gerekli devreyi çiziniz ve programını yazınız.
22 oC de PTC Direnci :22 K
25 oC de PTC Direnci :25 K
Çözüm : Burada, devrede bir harici ADC kullanılır ve PTC ile sabit bir direncin, gerilim bölücü olarak kullanılmasından faydalanılır. PTC direncinin değişimine göre de ADC’nin giriş voltajı (gerilim bölme kuralı ile) ile bu voltaja karşılık ADC’nin üreteceği sayı hesaplanır. Sonrasında problem, girişteki sayı X’den küçükse A işlemini yap, girişteki sayı Y’den büyükse B işlemini yap durumuna gelir.
Şekil 3.2: Pic16f84 ile ortam sıcaklığını kontrol devresi
ÖRNEK PROBLEMLER:
Aşağıda işlenen tüm konuları içerisine alan çözülmüş örnekler verilmiştir. Bu örneklerde esas amaç, gerçek hayattaki problemlerin mikroişlemciye uyarlanmasını sağlamaktır. Ayrıca bu örnekler programlamanın değişik durumlarını öğretmesi açısından faydalı olacaktır.
Örnek problem 1: Bir süpermarkette kapıların otomatik çalışması istenmektedir. Bu iş için kullanılacak optik sensörler görüş açısındaki cismi algılayınca 1, boşta iken 0 vermektedirler Bir kapının giriş-çıkış şeklinde çalışması için gerekli devreyi tasarlayınız. Kapı ortasında kimsenin sıkışmaması için gerekli tedbiri alınız.
Çözüm: Burada en az 3 sensöre ihtiyaç olacaktır. Bunlar kapıda biri olduğunu algılayan sensör ile kapı tam açık ya da kapı tam kapalı şeklindeki değerleri veren limit switch şeklindeki kapı açık-kapalı sensörleridir. Bunlar olduğunda problem kapıda biri varsa ve kapı tam açık değilse kapı açma motorunu çalıştır. Kapıda kimse yoksa ve kapı kapalı değilse kapı kapatma motorunu çalıştır şeklinde düşünülür.
;Otomatik kapı sorusu çözümü ;RB0,RB1 uçlarında kapıda biri var işareti veren sensörler bağlı ;RB2 de kapı tam açık sensörü bağlı ;RB3 te kapı tam kapalı sensörü bağlı ;RA0 ucunda kapıyı açan motor bağlı ;RA1 ucunda kapıyı kapatan motor bağlı LIST P=16F84 STATUS EQU 3h PORTA EQU 5h PORTB EQU 6h TRISA EQU 5h TRISB EQU 6h X1 org 0h ; Power on goto START ; 0000 START bsf STATUS,5 movlw h'FF' ;B portu giriş movwf TRISB movlw 00h ;A portu çıkış movwf TRISA bcf STATUS,5 sil clrf PORTA kontrol movf PORTB,w andlw 03h ;sadece RB0 ve RB1 bilgilerini ayırmak için btfsc STATUS,2 ;kapıda biri yoksa ANDLW işleminin sonucu ;0 dır goto kapat ac btfsc PORTB,2 goto sil movlw 01h movwf PORTA goto kontrol kapat btfsc PORTB,3 goto sil movlw 02h movwf PORTA goto kontrol END
Örnek problem 2: Bir süpermarkette iç ortam aydınlığının 100 Lüx’ün üzerinde ayarlanması isteniyor. Bu iş için aydınlık derecesini ölçmek amacıyla aşağıda değerleri verilen LDR kullanılmıştır. Ayrıca aydınlatma lambaları iki ayrı grup altında birleştirilmiştir. Buna göre, ışık miktarı 80 Lüx’den az iken her 2 grup lambanı yanması, 80-100 Lüx arasında ise 1 grup lambanın yanması isteniyor.
Eğer, ışık miktarı 100 Lüxün üzerinde ise lambaların sönük olması isteniyor. Gerekli devreyi çiziniz ve programını yazınız.
80 Lüx’de LDR Direnci :100 K
90 Lüx’de LDR Direnci :90 K
100 Lüx’de LDR Direnci :80 K
Çözüm : Yine ADC gerektiren bir örnek. Burada aydınlığı ölçecek LDR ile bir gerilim bölücü direnç kullanarak ve kritik aydınlık değerlerinde ADC’nin üreteceği sayı hesaplanarak, büyük-küçük kıyaslamaları ile problem çözülür.
Örnek problem 3: Bir cam üretim tesisinde, hareketli bant sistemi üzerindeki ürünlerin kalitesi 4 ayrı noktadaki optik sensörlerle kontrol ediliyor. Bu sensörlerin her biri malzeme normal ise 0, problemli ise 1 veriyor. Her bir sensörün kendi yanında bir adet imha pistonu mevcut olup, herhangi bir sensörden hatalı imalat bilgisi gelirse, ona bağlı olan pistonun 1 mili saniye süreyle ileri gidip sonra tekrar geri gelmesi isteniyor. Bu işlem için gerekli devrenin prensip şemasını çiziniz ve programını yazınız.
Örnek problem 4: Bir asansör sisteminin fazla yük konusundaki problemleri çözme konusu şu şekilde ayarlanıyor. Eğer asansördeki yük 3000 kilogramdan az ise tek motor devreye girerek asansörü çalıştırıyor. Eğer yük 3000-5000 kilogram arasında ise iki adet motor ile sistemin çalışması sağlanıyor. Eğer yük 5000 kilogramdan fazla ise, bu durumda asansörün hareket etmemesi ve aşırı yük alarmının devreye girmesi isteniyor. Bu problemin çözümü için kullanılan basınç sensörü hiç yük yokken değeri 1000 ohm olup elemanın direnç değeri her 1 kilogramda 1 ohm artmaktadır. Bu işlem için gerekli devrenin prensip şemasını çiziniz ve programını yazınız.
Örnek problem 6: Dönen platform şeklindeki bir alış-veriş reyonunda, kontrol sisteminin reyondaki malın çok azalması veya normalden fazla olması problemleri çözme konusu şu şekilde ayarlanıyor. Reyondaki yük 300 kilogramdan az ise tek motor devreye girerek reyonun dönmesini sağlıyor; eğer yük 300-500 kilogram arasında ise iki adet motor ile sistemin çalışması sağlanıyor.
Şayet yük 500 kilogramdan fazla ise bu durumda sistemin hareket etmemesi isteniyor ve yük 700 kilogramdan fazla ya da 100 kilogramdan az ise yine sistemin çalışmayıp bir ikaz alarmının devreye girmesi isteniyor. Bu problemin çözümü için kullanılan basınç sensörü hiç yük yokken değeri 100 ohm olup elemanın direnç değeri her 1 kilogramda 1 ohm artmaktadır. Bu işlem için gerekli devrenin prensip şemasını çiziniz ve programını yazınız.
MPLAB KULLANIMI
Bu bölümde MPLAB Ver 3.31.00 versiyonunun çalıştırılması ve kullanımı ana hatlarıyla anlatılacaktır. MPLAB programının diğer versiyonları da bu versiyon ile menü açısından benzerlik göstermektedir. Bu sebeple bu bölüm iyi anlaşıldığında, programın diğer versiyonları da kullanılabilir. Not: bu yazının bulunduğu dosya arşivden çıkartıldı aynı yazı daha önce sitemize eklenmiş Microchip Mplab Kullanım Kılavuzu
Yukarıda özetler verilmiştir;
Şifre-Pass: 320volt.com
Yayım tarihi: 2009/05/02 Etiketler: adc kullanımı, assembly örnekleri, mikro denetleyici kontrol, pic örnekleri, PIC programlama, pic16f84 programlama