Elektronik / Elektronik Kaynakları/

Proton Plus ile PIC Programlama Bölüm 2

Sponsorlu Bağlantılar

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.

Kesme interrupt

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.

Proton-Plus-option-register

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

proton TMR0 psa

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.

proje6 devre semasi

Yukarda Kullanılan TMR0 ile yapılan kesmenin zamanı 500 milisaniyedir. Gelin isterseniz bunu beraber hesaplayalım.

proton formul 1

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 proton formul 2 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.

formul3

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.

formul4

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

Proton-Plus-ile-PIC-Programlama-Bolum-2

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.

proton_4.inc

Aşağıdaki kodları Proton Plus ile yazarak derleyiniz ve ISIS simülasyonunu kurarak çalıştırınız.

——————————————————

sema

(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.

proje8

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.

seri iletisim

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.

com3 ozellikleri

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 tüm dosyalar Proton Plus ile PIC Programlama Bölüm 2

Dosya indirme LINK listesi (TXT formatında) link-8560.zip şifre-pass: 320volt.com

  • Selim AY

    Teşekkürler Muhittin bey elinize sağlık

  • mustafa

    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

  • mustafa

    Hocam size ne desem az minnettarım çok teşekkür ederim ,program elime gecti indirdim :D 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.

  • ibrahim

    teşekkürler hocam bu anlatım çok güzel olmuş kesmeler hala kafamı karıştırdı ama deneye deneye öğreneceğim.