PIC Basic Pro ile PIC Programlama 7
Bu dersimizin konusu Seri İletisim.
Konuya seri iletişimin ne oldugunu açıklayarak baslayalım. Dijital bilgi bilindigi üzere bitlerden olusmaktadır. Her bir bit ya 0 (sıfır) yada 1 (bir) olabilmektedir. Bunlar yana yana gelince daha büyük digital bilgiyi olusturmaktadır. Örnegin 8 adet bit 1 adet BAYT bilgisini olusturmakta 16 adet bit ise 1 adet WORD bilgisini olusturmaktadır.
Simdi gelelim bu bilgilerin başka yerlere aktarılması isine. 8 bitlik bir bilginin tek bir seferde başka bir üniteye aktarılması için 8 adet bağlantı ucu kullanırsak yani her bir bit için bir uç kullanır isek bu bir paralel aktarma islemidir. Yine 8 bitlik bir bilgiyi başka bir üniteye tek bir uç kullanılarak aktarmak istersek bu bir seri aktarma islemidir. Her iki sistemde ilave uçlarda olacaktır. Ancak biz sadece bilginin aktarılması için gereken uçlardan bahsediyoruz. İste üzerinde duracagımız konu bu seri bilgi aktarma sistemidir.
Bu sistemde verici ve alıcı ünite bir birlerine tek bir data hattı ile bağlanırlar. Verici gönderdigi bitleri belirli bir formatta yani belirli zaman içinde belirli sayıda bit gönderir. Bu sekilde olusturulan senkronizasyon ile 8 adet bitin gönderilmesi yapılır ve alıcıda bu bitleri teker teker alır. Alıcı ile verici nin bireysel çalısma hızlarının farklılıgından dolayı seri iletişimde bir kural vardır.
Kural birim zaman içinde gönderilen veya alınan bit sayısı ile ifade edilen BAUD RATE yani haberlesme hızı dır. Alıcı ve vericinin aynı senkron içinde alıs verislerinin yapılabilmesi için bu hızın her iki taraf için aynı değere ayarlanması gerekir. Sistemin başka parametreleri de bulunmaktadır. Gönderilen bilginin invert edilmesi her baytın sonunda bir stop biti gönderilmesi , parite kontrolu vs. gibi. İsin teferruatına fazla girmeden konuyla ilgili komutların kullanımına geçecegiz. Basic de seri iletişim komutları birkaç tanedir. Bunları sırası ile açıklayacagız. İlk komutumuz;
SERIN Pin,Mode,{Timeout,Label,}{[Qual...],}{Item…}
Standart Asenkron Seri data giris komutudur. Yani başka bir seri data gönderebilen bir üniteden gelen bilgiyi almak için kullanacagımız komutlardan birisidir. Parametrelerine bakacak olur isek; SERIN komutundan hemen sonra seri datanın alındıgı pin yer almaktadır. Burada PortA.0 veya PortB.2 gibi port pinleri kullanılır. İkinci parametre Mode dir.

Komut yukarıdaki hali ile Mod numaralarının kullanımına imkan tanımaktadır. Sayet komutu Mode isimleri ile kullanmak isterseniz programınızın bas tarafına ; Include “modedefs.bas” Komutunu ilave etmeniz gerekir. Her bir mod da bilginin düzmü yoksa inver edilmis hali ilemi alındıgı bellidir. Sistemin default olarak ayarlanmıs diğer parametreleri şöyledir.
8 data biti , no parity ve 1 stop biti seklindedir. Genel gösterim 8N1 seklindedir. diğer parametre olan ve gerektiginde kullanılmayan Timeout parametresi dir ve 1 ms (milisaniye) cinsinden belirlenir. Anlamı ise burada verilen süre içerisinde herhangi bir data alınmaz ise program Label parametresi ile belirlenen konuma atlar. Dolayısıyla Label’i de açıklamıs oluyoruz. Burada bir program bölümünün ismi (etiketi) verilir .
Bir sonraki parametre qualifier olup belirleyici anlamında kullanılır ve birden fazla olabilir. Genellikle dogru haberlesme yapılabilmesi için gönderilen bilgilerin basına belirli ifadeler yerlestirilir. Bu yerlestirilen bilgilere qualifier denir. Bu bilgiler rakam olabilecegi gibi bir karekter diziside olabilir. En son parametre ise gelen bilginin depolanacagı degisken simidir ve ITEM olarak gösterilmistir.
Buraya kullanacagınız degisken adı yazılacaktır. Örnek vermek gerekir ise ; SERIN PortA.0 , 0 , [“ERO”] , ISI Bu komutta qualifier olarak kullanılan bilgi “ERO” bilgisidir. Program gelen bilgilere sürekli bakacak ve önceden “ERO” bilgisini alır ise arkasından gelen ilk bilgiyi ISI degiskenine koyacaktır. Aksi taktirde ISI degiskeni oldugu gibi kalacaktır. Bu sistem, haberlesmede yanlıs data alımını önleyen güzel bir sistemdir.
diğer Bir komut SERIN2 komutudur. Serin komutuna benzer bir komuttur. SERIN2 , GIRIS , 396 , [WAIT ("W"), DEC AL] Bu komutda da önce data alıs pini belirlenir ve pin otomatik olarak giris olarak ayarlanır. Daha sonra haberlesme hızı belirlenir.
Bu hız için değişik bir hesaplama mantığı kullanılmaktadır. Formül şöyledir. Haberlesme Hızı= (1.000.000/Baud Rate)-20 Örnek verecek olur isek , 2400 baud için hız hesaplayalım Hız= (1.000.000/2400)-20 = 396 olacaktır. (yukarıdaki komutta yazıldıgı gibi) Daha sonra belirli bir karakter veya karakter dizisinin alınması beklenir. Bu karekterlerden sonrada esas data Bin, hex veya dec formatlı olarak alınır.
diğer bir komut HSERIN komutu olup yalnızca Hardware Serial Port’u (USART) olan Pic’ler için kullanılabilir. Bu port PIC16F628 , PIC16F876, PIC16F877 gibi pic lerde bulunmakta 16F84/A da bulunmamaktadır. Dolayısıyla bu komutu kullanabilmemiz için öncelikle kullandıgımız Pic’in bu porta sahip olup olmadıgını ögrenmemiz gerekecektir. Komutun kullanım sekli şöyledir. HSERIN {ParityLabel,}{Timeout,Label,}[Item{,...}] Bu komutun parametreleri Define komutu ile belirlenir. Bunlar; DEFINE HSER_RCSTA 90h (alma yazmacının Enable edilmesi)
DEFINE HSER_TXSTA 20h (gönderme yazmacının Enable edilmesi)
DEFINE HSER_BAUD 2400 (Haberlesme hızının belirlenmesi)
Komutun kullanım sekli genelde asagıdaki sekilde dir HSERIN [BILGI, DEC ZX] Bu komutta tüm parametreler DEFINE komutu ile verilmistir. Dolayısıyla parametre olarak yalnızca Bilgi isimli bir degisken ve arkasından Desimal olarak alınacak olan ZX degiskeni görülmektedir.
Bu komutun en önemli özelligi giris pinlerinin USART özelligine bağlı olarak önceden belirlenmis olmasıdır. Bu pinlerin hangisi oldugu Datasheetler de gösterilmektedir ve kullanıcı tarafından degistirilemez. Dolayısıyla komutun kullanımında pin adı görmezsiniz. Komutun başka bir kullanılıs sekli asagıda gösterilmektedir.
HSERIN 300,ATLA,[WAIT ("ER"),AL]
Bu komutta Timeout süresi 300 ms olarak verilmis ve bu süre sonunda programın ATLA isimli etikete gitmesi saglanmıstır. Komut gelen bilgiler arasında ER karakterlerini arayacak buldugu anda pesinden gelen bilgiyi AL degiskenine yerlestirecektir. Simdiye kadar vermis oldugumuz komutlar data alıs komutları idi. Aynı komutların bir de Data gönderme komutları vardır ve tek fark datanın gönderilmesi dir. Bu komutlarda bir data gönderme pini belirlenir.
HSEROUT komutunda bu pin standart olup degistirilemez. Ancak Serout veya serout2 komutlarında kullanıcı tarafından istenildigi sekilde tanımlanır. Seri haberlesme konusunda son olarak önemli bir konuya dikkatinizi çekmek istiyorum. Pic ve benzeri cihazlarda lojik seviyeler TTL seviyesindedir. Yani bir (1) sinyali +5V , sıfır (0) sinyali ise GND seviyesindedir.
Bu cihazlar kendi aralarında haberlesir iken arada herhangi bir seviye düzenleyici sistem gerekmez. Zira high olarak gönderilen sinyal her iki taraf için +5V dur. Low olan ise GND seviyesindedir. Ancak pic ve benzeri cihazlar bir PC ile haberlesmesi gerektiginde gönderilen veya alınan sinyallerin seviyelerinin düzeltilmesi gerekir. Zira PC lerde High sinyali -12V , low sinyali ise +12 V dur.
Bu is için RS232 çevirici entegresi kullanılması gerekiyor. Genellikle adı MAX 232 veya CP232 olarak geçer. Bu entegrenin RS232 giris ve çıkıs bacakları bulunmaktadır. Dolayısıyla Pic den gelen sinyali (+5V veya 0V – High veya Low) PC nin anlayacagı seviyelere (-10V veya +10v) çevirir. Aynı sekilde PC den gelen sinyalleri de Pic’in anlayacagı seviyelere çevirmektedir.
Dolayısı ile Pic-PC arası yapılacak seri haberlesme devrelerinde bu çeviricinin kullanılması
gerekir. Komutlarla ilgili bu kadar bilgi verdikten sonra örneklerimize geçelim; İlk örnegimiz basit bir Seri iletişim örnegi olacak. SERIN ve SEROUT komutlarını kullanarak bir rolenin çalıstırılmasını gerçeklestirecegiz.
Bunun için 2 adet Pic li devre kullanacagız. Birinci devremiz verici olarak çalısacak ve üzerinde yalnızca iki adet tus bulunacaktır. diğer devremiz ise alıcı olarak çalısacak ve üzerinde 2 adet LED ve 2 adet Role bağlı olacaktır. Önce şemamızı verelim;
Proje 7/1 : Seri – Ver – Al

İlk programımız SERI-VER.BAS
‘****************************************************************
‘* Name : SERI-VER.BAS *
‘* Author : [Erol Tahir Erdal] *
‘* Notice : Copyright (c) 2005 [ETE] *
‘* : All Rights Reserved *
‘* Date : 11.05.2005 *
‘* Version : 1.0 *
‘* Notes : SERI-AL.BAS programının vericisidir. *
‘* : *
‘****************************************************************
@ DEVICE pic16F628 ‘islemci 16F628
@ DEVICE pic16F628, WDT_on ‘Watch Dog timer kapalı
@ DEVICE pic16F628, PWRT_ON ‘Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF ‘Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off ‘MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak
‘——————————————————————————
CMCON=7 ‘16F628 de komparatör pinleri iptal hepsi giris çıkıs
OPTION_REG.7=0 ‘Dahili pull-up lar AKTİF yapıldı ayrıca pull-up direncine gerek yok
PortA=0
TrisA=%00000000
PortB=0
TrisB=%00000011
‘——————————————————————————
SYMBOL CIKIS=PORTA.0
SYMBOL TUSA=PORTB.0
SYMBOL TUSB=PORTB.1
VER VAR BYTE
‘——————————————————————————
PAUSE 200
VER=0
‘——————————————————————————
BASLA: VER=0
IF TUSA=0 THEN
VER=88
gosub gonder
WHILE TUSA=0
WEND
endIF
IF TUSB=0 THEN
VER=66
gosub gonder
WHILE TUSB=0
WEND
endif
PAUSE 100
GOTO BASLA
‘—————–ALT PROGRAMLAR——————————-
GONDER:
SEROUT2 CIKIS,396,["E","T","E",ver]
SEROUT2 CIKIS,396,["E","T","E",ver]
return
END
İkincisi ise SERI-AL.BAS ,
‘*****************************************************************
‘* Name : SERI-AL.BAS *
‘* Author : [E.T.E] *
‘* Notice : Copyright (c) 2005 [ETE] *
‘* : All Rights Reserved *
‘* Date : 13-02-2005 *
‘* Version : 41.00 *
‘* Notes : SERI-VER.BAS PROGRAMININ ALICISIDIR*
‘* : *
‘*****************************************************************
PORTA=0
PORTB=0
TRISA=%00000001 ‘A portu A.0 giris diğerleri çıkıs yapıldı.
TRISB=%00000000 ‘B portu tamamı çıkıs yapıldı.
‘—————————————————————–
@ DEVICE pic16F628 ‘islemci 16F628
@ DEVICE pic16F628, WDT_on ‘Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON ‘Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF ‘Kod Koruma kapalı
@ DEVICE pic16F628, MCLR_OFF ‘MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak
‘—————————degiskenler——————————
AL VAR BYTE
GIRIS VAR PORTA.0
ROLEA VAR PORTB.0
ROLEB VAR PORTB.1
LEDA VAR PORTB.6
LEDB VAR PORTB.7
‘—————————–B A S L A N G I Ç —————————
CMCON=7
CLEAR
PAUSE 500
PORTB=0 ‘tüm çıkıslar low seviyesinde
‘——————————————————————————-
BASLA:
SerIn2 GIRIS,396,[WAIT ("ETE"),AL]
IF AL=88 THEN
TOGGLE LEDA
TOGGLE ROLEA
ENDIF
IF AL=66 THEN
TOGGLE LEDB
TOGGLE ROLEB
ENDIF
PAUSE 200
GOTO BASLA
END
Seri haberlesme isinde en önemli faktörlerin basında alıcı ile vericiyi aynı anda karşı karşıya getirmektir. Bunun muhtelif yolları vardır. Senkronizasyon denilen bu islem için genelde kullanılan yöntem önden bir uyandırma sinyalinin gönderilmesi arkasından belirleme datası ve onun arkasından ise esas gerekli olan data nın gönderilmesidir.
Uyandırma sinyali nedir diyeceksiniz buna genellikle preambl sinyali denilmektedir. Uyandırma sinyali bir sinyal kombinasyonudur. Muhtelif sekillerde olabilir. Benim kullandıgım ve olumlu netice aldıgım kombine sinyal asagıdaki sekildedir.
- İlk sinyal %10101 seklinde bir sinyal arkasından %00000 ve onun arkasından ise %11111 seklinde bir sinyal dir. Bunun komut karşılıgı; SEROUT2 CIKIS,396,[REP$AA\5,REP$00\5,REP$FF\5]
Haberlesmeye baslamadan önce bu komut verilerek karşı taraftaki devrenin alıs moduna geçmesi saglanır. Bu komutun arkasından esas göndermek istediginiz bilgiler gönderilir. Önce belirleme bilgisi yani; (”E”),(”T”),(”E”) bilgisi burada bir belirleme bilgisidir.
Örnek;
SerOut2 CIKIS,396,[("E"),("T"),(”E”),EKLE]
Pesinden esas göndermeniz gereken bilgi veya bilgiler dizisi gönderilir. Sonuçta yukarıdaki örnekte EKLE adlı degisken de yer alan değer göndermek istedigimiz bilgi olmaktadır.
Senkron konusunda hata yapılmaması için genelde gönderme komutu birkaç defa arka arkaya tekrarlanır. Sayet yazılan program satırı çok az ise tek komut da yeterli olabilir. Ancak uzun programlarda gönderme komutunun artırılması gerekir.
Örnek olarak;
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
SerOut2 CIKIS,1646,[("E"),("R"),EKLE]
Örnekte görüldügü gibi en az 5 defa tekrarlanmasında yarar vardır. Bir mahsuru olmadıgı gibi yararı vardır.
Alma komutu tek olabilir. Çünkü senkron saglandıktan sonra gelen sinyallerden birini mutlaka görüp alacaktır. Bu kadar açıklama dan sonra daha komplike bir Seri haberlesme programına geçelim.
Diyelim ki bir televizyona uzaktan kumanda devresi yapmak istiyoruz. Bu devre ile televizyonu açıp kapatmak, volum kontrolu yapmak ve hem Kanal+ ve Kanal- tuşlarını kullanarak kanallar arasında gezinmek hemde sabit kanal (1-5) tuşlarını kullanarak kanal seçmek istiyoruz. İki adet pic kullanacagız. Bu sefer 16F84A kullanalım. Çünki devrenin aslı 16F84 ile yapılmıs idi. Devre şemasını vermeden önce bazı konulara açıklık getirmek gerekiyor.
Volum kontrolu ve program gezinmesi yapacagız. Volum kontrolu için digital pot kullanabilirdik. Ancak program kontrolü açısından bu iside kendimiz yapalım istiyoruz. Hem Volum kontrolu hemde program
gezinmesi için 4051 (Analog swich) kullanacagız.
4051’in ABC adres bacakları 1 adet giris-çıkıs bacagı ve bu bacagın seçilen adrese göre Analog olarak bağlanabildigi 8 adet giris-çıkıs bacagı bulunmaktadır. Volum kontrolu için 16 kademe volum elde etmek üzere 2 adet (2×8=16) 4051 kullanacagız ve toplamda 16 adet volum seviyemiz olacak. Program gezinme için toplam 8 adet kanal çıkısımız olacak.
Bahsini ettigim projeyi bizzat uygulama fırsatım oldu. Sistem hala basarı ile çalısmaktadır. İsin mantıgını izah edecek olur isek, verici olarak çalısan pic üzerinde bulunan ;
- açma / kapama tusuna basıldıgında karşı taraftaki pic de bir pin high / low olacak. (toggle çalısma)
- Volum+ tusuna basıldıgında volum artacak yani 2 adet 4051 çıkısları sırası ile konum degistirecek.
- Aynı sekilde Volum- tusuna basıldıgında yapılan isin tersi yapılacak.
- Program+ tusuna basıldıgında program kademesi bir artacak. Basılı tuttukça artam devam edecek.
- Program- tusuna basıldıgında bu sefer seçim isi terse dönecek.
- Sabit program seçme tuşlarından birine basıldıgında ise ilgili tusa karşılık gelen pin karşı tarafta toggle olarak çalısacak. Ancak bu pin açık olan diğer pinleri iptal edip yanlıca kendisi çıkıs verecek. Bir ayrıntıyı daha izah etmekte fayda görüyorum. İki pic arasındaki bağlantıda bir inverter (NOT) kullanılmıstır. Aslında gerekli olmayan bu elemanı Seri haberlesme komutlarında alıcı veya vericiden birini invert edilerek kullanılmasını göstermek amacı ile yaptım.
İste şemamız. Biraz karısık gibi gelebilir ama iyice takip edilirse kimin nereye bağlı oldugu kolaylıkla görülecektir.
Önce Verici Kısmına ait programı verelim;
‘****************************************************************
‘* Name : Verici4.BAS *
‘* Author : [Erol Tahir Erdal] *
‘* Notice : Copyright (c) 2005 [ETE] *
‘* : All Rights Reserved *
‘* Date : 11.05.2005 *
‘* Version : 1.0 *
‘* Notes : ALICI4.BAS programının vericisidir. *
‘* : *
‘****************************************************************
INCLUDE “MODEDEFS.BAS”
TRISA=%11110
TRISB=255
OPTION_REG.7=1 ‘pull-up lar iptal
‘——————————————————————————-
CIKIS VAR PORTA.0
VER VAR BYTE
TUS VAR BYTE
POZ VAR BIT
poz=0
‘——————————————————————————-
START : VER=0
TUS=PORTB
IF TUS =1 Then BIR ‘basılan veya basılı tutulan tusun değeri
IF TUS =2 Then IKI ‘burada okunuyor
IF TUS =4 Then UC
IF TUS =8 Then DORT
IF TUS =16 Then BES
IF TUS =32 Then ALTI
IF TUS =64 Then YEDI
IF TUS =128 Then SEKIZ
POZ=0:GoTo START
BIR: IF POZ=1 Then START ‘on/off tusu basılı tutuluyor ise islem yapma
POZ=1
VER=11
GoTo EXIT ‘On/off tusuna ilk basıldı tus değeri=11 gönder.
IKI: VER=22
GoTo EXIT ‘Volum+ tusuna basıldı tus değeri=22 , gönder
UC: VER=33
GoTo EXIT ‘Volum- tusuna basıldı tus değeri=33, gönder
DORT: VER=44
GoTo EXIT ‘Program+ tusuna basıldı Tus değerini gönder
BES: VER=55
GoTo EXIT ‘Program- tusuna basıldı tus değerini gönder
ALTI: IF POZ=1 Then START ‘Sabit Program tuşları toggle yapacak
POZ=1
VER=66
GoTo EXIT
YEDI: IF POZ=1 Then START ‘Sabit program tuşları toggle yapacak.
POZ=1
VER=77
GoTo EXIT
SEKIZ:IF POZ=1 Then START ’sabit program tuşları toggle yapacak
POZ=1
VER=88
EXIT: SerOut CIKIS,T2400,[("A"),VER,13,10] ‘tus değerini gönder, değer ters çevrilmemistir
GoTo START
END
Program kısa oldugu için preambl sinyali kullanmadık.
Simdi Alıcı Kısmını verelim;
‘****************************************************************
‘* Name : Alıcı4.BAS *
‘* Author : [Erol Tahir Erdal] *
‘* Notice : Copyright (c) 2005 [ETE] *
‘* : All Rights Reserved *
‘* Date : 11.05.2005 *
‘* Version : 1.0 *
‘* Notes : Verici4.BAS programının alıcısıdır. *
‘* : *
‘****************************************************************
TRISA=%00001
TRISB=0
GIRIS VAR PORTA.0
VOLUM VAR BYTE
ARA VAR BYTE
PROG VAR BYTE
ERO VAR BYTE
KON VAR BYTE
NE VAR BIT
SES VAR BYTE
POZ VAR BYTE
AL VAR BYTE
‘——————————————————————————-
INCLUDE “MODEDEFS.BAS”
PORTB=0
PORTA=0
Read 0,VOLUM ‘volum değeri Pic’in eepromundan sıfır nolu adresten okunuyor
IF VOLUM=255 Then ’sayet herhangi bir değer önceden kayıt edilmemis ise
VOLUM=3 ‘default volum seviyesini 3 kabul ediyoruz.
EndIF
Read 1,PROG ‘hangi programın seçili bırakıldıgını yine eeprom 1 adresten
IF PROG=255 Then ‘okuyoruz ve herhangi bir program kayıtlı degil ise
PROG=0 ‘default program=0 kabul ediyoruz.
EndIF
KON=VOLUM>>3 ‘Volum konumu ara değer
SES=VOLUM-(KON*8): ‘volum esas değeri
ARA=(SES+PROG*8)+128-(KON*64) ‘hem program hemde ses değeri 8 bit olarak
PORTB=ARA ‘toparlanıp PortB ye yazılıyor.
‘——————————————————————————-
START : AL=0
Serin GIRIS,N2400,[ "A" ],AL ‘Basılan tus bilgisini al
IF AL=11 Then BIR ‘basılan tus değeri 11 ise Bir’e git
IF AL=22 Then IKI ‘22 ise IKI ye git
IF AL=33 Then UC ‘33 ise UC e git
IF AL=44 Then DORT ‘44 ise DORT’ e git
IF AL=55 Then BES
IF AL=66 Then ALTI
IF AL=77 Then YEDI
IF AL=88 Then SEKIZ
POZ=0
GoTo START
BIR: Toggle PORTA.1 ‘ON / OFF ‘On/off çıkısı toggle yapıldı
CIK:GoTo START
IKI:VOLUM=VOLUM+1 ‘ volum tusuna basılmıs volum bir artırıldı
IF VOLUM>15 Then ’sayet 15 den büyük ise 15 de kal
VOLUM=15
EndIF
‘Volum<8 ise 1.4051 >8 ise 2.ci 4051 devrede olacak
VOLKAY:KON=VOLUM>>3 ‘Kon=%00001101 ise Kon=%00000001 oluyor
SES=VOLUM-(KON*8) ‘Ses=13-(8×1)=5 bulunuyor.
ARA=PORTB & 56 ‘ARA değeri program seçimi için 4051′in adresi
ARA=ARA+SES+128-(KON*64) ‘Volum ABC değeri + Prog ABC değeri +
PORTB=ARA ‘Volum 4051 seçim değeri tamamı PortB ye yazılıyor
Write 0,VOLUM ‘yeni Volum değeri EEPROM’a yazılıyor
Pause 44
GoTo START
UC: VOLUM=VOLUM-1 ‘Volum- tusuna basılmıs değer bir azaltılıyor
IF VOLUM=255 Then ‘değer sıfırı geçerse tekrar sıfırda kalıyor.
VOLUM=0
EndIF
GoTo VOLKAY ‘degisen volum değerini kayıt et
DORT: PROG=PROG+1 ‘program tusuna basılmıs bir artır.
IF PROG>7 Then
PROG=0
EndIF
PORKAY: ARA=PORTB & 199 ‘199=%11000111 olup 4051 select ve adres değerini al
ERO=PROG<<3 ‘yeni program değerini hesapla ve kayıt et
ARA=ARA+ERO ‘PROG=6 olsun ERO=%00011000 oldu
PORTB=ARA ‘ARA=Volum ABC + Prog ABC ve Selec değerleri toplamı
Write 1,PROG ‘Önce porta yazılıyor Prog değeri Eeproma kayıt ediliyor
Pause 74
GoTo START
BES: PROG=PROG-1
IF PROG=255 Then ‘PROGRAM ASAGI
PROG=7
EndIF
GoTo PORKAY
ALTI: Toggle PORTA.2 ’sabit program tuşlarından birine basılmıs
GoTo START
YEDI: Toggle PORTA.3
GoTo START
SEKIZ:Toggle PORTA.4
GoTo START
end
Programlarda özellikle Alıcı programında bazı hesap satırları var bunların açıklanmasında fayda görüyorum.
şemadan görülecegi üzere, B portu B0-B1-B2 pinleri ile Volum için çalısan 2 adet 4051 entegresini adreslemektedir. Adres değeri 0-15 arasında degismekte olup 0-7 arasındaki değerler ilk 4051’i adreslemekte 8-15 arasındaki değerlerde ise otomatik olarak ikinci 4051 seçilerek adres değeri bu entegrenin kullanacagı (0-7) değerine indirgenerek kullanılmaktadır.
B portunun B3-B4- ve B5 nolu pinleri ise program seçimi için kullanılan 4051 entegresini adreslemektedir. Kalan B6 ve B7 pinleri ise Volum entegrelerinden hangisi seçilecek ise onu aktif hale getirmek için kullanılmaktadır (chip Select). Simdi hesap sistemini inceleyelim. Önce Volum kayıt bölümüne bakalım;
KON=VOLUM>>3 ilk satırda bu komut bulunmaktadır. Volum değerini 3 bit saga kaydırıp yeni değeri KON adlı degiskene yerlestir anlamındadır. Neden bu isi yaptıgımızı bir sonraki satırda açıklayacagız. Sonra gelen satırda ;
SES=VOLUM-(KON*8) seklinde bir islem var. 2 adet 4051 entegremiz var ama her ikiside aynı adreslemeyi kullanıyor. Dolayısıyla adres olarak verecegimiz değer 0-7 arasında olacaktır. Halbuki bizim Volum değerimiz 0-15 arasında değişiyor. Bu hesap ile Ses seviye adreslemesini volum değerine bağlı olarak 0-7 seviyesine düsürmekteyiz.
Diyelim ki Volum seviyemiz 14 olsun. Bu durumda KON= 14 >> 3 = %00001110 değeri %0000001 olacaktır. Yani KON=1 olacaktır. SES=14 – (1*8) = 6 yani volum için 4051 adres değeri 6 (%00000110 ) olacaktır. ARA=PORTB & 56 (56=% 00111000 dir ve bu program seçme adres değeridir) ARA=ARA+SES+128-(KON*64) Volum için hangi 4051 seçili olacak buna 128-(Kon*64) hesabı karar vermektedir.
Örnegimizde Kon=1 idi 64*1=64 olup 128-64=64 olacaktır. Dolayısıyla B6 veya B7 den hangisi Low ise ona bağlı entegre seçilmis olmaktadır. Bu hesap sonucunda B7’ye bağlı olan entegre seçilmis olacak çünki volum değeride 14 idi yani 7 den büyük idi. Volum değeri 8 den küçük olur ise yukarıdaki hesap 128 olarak çıkacak olup böylece ilk 4051 seçilmis olur otomatikman. Böylece PortB deki tüm bitlerin durumunu hesap etmis oluyoruz.
Bunları toplar isek; ARA= ARA + 6 + 64 = ARA+70 olarak bulunan değer direkt Port B ye yazılarak islem
tamamlanır. Benzer bir hesap Program tusuna basılınca da yapılmaktadır. Bu hesabın çözümünüde size
bırakıyorum.
Bu program içinde geçen ara komutlara bir göz atmakta fayda var. Bunların basında READ ve WRITE komutları geliyor.
Pic lerin pek çogunda eeprom hafızası oldugunu hepimiz biliyoruz. Bazı durumlarda bu hafızaları kullanmak gerekir. Elektrik ile yazılıp silinen bir hafıza oldugundan yazılan bir değer özellikle silinmedikten sonra Pic’in voltajını da kesseniz silinmez. Bu yüzden saklanması gereken bilgiler burada saklanabilir. Bu programda da Volum ve Program değerleri bu hafıza da saklanmıstır. Bu sayede televizyonu kapattıgınız anda hangi programda kaldınız ise ve volum seviyeniz ne ise tekrar açtıgınızda aynı seviyelere ulasmıs oluyorsunuz.
Simdi gelelim komutlar nasıl kullanılıyor.Pic hafızaları 8 bitlik yani 1 baytlık hafızadır. Her hafızanın 0 (sıfır) dan baslayan bir adres numarası vardır. Bu adres numarası kullanılarak istenilen bir adresteki hafızaya ulasılabilir.Hafıza ya yazma için kullandıgımız komut WRITE dır. Parametreleri Adres ve
yazılacak değerdir. Yani komut;
WRITE 0 (adres), BILGI (yazılacak değer) olarak çalısmaktadır. Hafıza dan okuma yapmak için kullandıgımız komut ise READ komutudur. Aynı sekilde adres ve değer parametresi vardır. Kullanılıs sekli;
READ 0(adres), BILGI (okunacak değer) olarak dır. Yazma ve okuma islemi yaklasık 10 ms kadar bir sürede yapılır. Sayet program içinde kesme kullanılıyor ise hatalar ortaya çıkabilir. Bunu önlemek için bu komutlardan önce kesme iptal edilmelidir (disable ile degil direkt iptal) . İslemden sonra kesme tekrar açılmalıdır.
Hazırlayan: Erol Tahir Erdal (ETE) - PICBASIC PRO Dersleri8

