Elektronik Devreler Projeler Elektronik ve biraz daha fazlası İletişim - Araçlar - Dikkat - Topluluk
Elektronik / Elektronik Kaynakları/

PICBasic Dersleri PIC Basic Pro ile PIC Programlama 7

Sponsorlu Bağlantılar

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.

SERIN-Pin-Mode-Timeout-Label-Qual-item

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

picbasic-proje-seri-al-ver

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

al-ver-devre-semasi-isis-picbasic

Ö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 Dersleri PIC Basic Pro ile PIC Programlama 7 Kod ve simülasyon dosyaları: pic-basic-pro-ile-pic-programlama-ders-7.zipDers-8 Devam

  • FERDİ GÜRTEKİN

    Hocam aşağıdaki kedları yazdım fakat bir türlü çalışmadı yardımcı olabilirmisiniz rica etsem.

    ;verici
    include”modedefs.bas”
    TRISC=0
    TRISB=255
    ADCON1=7
    AL VAR BYTE
    GON VAR BYTE
    AL=0
    PORTC=0
    PORTB=0
    BEKLE:
    IF PORTB.0=0 THEN ;PORTB.0 EGER 0 İSE BILGIYI GONDER
    PAUSE 500
    GOTO GONDER
    ENDIF

    GOTO BEKLE
    GONDER:
    GON=41
    serout2 PORTC.0,396,[REP$AA\5,REP$00\5,REP$FF\5]
    serout2 PORTC.0,396,[(“G”),(“S”),GON] ;BILGIYI GONDER
    serout2 PORTC.0,396,[(“G”),(“S”),GON]
    serout2 PORTC.0,396,[(“G”),(“S”),GON]
    serout2 PORTC.0,396,[(“G”),(“S”),GON]
    serout2 PORTC.0,396,[(“G”),(“S”),GON]
    serout2 PORTC.0,396,[(“G”),(“S”),GON]
    GOTO BEKLE
    END

    /////////////////////////////////////////////////////////////
    ;alıcı
    include”modedefs.bas”
    DEFINE ADC_CLOCK 3
    DEFINE ADC_SAMPLEUS 50
    TRISB=0
    TRISA=255
    TRISC=255
    PORTB=0
    ADCON1=%00000100

    i var byte
    al var byte
    pause 100
    i=00
    AL=100
    basla:

    serin2 portc.7,396,[wait (“gs”),al] ;GS BILGISINI BEKLE
    if al=41 then ;EGER AL 41 İSE PORTB.0 DAKI LEDI YAK

    goto yak
    endif
    goto basla
    yak:
    PORTB.0=1
    PAUSE 1000
    goto yak
    end
    /////////////

  • ete

    programlar buraya koyduğunuz şekilde ise çalışmayacaklardır.
    Çalışması için aşağıdaki şekilde olmaları gerek.

    Ete

    Verici;
    include”modedefs.bas”
    TRISC=0
    TRISB=255
    ADCON1=7
    cmcon=7
    OPTION_REG.7=0
    AL VAR BYTE
    GON VAR BYTE
    AL=0
    PORTC=0
    PORTB=0
    BEKLE:
    IF PORTB.0=0 THEN gosub GONDER ;PORTB.0 EGER 0 İSE BILGIYI GONDER

    GOTO BEKLE
    GONDER:
    GON=41
    serout2 PORTC.0,396,[REP$AA\5,REP$00\5,REP$FF\5]
    serout2 PORTC.0,396,[(“G”),(“S”),GON] ;BILGIYI GONDER
    serout2 PORTC.0,396,[(“G”),(“S”),GON]
    serout2 PORTC.0,396,[(“G”),(“S”),GON]
    RETURN
    END

    Alıcı:
    include”modedefs.bas”
    DEFINE ADC_CLOCK 3
    DEFINE ADC_SAMPLEUS 50
    cmcon=7
    TRISB=0
    TRISA=255
    TRISC=255
    PORTB=0
    ADCON1=%00000100

    I var byte
    AL var byte
    pause 100
    i=0
    AL=100
    basla:

    serin2 portc.7,396,[wait (“GS”),al] ;GS BILGISINI BEKLE
    if al=41 then GOSUB yak;EGER AL 41 İSE PORTB.0 DAKI LEDI YAK
    goto basla

    yak:
    TOGGLE PORTB.0
    PAUSE 1000
    return
    end

  • FERDİ GÜRTEKİN

    hocam gosub ile call komutu arasında ki farkı kısaca anlatabilirmisiniz?

  • ete

    Gerçek basic komutu Gosub dur. Bir alt programa gitmeyi ve orada RETURN görünce ayrıldığı yere geri dönmeyi sağlar.

    Call qaslında bir ASM komutudur. Basic içinde ASM alt programlarını çağırmak için kullanılır ama GOSUB yerine de kullanınca itiraz etmeyen bir komut. Kısaca iki komut da aynı işi yapıyor.

    Siz yinede elinizi GOSUB’a alıştırın bence.

    Ete

  • Ferdi Gürtekin

    iyi günler hocam aşagıdaki kodları 16f84a ya göre derleyince sorunlar veriyor neden acaba ?

    sorunların resmi ;

    undefined-symbol-error-pic-basic

    INCLUDE “modedefs.bas”
    CMCON=07 ;PORTA Dijital
    TRISB=%00000010

    DEFINE HSER_RCSTA 90h
    DEFINE HSER_TXSTA 20h
    DEFINE HSER_BAUD 2400
    DEFINE HSER_CLROERR 1

    SOLILERI VAR PORTB.3
    SOLGERI VAR PORTB.4
    SAGILERI VAR PORTB.5
    SAGGERI VAR PORTB.6

    K VAR BYTE
    ERRCHK VAR BYTE
    PAUSE 250

    ANADONGU:

    HSERIN[WAIT(254),K,ERRCHK]

    SOLGERI=0: SAGGERI=0: SAGILERI=0: SOLILERI=0:

    IF ERRCHK=192 THEN; GELEN VERI DOGRU FORMATTA ISE

    IF K.BIT0=1 THEN
    SOLILERI=1
    ELSE
    SOLILERI=0
    ENDIF

    IF K.BIT1=1 THEN
    SOLGERI=1
    ELSE
    SOLGERI=0
    ENDIF

    IF K.BIT2=1 THEN
    SAGILERI=1
    ELSE
    SAGILERI=0
    ENDIF

    IF K.BIT3=1 THEN
    SAGGERI=1
    ELSE
    SAGGERI=0
    ENDIF

    ENDIF
    PAUSE 10
    GOTO ANADONGU

  • ete

    16F84’de donanılsam USART portu yoktur. Hata bu sebeple veriliyor.
    Onun yerine 16F628 kullanmalısın.

    Ete

  • Ferdi Gürtekin

    sağ olun hocam,

    hocam hserin ile serin aynı işlemimi yapar aralarında ne fark vardır? birinde serinde pinler kullanıcı tarafından belirlenir hserinde ise donanım olarak bellidir bu mu tek fark yoksa başka ne gibi fark vardır ?

  • ete

    Soruyu sormuşsun ama cevabıda yazmışsın. dediğin gibidir.
    Birisi (HSERIN) donanımsal USART pinlerini kullanır kesme yaratabilir. Diğerinde pinleri sen belirlersin ama kesmeye bağlayamazsın.

    Birisi USART dan dolayı otomatik uyanır ve gelen bilgiyi alır. Diğerinde sen alma konumunda beklemek zorundasın.

    Ete

  • alp

    Hocam Bilgiler İçin Teşekkürler..
    Benim Size Bir Kaç Sorum Olacak.

    Amacım Bir PLC(Telemecanique) İle Pic(877) Modbus RS485 Olarak Haberleştirebilmek.

    1-Bunun İçin Bir Döküman Buldum Fakat Bu Devreyi Kurduğum Zaman PLC den Gelen Modbus Bilgisini Pice Nasıl Tanıtacağım.Bunu modedefs.bas İçerisindemi Yapmalıyım.

    2-Bu Dökümandaki Şemada Kurulu Olan Devredede rs232 Entegresi Yerine Rs485 Entegresi Kullanırsam.Seri Olarak Bilgi Alışverişi Yaptırabilirmiyim.

    http://www.modbus.pl/node/18
    Kodlamada Pic Basic Kodlarını Baz Alıyorum..

    Yardımların İçin Şimdiden Teşekkürler.Hocam.

  • ete

    Modbus protokolünü bilmiyorum. Hiç kullanmadım.
    Ancak PLC den gelen bili formatı nedir onu belirtirsen belki bir şeyler yapılabilir. PLC den gelen Modbus bilgisini nasıl tanıtacağım diyorsun. Nasıl bir bilgi kaç byte ve yollanma şekli hangi hızda ve formattadır?.
    Verdiğin linkteki programada baktım. Fazlaca özel bir şey göremedim.
    Sanırım bilgi 8N1 (8 data ve 1 stop biti) formatında yollanıyor.
    Hız olarak da 9600 Baud kullanılmış. Geriye gelen bilginin formatı kalıyor. Nedir paket bilgisi formatı.?

    Ete

  • alp

    Hocam PLC de Hazır Modbus Adresleri 40001 Gibi
    %MW40002
    %MW40003 Gibi Gidiyor
    PLC Twido Modbus RS485 İle Haberleşme Yapıyor.

  • ete

    Modbus sistemini iyi bilmeyince açıkladıkların bana bir şey ifade etmedi maalesef. Bu konuyu benimle çözmen neredeyse imkansız çünki bilmiyorum.
    Bu nedenle başka kaynaklar aramalısın. Biraz inceledim ama her nedense hep sağdan soldan abuk subuk tercüme edilmiş bilgilere rastladım. Her kes bunun bir seri haberleşme protokolü olduğunu açıklamış ve 2 ssistem olduğunu belirtmiş. Birisi Modbus_RTU gibi bir şey diğeri Modbus-ASCII sistemi. Birisi bilginin digitlerini teker teker yolluyor (ASCII) diğeri onu byte olarak hesaplayıp yolluyor. RTU da Hex_1234 bilgisi önce 12 sonra 34 bilgisi olarak yollanıyor. ASCII de ise 1 ayrı 2 ayrı 3 ayrı 4 ayrı byte bilgisi olarak yollanmaktadır. Bu bilgilere ilave olarak sistemde normal protokol kuralları uygukanıyor olması gerek sanırım. Zira bir hız seçimi bir data formatı seçimi yapılması ve her iki tarafından buna uygun olması gereksinimi vardır sanırım. Bunlara ilave olarak birde adresleme denilen bir bilgiye rastladım ama dediğim gibi ne detay var nede fazladanbir açıklama. Nedir adresleme ne işe yarar anlamadım doğrusu.

    Ete

  • alp

    Eyvallah Hocam Genede Sağ olun . Başarılar..

  • FATİH

    merhaba hocam birşey dikkatimi çekti ilk olarak yazdığınız sayfa başındaki programlarda arkadaşın dediği gibi neden hata verdi o sordu siz baska bir komut sistemiyle asıl program budur dediniz yani şunu söylemek istiyorum eğer biz bu işi öğreniyorsak ve yorumlara dikkat etmeden okuyup ordakileri uygulama yaparasak yandık yanlış mı

    ama paylaşımlarınız ve bilgi vermenizde çok iyidir genede teşşekkürler dilerim

  • ete

    Basic de seri haberleşme komutu birden fazladır. Bunlar;
    SEROUT (yollamak için)
    SEROUT2 (yollamak için)
    HSEROUT (Yollamak için)
    Sondaki donanımsal serial port kullanır. Bu bir donanım özelliğidir ve her pic de bulunmaz. Dolayısıyla hangi picde var ise o picde bu komut kullanılabilir. Ama ilk ikisi bütün işlmecilerde kullanılabilecek bir komuttur.
    SOnuç olarak bir sistemde olmayan bir özelliği kullanırsanız sistem bende yok diye hata vermek zorundadır. 16F84 de derleme yapılınca bu komut hata veriyor . Açıklaması budur. Bütün bu açıklamalar data sheetlerde yazıyor. Ya okuyacak ve oradan öğreneceksin yada anlatılanları kabul edil ha böyleymiş diyeceksin. Başka çıkar yoluda yok maalesef. Data sheetler işlemcilerle çalışırken işin alfabesi gibidir. Bunları okumayı en azından göz gezdirmeyi alışkanlık haline getirmelisiniz. Aksi taktirde hep başkalarının bilgisine muhtaç olursunuz. İllaki İngilizce bilmeye gerek yok. İşlemcinin donanım özelliklerine bakınca anlarsınız neyi var neyi yok. Mesela 16F628 data sheet’ini açtım. SOl tarafta başlıklar gözüküyor. Aşağı doğru taradım. Bakım ve şunu gördüm. “Universal Synchronous Asynchronous Receiver Transmitter” işte bu donanımasal seri port anlamına gelir. O halde bu picde ben HSEROUT veya HSERIN komutlarını kullanabilirim demektir. Bir başka örnek. 12F675 data sheet’ine bakıyorum.AYnı şekilde sol tarafı taradım ve şunu gördüm. “Analog to Digital Convertor (12F675) ” bu bana bu işlemcide ADC çevrimi kullanabileceğimi gösterir. İllaki ingilizce bilip detayları okumam bile gerekmiyor. Nasıl kullanacağımı aynı başlık altında verilen register açıklamalarından anlayabiliyorum. Sonuç olarak işlemcilerde bazı ilave donanımsal özellikler bulunmktadır. Her komut her işlemcide kullanılmaz. O komuta ait özelliğin işlmecide olması gerekir. Bunun içinde araştırma gereklidir.

    Ete

  • FATİH

    ben 6, ve 7 vinrar dosyasındaki bas dosyalarını derleyemiyorum mesela on off gibi

  • Atilla

    paylaşımlar gerçekten cok faydalı ete hocam eline sağlık benim bi problemim var onu senle paylaşmak istiyorum.

    include “modedefs.bas”
    TRISB = $00
    PORTB = $1F
    bilgi var BYTE[5]
    i var byte
    deger var byte
    i=0

    bas:
    while (bilgi[i]”$”)
    i=i+1
    serin porta.0,n9600,bilgi[i]
    wend
    for i = 0 to 5
    PortB = bilgi[i]
    pause 1000
    PortB = i
    pause 1000
    next i
    deger = bilgi[1]
    if deger = $31 then PortB.0 = 1
    goto bas
    END

    bu programda bilgisayardan aldığım 1$ değerini işlemek istedim ancak olmadı. 1 değerinde ascii 31 döndüğünü görüyorum. hatta for döngüsünde gelen verileri ledlerde de gördüm ancak ayıkladığım o değer üzerinden işlem yapamadım yardım edersen çok sevinirim kolay gelsin

  • Mert KS

    İyi günler hocam
    serin taktiğini pcw de denemek istiyorum çünkü usart girişleri dolu oldugu için ama pcw de serin komutunu tanımlayamıyorum yardımcı olursanız sevinirim.

  • sistemkurdu

    Hocam PBP 1-10 derslerinizi bir kaç yıl önce bir yerden elde ettim ve şimdilerde okuyarak pek çok bilgi sahibi oldum. Devre kurulumları ve simülasyonları çok güzel. 1-2 tanesi hariç kalanların hepsini simülasyonla deneyerek çalıştırdım. Ellerinize sağlık hepsi çok güzel olmuş. Sizinle irtibatta olmak isterim. Saygılarımla…