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 Dersleri PIC Basic Pro ile PIC Programlama 7 Kod ve simülasyon dosyaları;
Şifre-Pass: 320volt.com
PICBasic Dersleri PIC Basic Pro ile PIC Programlama-8 Ders-8 Devam
Yayım tarihi: 2010/04/30 Etiketler: kılavuz ders, pic basic dersleri, PIC programlama, picbasic eğitim, picbasic pro
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
/////////////
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
hocam gosub ile call komutu arasında ki farkı kısaca anlatabilirmisiniz?
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
iyi günler hocam aşagıdaki kodları 16f84a ya göre derleyince sorunlar veriyor neden acaba ?
sorunların resmi ;
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
16F84’de donanılsam USART portu yoktur. Hata bu sebeple veriliyor.
Onun yerine 16F628 kullanmalısın.
Ete
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 ?
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
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.
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
Hocam PLC de Hazır Modbus Adresleri 40001 Gibi
%MW40002
%MW40003 Gibi Gidiyor
PLC Twido Modbus RS485 İle Haberleşme Yapıyor.
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
Eyvallah Hocam Genede Sağ olun . Başarılar..
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
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
ben 6, ve 7 vinrar dosyasındaki bas dosyalarını derleyemiyorum mesela on off gibi
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
İ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.
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…