Elektronik / Elektronik Kaynakları/

Proton Plus ile PIC Programlama Bölüm 1

Sponsorlu Bağlantılar

Hazırlayan: Muhittin KAPLAN – Proton ile pic programlamaya başlamak isteyenler için çok iyi detaylı bir kaynak olacağı kesin. Örnek devreler ile bolca uygulama bulunuyor komutlar detaylı olarak açıklanıyor. Emeği geçen hazırlayan kişilere teşekkürler.

Proton Plus, Bu iki kelimenin ne anlama geldiğini biliyorsanız; bu kitapta, diğer kitaplarda bahsedilen elektriğin, elektroniğin ve programlama dillerinin tarihçelerinden bahsetmeyerek, kitabımızın esas konusu olan Proton Plus ile PIC programlamaya doğrudan geçeceğiz (Programı Kullanmaya yönelik işlemleri yeri geldikçe değineceğiz)

Nasıl PC programlamada “Merhaba Dünya” ilk aşama ise, PIC programlamada bir LED yakıp söndürmek ilk aşamadır. Şimdi isterseniz “Merhaba Dünya” diyerek ilk projeye geçelim

Proton Plus ile PIC Programlama Proje 1;

Amaç: Portların Giriş Ve Çıkış Olarak Ayarlayabilmek ve LED yakıp söndürebilmek.

Kullanılan Yeni Komutlar;

Output: Bir Port ya da Portun pin ini Çıkış yapmak İçin kullanılır, Tris kayıtçılarının Yerini Kullanılan Bir Komuttur. Burada Tris Kayıtçılarından Biraz Bahsetmek gerekir. Tris kayıtçıları Portları Yönlendirmek Yani giriş ya da çıkış olarak ayarlamak için kullanılır. Her portun bir Tris kayıtçısı bulunur. Kullandığımız 16F877 de bulunan dört adet portun her birinin bir Tris kaydecisi vardır ve TrisA,TrisB,TrisC,TrisD, TrisE gibi port adıyla sembolize edilirler ve Bu Kayıtcılara eğer “0” atanırsa “Çıkış” olarak “1” Atanırsa giriş olarak Ayarlanırlar. Aşağıdaki kodlardarda bulunan “Output PORTB” Satırı yerine “TrisB=%00000000” Kullanmamız Sonuç açısından Bir şey değiştirmezdi.

DelayMS: Komut İşlemcinin belirtilen sure kadar beklemesini sağlar. Bu bekleme esnasında işlemci herhengi bir işlem yapmaz. Komut Xtal bildirisinden etkilenmez. Eğer Xtal bildirisi yapılmazsa default olarak Proton Plus 4 mHz e gore işlem yapar.

Örnek;

DelayMS 200 ‘200 milisaniye bekle

Komutla bağlantılı olarak;

DelayUs ;

Komut istenen sure kadar bekleme yapar. Bu komut mikrosaniye bekleme yapar.

Snooze;

Bu komut kısa süreli olarak LowPower Modda bekleme yapar.

Sleep;

Komut, Saniye biriminden LowPower Modda Bekleme yapar

goto

GoTo: Belirtilen Etikete gider. Proton Plus da etiketler: (iki nokta) ile bitmelidir. Bu etiketleri Proton

Plus Ide programının yanda görülen bölümden (Code Explorer) takip edebilir ve hızlıca etikete gidebilirsiniz.

End : Program sonunu belirlemek için kullanılır. Program burada Sonsuz döngüye girer (Stop komutu da aynı işlemi yapar.) Aşağıdaki devreyi Proteus simulasyon programında kurduktan sonra

proton ornek devre

Aşağıdaki kodları Proton Plus ide programı kod ekranına yazarak ilk programımızı oluşturalım.

	Device 16F877 	'Proğramlanacak PIC=16F877
	XTAL 4 			'Osilatör Hızı 4 Mhz
	Output PORTB   	'PortB çıkış
	PORTB=$00 		'Portb ye 00 hexadecimal sayısını at.
basla: 				'Başla Etiket
	PORTB=$01 		'PortB ye 01 hex sayısını ay
	DelayMS 200 	        '200 milisaniye bekle
	PORTB=$00 		'portB ye 00 hex sayısını at
	DelayMS 200      	'200 milisaniye bekle
	GoTo basla 		'başla etiketine git
	End 			        'program sonu

proton ide proje1 bas

Yazılan bu programı derlemek yani PIC için anlamlı hale getirmek için Proton Plus Ide den “Compile Only” Butonuna Basmanız Yada klavyeden “F9” u kullanmanız gerekmektedir.

Yeri gelmişken Proton Plus da kullanılan sayı sistemlerinden biraz bahsedelim. Proton Plus da hexadecimal,decimal ve binary sayı sistemlerini kullanılabiliriz.

PORTB=$10		  ‘PortB ye 10 hexadecimal sayısını ata 
PORTB=%00010000	  ‘PortB ye 00010000binary sayısını ata 
PORTB=10		  ‘PortB ye 10 decimal sayısını ata

Dikkat ettiyseniz Proton Plus da Hexadecimal Sayılar “$”,Binary Sayılar “%” ön ek alırlar. Decimal Sayılar ise herhangi bir ön ek almazlar. Yukarıdaki örneklerde görüldüğü gibi portB ye atanmış olan sayıların hepsi aynı görünmesine rağmen değer olarak birbirinden oldukça farklıdır. Unutulmaması ve dikkat edilmesi gereken husus ise şudur, mümkün olduğunca Hexadecimal sayı sistemini kullanmanızdır.

Şimdi yeni bir proje ile bir sayıcı ile Port yönlendirme işlemine devam edelim.

Proton Plus ile PIC Programlama Proje 2;

Amaç; Port ların Giriş Ve Çıkış Olarak Ayarlayabilmek, For..Next Döngüsü Kurabilmek, Değişken Tanımlaması Yapabilmek

Kullanılan Yeni Komutlar;

Dim: Herhangi bir BASIC diliyle daha önce program yazmış bir kişi bu bildiriye aşinadır. Yalnız bu bildiriyi ilk kez duymuş olabilirsiniz. Bu bildiri Proton Plus da değişken atamak için kullanılır. Peki, nedir bu “değişken atamak” ? Basitçe açıklayacak olursak; “Programın işleyişi esnasında içerisindeki bilgiyi değiştirebileceğimiz bir alan” olarak açıklanabilinir. Dim bildirisi ile atanan değişkenler, sayıların boyutlarına göre çeşitlilik gösterirler. Bunlar;

Dim Sayi As Bit En temel tanımlamadır. Bu tanımlama ile yapılan değişten 0-1(yada True-False) değerlerinden başka değer alamaz. Mcu nun hafızasında 8 bitlik yer kaplar

Dim Diger as Byte Tanımlama ile yapılan değişken 0-255 decimal (00-FF Hexadecimal )arasında değer alabilir. Hafızada 8 bit (1 byte) lik yer kaplar.

Dim Dongu as Word Yukarıdaki tanımlama 0 ile 65535 arasında decimal (0000-FFFF Hexadecimal) değer alabilir. Bu tanımlama Mcu hafızasında 2 byte lık yer kaplar.

Dim Deger as Dword Bu değişken tanımlaması -2.147.483.648 ile +2.147.483.647 arasında değer alabilir ve hafızada 4 byte lik yer kaplar.

Dim Ondalik as Float Bu tanımlama Ondalık sayıları saklayabilek değişken tanımlama için kullanılır. Örnek verecek olursak Pi sayısını hafızaya atmak için Float türü değişken tanımlamak gerekir. Bu değişken türü hafızada 4 byte lık yer tutar.

Clear: Bu komut Herhangi bir port u, Port pin’ini, değişkenin içeriğini “0” la doldurarak içeriği temizler.

For…Next: Bu komut takımı değişkenlerle beraber kullanılır. “For” ile başlangıcı bildirilen değişkenin “To” ile Sonu bildirilerek “For” ve “Next” arasındaki komutların işletilmesi sağlanır.

Örnek:

Dim Sayi as Byte
For Sayi=10 To 100 step 1
Portb=Sayi
Next

Byte olarak tanımlanmış sayi değişkeni kullanılarak düzenlenmiş For Next döngüsü için sayi değişkeni 10 dan (For sayi=10) başlayarak 1 er adım aralıklı (step 1) ,100 e kadar (to 100) Portb=sayi işlemini yapacak. Yukardaki kod 90 kez “Portb=Sayi” komutunu işler.

Aşağıdaki devreyi Proteus simulasyon programında kurduktan sonra

proton ornek devre proje2

Aşağıdaki programı yazarak derleyiniz. Daha sonra Proteus Simulasyon Programında çalıştırınız.

Device 16F877 		  'Proğramlanacak cihaz 16F877
	XTAL 4 			  'Osilatör Hızı 4 Mhz
	Output PORTB 	          'PortB çıkış
	Clear PORTB 	          'portb yi temizle.
	Dim Sayi As Byte        'Sayi adında Byte Büyüklüğünde (8 bit-maksimum '255) bir değişken Tanımla

basla: 'Etiket Başla
	For Sayi=0 To 255      '0 dan başlayarak 255 e kadar For ile Next 'arasındaki kodları Çalıştır.256 kez
	PORTB=Sayi 		  'Sayi değişkeninini Portb ye ata
	DelayMS 100 	          '100 ms bekle
	Next 			  'Eğer Sayı 255 den küçükse döngüye devam et
	GoTo basla 		  'Baslaya geri git
End

Proton Plus ile PIC Programlama Proje 3;

Amaç; Port ların Giriş Ve Çıkış Olarak Ayarlayabilmek, If .. Endif komutları ile Kontrol Sağlamak.

Kullanılan Yeni Komutlar;

Input: Komut Portu yada Portun bir pinini Giriş Yapmak için kullanılır. Input Portb.0 ile TrisB.0=1 sonuç olarak aynı işlemi yapmaktadır.(Proje1 Output Komutuna Bakınız)

If Endif: Bu Komut seti en basit karşılaştırma komutudur ve neredeyse tüm programlama dillerinde kullanılır. “if” ile belli bir şart sorgulanır. Proje Kodlarına bakacak olursak (If PORTB.0=1) PortB nin 0 numaralı pini 1 mi değilmi sorgulaması yapılıyor. Eğer Sorgulama sonucu doğruysa “Then” ten Sonraki Komutlar, Yanlışsa “Else” den Sonraki Komutlar Çalıştırılır ve “endif” ile Sorgulamadan Çıkılır

Aşağıdaki Devre üzerinde Yapacağımız bu projede PortB nin 0 numaralı pinini (RB0) giriş

proton led buton devresi

olarak belirttikten sonra bu pini devamlı surette kontrol ediyoruz. Kontrol sonucu eğer “1” sel PortB nin 1 numaralı pinine (RB1) bağlı ledi yakıyor, RB0 eğer “0” sa söndürüyoruz.

Devrenin Kodları Aşağıdaki Gibidir.

        Device 16F877		'Proğramlanacak cihaz 16F877
        XTAL 4			    'Osilatör Hızı 4 Mhz
        Output PORTB.1		'PortB nin 1 inci pini  çıkış
        Input  PORTB.0		'portB nin 0 ıncı pini Giriş.
        
                
basla:	                    'Başla Etiket
        If PORTB.0=1 Then	'Eğer Portb.0=1 se Aaşağıdaki Kodu Çalıştır Değilse "ELSE" in ltındakini çalıştır
            PORTB.1=1
        Else                 'Portb.0=1 değilse Aşağıdai Kodu Çalıştır.
            PORTB.1=0
        EndIf               'İf Sonu
        GoTo basla         'Baslaya geri git
        End					'Program Sonu

Programın çalışmasını proje3 klasörünün içerisindeki proje3.avi video dosyasından izleyebilirsiniz. Bu arada, Proton Plus ile yazılan bu programın Proteus simülasyonuna nasıl tanıtılacağından hiç bahsetmedik bunun için hazırlanan video genel klasörü içerisindeki “KodTanıtma.avi” dosyasında anlatılmıştır.

Proton Plus ile PIC Programlama Proje 4;

Amaç; 7 Segment Display İle Sayıcı Yapımı, LookUp ile Çevrim Tablosu Oluşturmak

Kullanılan Yeni Komutlar; Lookup

proton display projesi

Proton Plus için yazılan kodlar aşağıdadır. Kodları Yazıp derleyerek Proteus Simulasyonunda çalıştırabilirsiniz

        Device 16F877       		'Cihaz 16f877
        XTAL 4              		'Cristal 4 Mhz
        Output PORTD        		'PortD Çıkış          
        Clear PORTD         		'Portd Temizle
        Dim Index As Byte   		'Dongu Adında 1 byte lık Değişken
         
Basla:
        For Index=0 To 9    '0 dan başlayarak 9 a kadar say	'index in değerine gore portd ye 	'bilgileri ata  
        PORTD=LookUp Index ,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F]
        DelayMS 200			'200Ms bekle
        Next				'For-next
        GoTo Basla			'Başla etiketine dön
        Stop

Burda Yeni kullanılan komut ise LookUp dır. Lookup, değerleri sıralı olarak geri döndürebilen birkomuttur. Yukarıdaki programda kullanımını özetleyecek olursak;index değerine bakarak bu değere denk gelen sıradaki bilgiyi portd ye atmaktadır. Lookup da deger “0” dan başlayarak ilerler.

proton lookup

Yukarıdaki örneği biraz açacak olursak index değeri 0 olduğunda $3F, index değeri 1 olduğunda $06, index değeri 2 olduğunda ise $5B değerini portd ye yükler ve öyle devam eder. Proton Plus da kullanılan ve bu komutla ilgili olarak LookUpL, LookDown, LookDownL komutları vardır. Aşağıda tabloda bu komutların kullanımı kısaca özetlenmiştir.

Variable = LOOKUPL Index , [ Value { , Value…etc } ]

Bu komutun lookUp ile çalışma açısından farkı yoktur. Tek farkı lookup komutunda değerler sadece sayısal olabilir. LookUpL de ise değerler değişken ya da sabit olabilir.

Variable = LOOKDOWN Index , [ Constant { , Constant…etc } ]

Lookdown komutu çalışması açısından lookup ın tersi işlem yapar. Bir örnekle inceleyecek olursak;

DIM Value as BYTE 
DIM Result as BYTE 
Value = 177 
Result = 255 
Result = LOOKDOWN Value , [75,177,35,1,8,29,245]

Value (177) değeri ile, bilgileri [75,177,35,1,8,29,245] karşlaştırarak hangi sırada ise o sayıyı (1) geri dönerir. Çünki değer 1 sıradadır

Variable = LOOKDOWNL Index , {Operator} [ Value { , Value…etc } ]

Komut Lookdown dan farklı olarak operatörler (=,>,<,>=,<=) kullanılabilinir.

Proton Plus ile PIC Programlama Proje 5;

Amaç; 8×8 LED Matris Kullanımı, Port Tarama Mantığı, Bit Kaydırma Komutları

Kullanılan Yeni Komutlar; <<, Sola kaydırma 8x8 LED matris toplamda 64 adet LED den oluşan bit görüntüleme elemanıdır. Satırlar ve sütunlar olmak üzere girişleri vardır. Aşağıda Kodları ve şeması verilmiş Projenin simulasyonu yaparak 8x8 Matris te “P” imgesini görebilirsiniz. matris led

	Device 16F877
	XTAL 4
	Output PORTD
	Output PORTB
	Dim Sutun As Byte
Basla:
	PORTB=$01
	For Sutun=0 To 7
		PORTD=LookUp Sutun ,[$FF,$FF,$8f,$77,$77,$00,$00,$FF]
		DelayMS 1
		PORTB=PORTB << 1
	Next
	GoTo Basla
End

Programda kullanılan yeni komut Proton Plus da Bitwise işlemleri olarak adlandırılan, komutlardan “<<” operatörüdür ve bir değişkenin, Port içeriğini Belirtilen kadar Sola Kaydırma İşlemi Yapar.”>>” operatörü ise bir değişkenin, Port içeriğini Belirtilen kadar Sağa Kaydırma İşlemi Yapar

proton matris proje5

Proton PIC Programlama derslerine ait kaynak isis simülasyon ve proton kod dosyaları: Proton Plus ile PIC Programlama Bölüm 1

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

Kayak yazı picproje forumlarında bulunuyor konu hakkında uygulama videosuda umarım yakında eklenecek gelişmeleri buradan takip edebilirsiniz

  • aykut54(picproje.org)

    selam muhittin hocam yapmış olduğunuz sunumlar güzel @gevv hocamda,bende protonda yeni adım atmaya başladık

    bir önerim olucak bu derslerde hep farklı serilerdeki MCU’lardan bahsedecekmisiniz?

    örnek 10f.12f.18f?

    selamlar

  • operatör

    hocam çok teşekkür ederim yanlız bir sorum olacak;benim gibi pic programlamaya başlamayı düşünen ama biraz ürkenler için en basit yol bu verdiğiniz dilmidir?

  • aykut(picproje.org)

    evet hocam en basit dil budur pic programlamaya başlıcaksan bundan başla
    sonra istediğin dile geçersin

  • Muhittin KAPLAN

    @Aykut54
    Hocam derslerin Sonuna Doğru (Kısmet Olurda Bitirebilirsem) 18F4550 ile USB HID çalışması planlıyorum.

    @Operatör
    En Basiti demek biraz zor olur çünki doğrudan şematik den program derleyebilen followcode gibi programlar mevcut. ama diğer dillere göre (Ansi C, Asmbly) daha kolay olduğu söylenebilinir.

  • Ahmet79

    Ellerine sağlık Muhittin KAPLAN

  • Reisalp

    Allah razı olsun hocam sizlerin sayesinde bir şeler kapıyoruz sağolun var olun

  • ömer

    selamlar arkadaşlar

    proton da yeniyim

    5-6 bitlik bir bilgi kontrol etmem gerekiyor kontrol edeceğim bitler pcb de dağınık şekilde duruyor eğer sadece portb yi okuyacak olsam işlem kolaydı ama portlar dağınık olarak verildiğinden nasıl yapacağımı bulamadım yardımcı olursanız sevinirim

    pbp ile şöyle yapabilirdim

    if porta.0=0 and porta.3=0 and portc.1=0 and porte.1=0 then goto prg1
    if porta.0=0 and porta.3=0 and portc.1=0 and porte.1=1 then goto prg2
    if porta.0=0 and porta.3=0 and portc.1=1 and porte.1=0 then goto prg3
    if porta.0=0 and porta.3=0 and portc.1=1 and porte.1=1 then goto prg4
    if porta.0=0 and porta.3=1 and portc.1=0 and porte.1=0 then goto prg5
    if porta.0=0 and porta.3=1 and portc.1=0 and porte.1=1 then goto prg6
    if porta.0=0 and porta.3=1 and portc.1=1 and porte.1=0 then goto prg7
    if porta.0=0 and porta.3=1 and portc.1=1 and porte.1=1 then goto prg8
    if porta.0=1 and porta.3=0 and portc.1=0 and porte.1=0 then goto prg9
    if porta.0=1 and porta.3=0 and portc.1=0 and porte.1=1 then goto prg10
    if porta.0=1 and porta.3=0 and portc.1=1 and porte.1=0 then goto prg11
    if porta.0=1 and porta.3=0 and portc.1=1 and porte.1=1 then goto prg12
    if porta.0=1 and porta.3=1 and portc.1=0 and porte.1=0 then goto prg13
    if porta.0=1 and porta.3=1 and portc.1=0 and porte.1=1 then goto prg14
    if porta.0=1 and porta.3=1 and portc.1=1 and porte.1=0 then goto prg15
    if porta.0=1 and porta.3=1 and portc.1=1 and porte.1=1 then goto prg16

    bunu bana proton ile yapabilecek olan arkadaştan yardım istiyorum

    saygılar
    gogoce@mynet.com

  • feyyaz kurt

    Muhittin hocam eline sağlık. Daha çok kaynak, döküman lazım hocam. :)
    devamını sabırsızlıkla bekliyorum.