Hazırlayan: Muhittin KAPLAN – İlk Proton dersinden (Proton Plus ile PIC Programlama Bölüm 1) sonra bir çok kişinin beklediği ikinci bölüm hazır Proton ile pic programlamaya başlamak isteyenler için detaylı bir kaynak. Örnek devreler ile bolca uygulama bulunuyor komutlar detaylı olarak açıklanıyor. Muhittin KAPLAN hacamıza teşekkürler.
Bu bölümde program Yazmaya yeni başlayanların kullanmakta çekindiği bir kavram olan Kesme (Interrupt) kullanımını ele alacağız.
Kesme (Interrupt) tanımlayacak olursak, “bir programının normal çalışması esnasında, işleyişin bırakılıp kesmenin gerekliliğin yapıp tekrar normal programa dönülmesidir”. PIC lerde çeşitli kaynaklardan kesme alabilir.
RB0,Portb Değişim, Timer 0-1-2, PortD, Eprom, Seri İletişim ve ADC çevrimi bunlardan bazılarıdır. PIC16F877 de 15 adet kesme kaynağı vardır.
PIC 16F877 de bu kesmeleri aktif etmek ya da iptal etmek için kullanılan INTCON Registeri mevcuttur. Bu registerin açıklaması aşağıda ele alacağız.
GIE: Tüm kesme işlemlerini etkin/iptal etme bayrağı
PEIE: Arabirim kesme aktif yapma bayrağı.
Çevresel ünitelerden gelen kesmeleri aktif etmek için kullanılan bittir. Bu çevresel ünitelerden
bazıları USART, EPROM Yazma/Okuma, Paralel İletişim sayılabilinir.
T0IE:TMR0 sayıcı kesmesini aktif yapma bayrağı
Tmr0, Programın genel Akışından bağımsız olarak çalışan bir sayıcıdır. Bu kesme ise bu sayıcının FF den 00 a geçişi anında oluşur. Bu bit bu kesmeyi aktif eder.
INTE: Harici kesmeyi aktif yapma bayrağı
INTE bayrağı, RB0 pininden gelen tetiklemeye göre çalışır. Bu bit bu Interrupt ı aktif eder.
RBIE: PORTB (4, 5, 6, 7) deki değişiklik kesmesini aktif yapma bayrağı
TOIF:TMR0 sayıcısı zaman aşımı bayrağı
Bu bit TMR0 Sayıcısından dolayı oluşmuş bir Interrupt varsa “1” olur
INTF: Harici kesme bayrağı
Bu bit RB0 kesmesinden dolayı oluşmuş bir Interrupt varsa “1” olur
RBIF: PORTB değişiklik bayrağı
Bu bit PORTB değişiklik oluşmuş bir Interrupt varsa “1” olur Ayrıca yukarıdaki INTCON registerinden başka Interrupt ile ilgili olan Option Register de vardır.
OPTION REGISTER
Option Register da, eğer INTCON üzerinden TMR0 taşma ($FF den $00 e geçerken) Interrupt ı aktif (T0IE) edilmişse bu TMR0 sayıcısı için gerekli olan saat sinyalinin (clock) kaça bölünmesi gerektiğini belirten üç adet bit vardır. Bahse konu olan Option Registerin yapısı ve bit lerin neler olduğu aşağıda açıklanmıştır.
RBPU: bu bit portb de bulunan dâhili PullUp dirençlerini aktif eder.
INTEDG: Aktif edilen Interrupt ın (INTE, RBIE) oluşmasını sağlayacak sinyalin düşen kenar ya da yükselen kenar seçimi yapar.
T0CS: TMR0 için saat sinyali (Clk) girişinin seçimini yapar
1 = T0CKI pin
0 = PIC için kullanılan Osilatör Kullanılır
T0SE: Eğer T0CKI seçildiyse saat sinyalinin Hangi kenarda sayma işlemi gerçekleşeceğinin seçimini yapar.
1= T0CKI pin düşen kenar
0 = T0CKI pin Yükselen kenar
PSA: Bölme işleminin hangi sayıcı içi olacağını belirtir.
1 = WDT
0 = Timer0
PS2-PS0 bitleri ise sayma işlemi için gerekli olan saat darbesinin oranı belirler. Eğer 1 / 128 seçilirse 128 makine saykılında (Osilatör Frekansı /4 ) TMR0 sayıcısı 1 kez sayar. Aşağıdaki Proje ile ilk SOFTWARE Interrupt kodumuzu yazalım
Proje 6: TMR0 kesmesi kullanarak zaman gecikmesi sağlamak
Kullanılan Yeni Komutlar; Symbol: Komut istediğimiz bir PORT ’a, port pinine, Kaydediciye takma ad atamak için kullanılır. Atanan bu isim yazımda ve kodların okunabilirliliğini arttırır.
Toggle: Bir Pinin durumunu değiştirmek için kullanılır. Eğer pin “1” se “0”, “0” sa “1” olur.
Inc: Bir değişkenin içeriğini arttırır. Dec komutu inc komutunun tersini yapar azaltır.
Aşağıda Kodları ve şeması verilmiş projeyi gerçekleştirip TMR0 kesmesi hakkındaki hesaplamalara geçebiliriz.
ISIS Simulasyon Şeması: Devrenin çalışmasını proje Klasörünü içerisindeki videodan da izleyebilirsiniz.
Yukarda Kullanılan TMR0 ile yapılan kesmenin zamanı 500 milisaniyedir. Gelin isterseniz bunu beraber hesaplayalım.
Yukardaki Çözümde PIC in komut işleme süresinin (Makine Saykılı) 4Mhz lik Osilatör ile, 1 Mhz Olduğu Hesaplanıyor. Bu hesapla 1 Makine Saykılının süresi formüle edersek 1uS olarak hesaplarız.
Yukardaki işlemden Sonra şimdi gelelim “Tmr0 ın zaman taşmasının” nezaman oluşacağına. Dikkat ettiyseniz Programın Başında “TMR0=6” ataması yapılmış bu atamayla Tmr0 sayıcısının “6” sayısından başlaması sağlanmıştır.
Böylece Tmr0 ın 250 adım sayması sağlanmıştır(256-6). Ayrıca OPTION_REG = %00000011 ayarlaması ile 1/16 oranı belirlenmiştir. Buradan bizim çıkaracağımız anlam şudur; her 16 makine saykılında Tmr0 sayıcısı 1 artsın.
Burada her 16uS de bir Tmr0 “1” Artacaktır. Ön ayar ile 250 ye Kadar saydırdığımız Tmr0 Zaman =250 * 16= 4000 us` lik zaman biriminde kesmeye girer. Sonuç Olarak Aşağıdaki Formül karşımıza çıkar.
If SAYI=125 Then
Toggle LED
SAYI=0
EndIf
Programda geçen yandaki komut satırı ile bu kesmenin her 125 defa oluşmasında LED ile tanımlanan PortD.0 numaralı çıkışı durum değiştirir. Aşağıdaki formülle bu durum değiştirme süresi 500mS olarak ayarlandığını görebilirsiniz.
Proje 7; Amaç: RB0 ile dış etki ile Software interrupt çalışması ve 2×16 Alpha LCD Menü Çalışması.
Kullanılan Yeni Komutlar; Select..EndSelect: Komut değerler arasındaki seçimlere göre işlem yapar. Konuyu örnek üzerinden anlatacak olursak
Yukarıdaki kod bloğunda Menu_Durum adındaki değişkenin içeriği eğer “0” sa hemen altındaki kodları (“Print At 1,6,”1″) çalıştıracaktır. Eğer Menu_Durum “1” se onun altındaki komut satırı işletilir, Eğer ne “0” nede “1” se “Case Else” ile devam eden satır işletilir. “EndSelect” ile sorgulamadan çıkılır.
Print: Komut ile LCD ye bilgi göndermek için kullanılır. Komutun doğru çalışması için LCD tanımlamalarının yapılması gerekir. Aşağıdaki kodlarla lcd nin bağlantısının nasıl yapıldığı ve bazı özellikleri tanımlanmıştır.
Bu tanımlamaları kendi kodlarımızın içerisine yazdığımız gibi “INCLUDE” bildirisi ile kullanılan dosyalarla da yapabiliriz. Burada sırası gelmişken INCLUDE bildirisinden bahsedeyim.
Include bildirisi ile daha önceden hazırlanmış tanımlama dosyalarını yazdığımız programa dahil etmiş oluruz. Proton Plus da daha önceden hazırlanmış dosyalar mevcuttur. Kullanımı aşağıdaki gibidir.
INCLUDE “DosyaAdı”
Aşağıdaki kodlar “proton_4.inc” dosyasından bir bölümü bulunmaktadır. Görüldüğü üzere birçok tanımlama yapılmıştır. Bunlar arasında lcd ile ilgili tanımlamalar, seri giriş çıkış için tanımlamalar vardır. Unutulmaması gereken husus “include” bildirisi ile tanımlanan dosyanın kendi yazdığımız programla derlenmesi yazıldığı satırda gerçekleşir. Bundan dolayı bu tanımlamaları programımızın ilk satırlarında yapmakta fayda vardır. Bu doslayarın Proton Plus tarafından kullanılabilen dosyalar olması gerekir.
Ayrıca dosyaların;
1. Doğrudan dosyanın bulunduğu klasörü yazarak (“C:\MY_INCLUDES\dosya. inc” )
2. Proton Plus klasörü içerisinde
3. Derleyici klasörü içerisinde
4. INC klasörünün içerisinde Olmalıdır.
“Proton_4.inc” dosyasından bir bölüm
Programımızda geçen aşağıdaki kod bloğu yerine
Device = 16F877
‘–LCD BAGLANTILARI————————
XTAL = 4
LCD_DTPIN = PORTD.4 ‘Lcd nin dataları Portd.4 en baĢlıyor
LCD_RSPIN = PORTE.0 ‘LCD RS pin Porte.0
LCD_ENPIN = PORTE.1 ‘Lcd EN pin Porte.1
LCD_INTERFACE = 4 ‘4-bit Interface
LCD_LINES = 2 ‘Lcd 2 satır
LCD_TYPE = 0 ‘
LCD_COMMANDUS = 2000
LCD_DATAUS = 50
‘–LCD BAGLANTILARI————————
ALL_DIGITAL TRUE ’16f877 nin tüm uçları Dijital
Sadece include “proton_4.inc” yazmamız yeterli olacaktı. Print Komutuna geri dönecek olursak. Print Komutunun alabileceği argümanlar dan bahsetmeden konuyu kapatmamak gerekir. Aşağıdaki listede Print Komutunun alabileceği çok kullanılan argümanlar ve işlevleri yer almaktadır.
Aşağıdaki kodları Proton Plus ile yazarak derleyiniz ve ISIS simülasyonunu kurarak çalıştırınız.
——————————————————
(Devrenin Çalışmasını Proje7 altındaki proje7.avi dosyasından izleyebilirsiniz.) RB0 kesmesinin çalışmasından bahsedecek olursak, Deveredende anlaşılacağı üzere Portb nin 0 numaralı pinine girilen bir tetikleme ile çalışır. Interrupt alt programına gitmek için tetikleme sinyalinin düşen kenar yada yükselen kenar seçimi için OPTION_REG in 6 biti kullanılır.
(Default olarak düşen kenardır). Interrupt alt programında menu_durumu kontroledilir ve durum değişmesi
sağlanır.(Burada Toggle komutunun kullanılmamasının sebebi Toggle komutunun sadece port pininin durumunu değiştirmesidir.)
Buraya kadar anlatılan kesme türleri Software kesme olarak adlandırılan kesme türüdür. Bu kesme türü ile yapılan çalışmalarda bazı sakıncalar oluşabilir. Bunlardan en önemlisi komut işleme esnasında oluşan kesmeyi algılayamamaktır. Burada hardware kesme önem kazanmaktadır.
Software kesme derleyici tarafından her komutun önüne “kesme oluştumu” komutu atamak gibidir. Bundan
dolayı uzun bekleme komutlarında (“DelayMs 1000” gibi) bekleme komutu icra edilmeden kesme oluşmaz.
Hardware kesmesinde ise böyle bir problem yaşanmaz. Hardware kesmesinde ise, kesme altprogramına girer girmez sistemi etkileyen kayıtcı durumlarının yedeklenmesi ve kesmeden çıkarken bunların tekrardan yüklenmesi gerekir. Yedekleme işlemini Context Save, geri alma işlemini Context Restore komutları yapar.
Hardware Kesmesi için intcon kayıtcısının ayarlanması için yapılması gereken önemli hususlardan biri de Ayar yapmaya başlamadan önce Global Int bayrağının “0” yapılması gerekliliğidir. Ayrıca kesme altprogramı içerisinde mümkün olan en kısa zamanda çıkılması gerekir. Diğer uzun beklemelerde ana program çalışmayabilir.
Proje 8; Amaç: RB0 ile dış etki ile Hardware interrupt çalışması ve 2×16 Alpha LCD Menü Çalışması.
Kullanılan Yeni Komutlar; Repeat..Until: Komut ile until ile bildirilen şart gerçekleşene kadar repeat ile until arasındaki komutların işlenmesi sağlanır. Komutun for..next ile kullanım açısından pek bir farkı olmamakla beraber repeat..until komutu for..next komutundan daha hızlı çalışır ve daha az yer kaplar.
Repeat
Print At 2, 1,@Durum,” ”
DelayMS 100
Inc Durum
Until Durum > 255
Yukarıdaki komut satırı ile sonsuz bir döngüye girilmiştir. Çünki durum değişkeni byte olarak tanımlandığından hiçbir zaman desimal 255 den daha büyük değer alamaz.
İsis şeması aşağıdaki gibidir. Çalışmasına gelince On_Hardware_Interrupt GoTo Kesme komutuna dikkat edecek olursak kırmızı olarak renginin değişmesi bu kesme türünün hardware olduğu anlamına gelir. Lcd nin ilk satırında kesmenin oluşma (butona basma) sayısını (Sayi değişkeni), ikinci satırda ise normal programın çalışması (Repeat Until) esnasında oluşan durum değişkeninin aldığı değerler yer alır. Butona her bastığımızda kesme sayısı bir artacak ve ana programa tekrar dönecektir.
Programın çalışmasını proje8 klasörünün içerisinde bulabilirsiniz.
Proje 9; Amaç: Seri İletişim kesme çalışması (Hardware kesme kullanarak Çevresel birimlerle ilgili kesme çalışması)
Seri İletişim: Seri iletişim iki cihaz arasında bilgi alışverişi yapmak için kullanılan yöntemlerden bir tanesidir. Bu yöntemin avantajları arasında daha az iletişim hattı kullanılması, dezavantajları arasında ise diğer yöntemlere göre daha yavaş olması, söylenebilir. Birçok bilgisayarda olan ve bir standart haline gelen RS232 yöntemi seri iletişime bir örnektir.
Yalnız, iletişime başlamadan önce her iki cihazında ayarlanması gereken bazı parametreler vardır. İletişi hızı (BaudRate), veri sayısı (Databits), eşlik bit çeşidi (Parity), başlangıç ve bitiş bitlerinin olup olmaması bunlardan bazılarıdır.
Aşağıda ISIS de yer alan virtual terminal in ayar penceresi görülmektedir.
Yukarıdaki ayarlamada da görüldüğü üzere 9600bps, 8bitdata, NoneParity, 1 Stop bit olarak ayarlanmıştır.(Kısaca 9600N81Olarak geçer)
Projeyi devre üzerinde hazırladığımızda ise, PC ile iletişim kurması için Windows da bulunan HyperTerminal programı kullanılabilinir. Bazı PC lerde birden daha çok seri iletişim portu olduğundan dolayı ilk yapacağımız, hazırladığımız MCU ile iletişim yapacak PC portunu seçmek olacaktır. Aşağıdaki şekilde HyperTerminal programının ayar penceresi görülmektedir.
Kullanılan Yeni Komutlar;
HSerIn: Komut ile USART (Universal Synchronous Asynchronous Receiver Transmitter) arabirimi kullanarak (bu arabirim donanımsal olarak PIC içerisinde bulunmalı) seri bilgi alışı sağlanır. Komutun kullanımı aşağıdaki gibidir.
HSERIN, 1000, Timeout , [DEGISKEN]
Komutta kullanılan ilk değer (1000) zaman aşımı değeridir. Bu değer milisaniye birimindedir. Eğer seri bilgi alımında bir değer aşımı olursa “TimeOut” etiketine dallanır. Alınan bilgi “Değişken” in içerisine aktarılır.
Aşağıdaki tabloda Proton Plus ile kullanabileceğiz Seri iletişim protokolü ile ilgili komutları bulabilirsiniz.
Usart Gereklimi ? | Komut | Açıklama |
---|---|---|
Evet | Hserin | USART birimi olan MCU lar için seri bilgi alır HSERIN Timeout , Timeout Label , Parity Error Label , [Modifiers , Variable {, Variable… }] |
Evet | Hserout | USART birimi olan MCU lar için seri bilgi gönderir HSEROUT [Item { , Item… }] |
Evet | Hserin2 | İki Adet Usart modülü olan MCU larda ikincil modül için Hserin ile aynı HSERIN2 Timeout , Timeout Label , Parity Error Label , [Modifiers , Variable {, Variable… }] |
Evet | Hserout2 | İki Adet Usart modülü olan MCU larda ikincil modül için Hserout ile aynı HSEROUT2 [Item { , Item… }] |
Evet | Hrsin | USART birimi olan MCU lar için seri bilgi alır Variable = HRSIN , { Timeout , Timeout Label } |
Evet | HrsOut | USART birimi olan MCU lar için seri bilgi gönderir HRSOUT Item { , Item… } |
Evet | Hserin2 | İki Adet Usart modülü olan MCU larda ikincil modül için Hrsin ile aynı Variable = HRSIN2 , { Timeout , Timeout Label } |
Evet | HrsOut2 | İki Adet Usart modülü olan MCU larda ikincil modül için Hrsout ile aynı HRSOUT2 Item { , Item… } |
Hayır | RsIn | Sabit Gönderim hızı ve Pin İle Asenkron Bilgi Gönderir Variable = RSIN , { Timeout Label } |
Hayır | RsOut | Sabit Gönderim hızı ve Pin İle Asenkron Bilgi alır RSOUT Item { , Item… } |
Hayır | Serin | Asenkron Seri Bilgi Alır SERIN Rpin { \ Fpin } , Baudmode , { Plabel, } { Timeout , Tlabel, } [ InputData ] |
Hayır | SerOut | Asenkron Seri Bilgi Gönderir SEROUT Tpin { \ Fpin } , Baudmode , { Pace, } { Timeout , Tlabel, } [ OutputData ] |
Hayır | ShIn | Senkron Seri Bilgi Alır Var = SHIN dpin , cpin , mode , shifts |
Hayır | ShOut | Senkron Seri Bilgi Gönderir SHOUT Dpin,Cpin,Mode,[OutputData{\Bits}{,OutputData{\Bits}..}] |
yukarı da özetler verildi;
Şifre-Pass: 320volt.com
Yayım tarihi: 2009/11/22 Etiketler: Kesme Interrupt, kılavuz ders, Option Register, PIC programlama, proton dersleri, proton kılavuz, proton komutları, Proton Plus, proton plus dersleri
Teşekkürler Muhittin bey elinize sağlık
hocam paylaşım cok güzel tessekkur ederim,proton plus programını nasıl temin edebilirim yardımcı olabilirmisiniz,acilen glcd projemi bitirmem gerekiyor yardımcı olursanız sevinirim
Hocam size ne desem az minnettarım çok teşekkür ederim ,program elime gecti indirdim 😀 ben şuan asansör firmasında elektronik kart bölümü sorumlusuyum asansör hakkında yardım edebileceğim konu olursa yardımcı olabilirim lg sürücüler,kontaktorler vs.konusunda elimden geleni söylemeye çalışırım tekrar teşekkür ederim iyi çalışmalar.
teşekkürler hocam bu anlatım çok güzel olmuş kesmeler hala kafamı karıştırdı ama deneye deneye öğreneceğim.
merhaba kolay gelsin egıtım notunuz varmı proton ıde ıle