Robotların beyinleri olan ve önceden programlanmıs yönetim ve karar
mekanizmalarını içeren mikroislemciler birçok farklı birimden olusmaktadırlar. Bu birimler
aritmetik mantık birimleri(ALU), bellek, giris çıkıs portları ve yazmaçlar ile birlikte çesitli alt
çevresel birimlerdir. Bu çevresel birimlerden bazıları zamanlayıcılar, kesme mekanizmaları,
analog-dijital çeviriciler (ADC), PWM ve seri haberlesme birimleri(UART) olabilmektedir.
Bu ayki yazımızda mikroislemcilerin sahip oldugu önemli çevre birimlerinin kullanılması ve
bu birimlerle neler yapılabilecegimiz konusunda çesitli uygulamalarımız olacak. Sizlerle
zamanlayıcı alt birimini kullanarak bir saat ve analog-dijital çevirici birimini kullanarak ta bir
pil test cihazı uygulaması yapacagız.
Sekil 1: Piyasada bulunabilen çesitli PIC mikroislemciler
Kesme Çevre Biriminin kullanılması:
Kesmeler, mikroislemcilerin ani cevap vermesi gereken bazı özel durumlarda
kullanılan mekanizmalardır. Bu durumlar mikroislemcinin RB0/INT pininin degerinin
degismesi, seri porttan bir bilgi alınması, yada zamanlayıcılardan birisinin tasmıs (overflow)
olması olabilir. Kullanılan mikroislemci türüne ve büyüklügüne baglı olarak kesme
durumlarının sayısı ve çesidi degisebilir. Herhangi bir kesme olmadıgın zaman bir
mikroislemci normal olarak kendi ana programı üzerinde sürekli bir döngü halinde çalısır ve
hiçbir duraksama olmaz. Bir kesme olustugunda ise mikroislemci kesmeyi fark eder, ana
programın çalısmasını durdurur ve o kesmeye özel alt programı (interrupt routine)
çalıstırmaya baslar. Bu alt programda olusan kesme durumu analiz edilir ve bu durum
karsısında mikroislemcinin nasıl bir tepki vermesi gerektigi tanımlanır. Kesmenin analiz
edilmesi gereklidir çünkü birden fazla kesme türü bulundugu için mikroislemcimizin
bunlardan hangisine tepki vermesi gerektigi önceden belirtilmelidir. Kesme alt programı
tamamlandıktan sonra mikroislemci tekrar ana program döngüsünde kaldıgı yerden devam
etmeye baslar.
Mikroislemciye yüklenecek
PICBASICPRO(PBP) kodu ise su sekildedir.
;*********KESME.BAS*******
LED_RUN VAR PORTB.7
LED_KESME VAR PORTB.6
TRISB = 111111
OPTION_REG = %10000000
On Interrupt Goto KESME
INTCON = %10010000
PORTB = 0
ANADONGU:
HIGH LED_RUN
LOW LED_KESME
GOTO ANADONGU
DISABLE
KESME:
LOW LED_RUN
HIGH LED_KESME
PAUSE 500
INTCON.1 = 0
RESUME
ENABLE
END
Zamanlayıcı Çevre Biriminin kullanılması:
PIC mikroislemcilerin tümünde TIMER0 zamanlayıcısı bulunmaktadır. Bu
zamanlayıcı bizden bagımsız olarak geri planda sürekli çalısır. Zamanlayıcı 8 bitliktir. Yani
maksimum alabilecegi deger 255 tir. 4 MHz lik bir osilatörün kullanıldıgını varsayarsak
TIMER0 her 1 mikrosaniyede bir artar ve 256 mikrosaniye de bir basa döner. Bu zamanlayıcı
süre asımına ugradıgında INTCON yazmacının 2.biti “1” olur. Eger TMR0 kesmesi
etkinlestirilmis ise bu bir kesme olusturur. TIMER0’ın en güzel olan yanı
ölçeklendirilebilmesidir. Yani zamanlayıcının artıs aralıkları degistirilerek kesme süresi
uzatılabilir yada kısaltılabilir. TIMER0’ı 2,8,16,32,64,128 ve 256 ile ölçeklemek olanaklıdır.
Örnek olarak eger biz TIMER0’ı 256 ile ölçeklersek, 256x256 yani 65.535 mikrosaniyede bir
kesme gerçeklesecektir. TIMER0’ın ölçeklendirilmesi OPTION_REG yazmacıyla
yapılmaktadır.
TIMER0 zamanlayıcısını ve TMR0 kesmesini kullanarak kolaylıkla dijital göstergeli
bir saat yapabiliriz. Sekil 3 teki devre semasını kullanarak yapacagımız devrede eger
mikroislemcimize asagıdaki SAAT.BAS baslıklı PICBASIC kodunu yüklersek saatimiz
çalısmaya hazır olacaktır. Bu kod TIMER0 sayacını her 16.384 milisaniyede bir süre asımına
ugrayacak sekilde yapılandırır ve süre asımında da kesme rutinini çalıstırır. Kesme rutini ise
her 61 çalısmasında saniyeyi bir artırır (61x16384 yaklasık 1 saniyeye esittir). Artan saniyeler
60 oldugunda dakika degiskeni, artan dakikalar 60 oldugunda da saat degiskeni bir artar. Daha
sonra bu degiskenler uygun formatta LCD display ekranına yazılır.
;***************SAAT.BAS****************
PAUSE 250
SAAT VAR BYTE
DSAAT VAR BYTE
DAKIKA VAR BYTE
SANIYE VAR BYTE
TICKS VAR BYTE
UPDATE VAR BYTE
SAAT=0: DAKIKA=0: SANIYE=0: TICKS=0: UPDATE=1
OPTION_REG = 000101 ;TIMER0 ÖLÇEKLEME = 1/64
INTCON = $A0 ;TIMER0 KESMES ETK N
ON INTERRUPT GOTO KESME ;KESME ADRES
ANADONGU:
IF UPDATE = 1 THEN
LCDOUT $FE,1 ;EKRANI TEM ZLE
DSAAT = SAAT ;SAAT 12’L K S STEME ÇEV R
IF (SAAT // 12) = 0 THEN
DSAAT = DSAAT + 12
ENDIF
IF SAAT < 12 THEN ;DEGERLER LCD EKRAINA YAZ
LCDOUT DEC2 DSAAT, ":", DEC2 DAKIKA, ":", DEC2 SANIYE, " AM"
ELSE
LCDOUT DEC2 (DSAAT - 12), ":", DEC2 DAKIKA, ":", DEC2 SANIYE, " PM"
ENDIF
UPDATE = 0
ENDIF
GOTO ANADONGU:
DISABLE
KESME:
TICKS = TICKS + 1
IF TICKS < 61 THEN DEVAM ;TICK LER 61 OLURSA SAN YEY ARTIR
TICKS = 0
SANIYE = SANIYE + 1 ;SAN YELER 60 OLURSA DAK KAYI ARTIR
IF SANIYE >= 60 THEN
SANIYE = 0
DAKIKA = DAKIKA + 1
IF DAKIKA >= 60 THEN ;DAK KALAR 60 OLURSA SAAT ARTIR
DAKIKA = 0
SAAT = SAAT + 1
IF SAAT >=24 THEN SAAT = 0
ENDIF
ENDIF
UPDATE = 1 ;GÜNCELLEME TAMAMLANDI
DEVAM:
INTCON.2 = 0 ;KESME BAYRAGINI TEM ZLE
RESUME
END
Analog-dijital Çevirici Çevre biriminin Kullanılması:
Analog-dijital çevirici alt birimi birçok mikroislemcide bulunan alt birimlerden biridir.
Bu birimi kullanarak mikroislemcimizin dıs dünyadaki analog sinyalleri anlamasını
saglayabiliriz. Çogu mikroislemci 10 bitlik çözünürlükle analogdan dijitale çevirim
yapabilmektedir. Bu da eger 5V’luk bir gerilim kaynagı kullanırsanız, 4.88 mV’luk bir
hassasiyete esittir.
Bu uygulamada kullanacagımız PIC16F877 mikroislemcisinde 8 ayrı analog kanal
vardır. Baska bir deyisle 8 farklı analog sinyali birden takip edebilirsiniz. Örnegin kanallardan
birine sıcaklık sensörü, digerine basınç sensörü, bir digerineyse nem sensörü baglayarak
küçük bir meteoroloji istasyonu kurabilirsiniz. Yapabileceginiz uygulamalar sizin hayal
gücünüze baglı. Fakat biz sadece tek bir kanal kullanarak basit bir kalem pil test cihazı
uygulaması yapacagız. Bu uygulamada Sekil 4’teki devre semasını kurmamız ve gerekli PBP
kodunu mikroislemcimize yüklememiz gerekiyor
Sekil 4: Pil test cihazı devre seması.
'***************ANALOG.BAS *****************
DEFINE ADC_BITS 10 ;ADC ÇÖZÜNÜRLÜGÜ 10 BIT
DEFINE ADC_CLOCK 0 ;ADC CLOCK = OSCILLATOR / 2
DEFINE LCD_DREG PORTC ;LCD TANIMLANMASI
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 5
ADC_DEGERI VAR WORD ;GEREKL DEG SKENLER
GERILIM VAR WORD
TRISA = %1111111 ; PORTA’NIN TAMAMI G R S
ADCON1 = %10000010 ;ADC AÇIK
ANADONGU:
ADCIN 0, ADC_DEGERI ;PORTA.0 DAN GER L M DEGER N OKU
GERILIM = ADC_DEGERI*48/10 ; M L VOLT’A ÇEV R
LCDOUT $FE,1, #GERILIM, "mV " ;LCD EKRANINA YAZ
IF GERILIM < 1500 THEN ;ALT SATIRA GEÇ
LCDOUT $FE,$C0, "BOS" ;DEGER 1500 mV TAN KÜÇÜKSE “BOS”
ELSE
LCDOUT $FE,$C0, "DOLU" ;BÜYÜKSE “DOLU” YAZ
ENDIF
PAUSE 250 ; ÖLÇÜMLER ARASINDAK BEKLEME
GOTO ANADONGU
Seri Haberlesme Çevre Biriminin Kullanılması:
ki mikroislemci arasında yada bir mikroislemci ile bir bilgisayar arasında data
transferi yapmanın en kolay yolu RS-232 arayüzünü kullanmaktır. RS-232 arayüzü sadece iki
adet iletken kablo kullanarak 10 metre mesafe içerisinde seri asenkron veri transferini
mümkün kılar. Eger kullanacagımız mikroislemci seri haberlesme çevre birimini(UART)
içerisinde bulunduruyorsa RS-232 arayüzünü kolaylıkla kullanabiliriz.
Sekil 5: RS-232 seri haberlesme uygulaması deve seması.
Yapacagımız uygulamada kullanacagımız mikroislemci olan PIC16F877 UART
birimine sahiptir. Bu arabirim aynı TIMER0’da oldugu gibi geri planda seri veri alısverisi
yaparken, PIC ana program üzerinde çalısmaya devam eder. Bizim bütün yapmamız gereken,
hazırlayacagımız program senaryosunda belli aralıklarla uygun PBP komutlarını (HSERIN ve
HSEROUT) çalıstırmaktır. Sekil 5’teki devre semasında bir bilgisayar ile PIC16F877
mikroislemcisi arasında kurulmus bir seri haberlesme uygulaması gösterilmistir.
Mikroislemcinin seri haberlesme giris-çıkısları RS-232 seviyesinde olamadıgı için bunları
direkt olarak bilgisayarın seri portuna baglayamayız. Mikroislemci çıkıslarını bilgisayara
baglamadan önce uygun RS-232 gerilim seviyelerine dönüstürmemiz gerekir. Bu sebepten
dolayı bu uygulamada MAX232 adlı RS-232 seviye çevirici entegresi kullanılmıstır. Bu
entegre mikroislemcinin çıkıs seviyesi olan TTL’den RS-232’ye ve RS-232’den de TTL’ye
gerilim dönüstürmelerini yapabilmektedir.
Seri haberlesme uygulamamızda mikroislemcimize yüklenecek olan program
UART.BAS adlı PBP kodudur. Bu programda seri porttan bilgi almak için HSERIN, seri
porta bilgi göndermek için ise HSEROUT komutları kullanılmıstır. Programımızın yaptıgı ise
gelince; programımız seri porttan gelen bilgiyi sürekli dinlemekte, eger gelen bilgi “X” ise
bunun ardından gelen bilgiyi “BILGI” adıyla kaydedip bilgisayara seri port üzerinden tekrar
göndermektedir. PC tarafında ise veri göndermek ve almak için ”Hyperterminal” programını
kullanabiliriz. Bu uygulama için hyperterminal oturumunu COM1 üzerinden, 2400 bps(bits
per second) hızında, 8 veri biti ve 1 dur biti seklinde açmalısınız. Açılan terminal ekranında
göndermek istediginiz veriyi klavyeden tuslayarak girebilirsiniz.
'****************UART.BAS **************
BILGI VAR BYTE
TRISC = %10111111 ;PORTC G R S ÇIKISLARI AYARLANIYOR
SPBRG = 25 ;BAUD RATE 2400 Bps
RCSTA = %10010000 ;SERI PORT B LG ALIMI AKT F
TXSTA = 100000 ;SERI PORT B LG GÖNDER M AKT F
ANADONGU:
HSERIN [WAIT("X"), BILGI] ;X DEGER N BEKLE,
;X TEN SONRA GELEN B LG Y SAKLA
HSEROUT [DEC BILGI] ;BU B LG Y ASCII FORMATINDA TEKRAR GÖNDER
PAUSE 200 ;DENEMELER ARASINDAK BEKLEME
GOTO ANADONGU
PWM Çevre Biriminin Kullanılması:
Mikroislemcilerde bulunan bir diger çevresel birim PWM (Pulse Width Modulation)
yada darbe genislik modülasyonu birimidir. Bu birim sayesinde dijital sinyaller analog
sinyallere dönüstürülebilmektedir. PWM birimine sahip bir mikroislemci PWM sinyalini
üretebilmek için belirli bir pini kullanır. Örnek olarak, bu pin PIC 16F628’te PORTB.3 tür.
PWM birimi çalıstırıldıgında mikroislemcinin ilgili pininden, önceden belirlenen bir frekansta
bir kare dalga sinyali gönderilir. Bu sinyalin +5 V (is yapma aralıgı) ta ve 0 V (bekleme
aralıgı) ta kalma süreleri degistirilerek ilgili pindeki gerilim de degistirilmis olur. Eger is
yapma aralıgı ve bekleme aralıgı birbirine esitse çıkıs ana gerilimin %50 si olacaktır. Baska
degisle de %50’lik bir “Duty Cycle” üretilmis olur. PBP’da PWM birimini kullanarak sinyal
üretmek için kullanılan komut “HPWM” komutudur. Kullanılısı ise “HPWM
kanal,Dutycycle,Frekans” seklindedir. Burada kanal PIC’in üzerinde ki birinci yada
ikinci PWM kanalı olabilir. Dutycycle çıkıs sinyalinin gerilimidir. 8 bitliktir ve degeri 0 ile
255 arısında degistikçe çıkıs gerilimi de 0 V ile +5 V arasında orantılı olarak degisir. PWM
birimini kullanarak ve uygun elektronik devrelerle PWM çıkısını güçlendirerek rahatlıkla bir
lambanım parlaklıgını degistirebilir yada bir elektrik motorunun dönüs hızını
ayarlayabilirsiniz.
Asagıdaki kod mikroislemcinin birinci PWM kanalından, 2000 Hz frekansında ve
127/255 = %50 lik dutycycle ile bir sinyal üretir. Çıkıs gerilimi 5/2 = 2.5 Volt olur.
HPWM 1,127,2000
Yardım ve destek için http://robot.metu.edu.tr/forum adresi altındaki foruma ileti
yazabilirsiniz.
Düzeltme: Aralık ayındaki yazımızda devre semasında bulunan R14 adlı 4 Kohm’luk
direncin degerinin yanlıs yazıldıgı ve 1 Kohm olması gerektigi anlasılmıstır.
Kaynaklar:
Odtü Robot Toplulugu sitesi : http://www.robot.metu.edu.tr
Microchip, 16F84A Sata Sheet : http://www.microchip.com
Microchip, 16F628A Sata Sheet : http://www.microchip.com
Microchip, 16F87X Sata Sheet : http://www.microchip.com
Hyperterminal Programı : http://www.hilgraeve.com
Adım Adım PICmicro PROGRAMLAMA, Yasar BODUR
INFOGATE Yayınları, 2002
PICBasic Pro ile PICmicro Programlama, Yasar BODUR
INFOGATE Yayınları, 2002
Hazırlayan:
Ömer ÇAYIRPUNAR – ODTÜ Robot Toplulugu
ODTÜ Bilgisayar ve Ögretim Teknolojileri Egitimi