tpic6b595 yardım

Başlatan furkan_2210, 31 Temmuz 2014, 18:38:51

ete

Gelen=bilgi  komutu yanlış tabiiki. Ufak bir şey ve gözden kaçıyor.
Doğrusu Bilgi=Gelen şeklinde olmalı.

Programda yer alan,
RCSTA = $90                ' SPEN & CREN = 1 Enable serial port and continuous receive           
TXSTA = $24                ' TXEN & BRGH = 1 Enable transmit and asynchronous mode
satırlarıda fazlalık. Aynı komutları define komutu olarak vermişsin zaten ikinci defa vermen gerekmiyor.

Gönderilen data dec olsun olmasın seni fazla ilgilendirmez. Sen oradan yollanan data ne ise onu al gelen bilgiye görede işlem yap bence. Zira her konumda gönderilen bilgi 0-255 arasında bir rakam olacaktır. DEC kullanma demek istiyorum.

Bu tür programlarda senkron çok önemlidir. Bilginin geliş süresi en fazla bir kaç ms dir. Bu geliş esnasında seninde alış konumunda olman gerekir aksi halde hiç bir şey alamazsın.
Yollanan bilginin sıhhatli alınmasınınbir yolu da işaretçi kullanmaktır. Zira bilgi bit bazında bir paket halinde yollanır. Sen bu paektin ortasından bilgi almaya kalkarsan sürekli yanlış bilgi alırsın. Doğru algoritmada sırası ile şöyle bir çalışma beklenir.
- Seri portdan bir bilgi geliyormu bak.
- Bilgi geliyorsa portu uyandır
- Gelen bilgi beklenen bilgimidir yoksa parazit gibi bir şeymidir.?
- Beklenen bilgi ise bilginin devamınıda al ve çık.

Bu sıraladıklarımı sağlamak için şu satırları kullanman gerekiyor;
Öncelikle bilgi yollayan taraf aşağıdaki uyandırma ve preambl dizisini yollamalı ;
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
bu 5 byte $AA bilgisi , 5 byte $00 bilgisi ve 5 byte $FF bilgisini peş peşe yollamak anlamına geliyor.
Ardından bir işaretçi yollamak uygun olur ve onun ardından da yollanacak bilgi yollanmalıdır.
HSEROUT ["E","T","E",BILGI,10,13]. Sonda yer alan 10 rakamı bir Line feed yollar. 13 ise RETURN anlamına gelir paket sonunu ifade eder genellikle.
Yolladığın bilgileri bu formatla yollarsan senkronizasyon şansın çok artacaktır.
Alıcı kısmında ise,
HSERIN 10,Timeout,[Wait("ETE"),GELEN]
şeklinde bir komut satırı kullanman yeterli olacaktır.
Böylece gelen data paketi arasında ETE işaretini arayacak ve yakaladığı zaman ardından gelen GELEN bilgisini alacaktır.
Aksi halde ne gelirse almaya çalışacak timeout işlemi pek işine yaramayacaktır.

Birde bu şekilde dene bakalım nası bir sonuç alacaksın.

Ete


furkan_2210

#16
slmlar,
ETE hocam, dediklerinizi denemeye fırsatım olmadı malum tatil bitti,mesailerde başlayınca biraz zor oluyor vakit ayırmak.
sizin dediklerinizden yola çıkarak şöyle bir şey yazmayı planlıyorum ,her entegreye byte tanımlayıp, hserin komutunu birden fazla kullanmayı düşünüyorum tabiki  program ve yazılım dili buna izin verir mi bilemiyorum ama , tahmini olarak şöyle düşünüyorum ;
örn: 3 entegre için ,

gelen var byte
giden var byte
giden1 var byte
giden2 var byte

basla:

HSERIN 10,basla1,[Wait("AAA"),gelen]
giden=gelen
gosub entegreler

basla1:

HSERIN 10,basla2,[Wait("AAB"),gelen]
giden1=gelen
gosub entegreler

basla2:

HSERIN 10,entegreler,[Wait("AAC"),gelen]
giden2=gelen
gosub entegreler

entegreler:

             shiftout dta,clk,1,[giden,giden1,giden2]
             PULSOUT aktar,1
return

goto basla
end


bilemiyorum doğru mu düşünüyorum ama tahminen böyle bir mantığı olması gerekir. benim bilgisayar arayüzümden göndereceğim değer afaki  yani tabiki  çıkış vermesi gereken değerleri yollicam, fakat bunu bir şekilde şifrelemem  gerekir ki microdenetleyici hangi 595 in içine onu yazacağını bilsin  yoksa sizin dediğiniz gibi 0-255 arası gelicek fakat mikrodenetleyici bunu hangi entegreye  erleştirecceğini bilmicek,, şu anda takıldığım tek nokta budur,bu şekilde yaparsak yani seri ddatadan "AAA" gönderirsem yani ikroyu uyandırırsam hemen peşinden gelen veriyi gidenin içine yazmış olacak, "AAB" gönderirsem peşinden gelen veriyi giden1'e yazmış oluck gibi,yanlış mı düşünüyorum acaba, yanlışım var ise düzltin lütfen..

SAYGILARIMLA..

ete

Bu şekilde bir mantık senkron sorunu doğurur. Doğru dürüst haberleşme sağlayamazsın.
Onun yerine HSERIN [WAIT("ETE"),GelenA,GelenB,GelenC] şeklinde tek komut satırı kullan ve karşıdan daima tek gönderi yap ama içinde   Byte olsun. Böylece senkron işini büyük ölçüde kurtarmış olursun.

Ete

furkan_2210

Php üzerinden haberleşiyorum eğer öyle bir şey yapmam gerekirse php ye onu nasıl yazarım araştırmam lazım , ama side dediğim gibi bir deneme yapmadım henüz akşam zamanım olursa denemeye çalışırım senkron sorunu olmaz muhtemel gibi görünüyor dediğiniz gibi ama deneme yanılma yöntemi ile stabilitesini ayarlayabileceğimizi düşünüyorum.. Siz ne düşünüyorsunuz??

ete

Ben ne düşündüğümü yukarı yazdım.
Senkron meselesi ile daha önce cebelleşmedin belli oluyor. Senkron nedir belkide onuda bilmiyorsundur yada kabaca biliyor ama ne derece önemli farkında değilsin sanırım.
Seri haberleşmede veriler bit bit yollanır. Yollanan veriler en başından bit bit alınırsa haberleşme sağlanıp bilgi alınmış olur. Bir taraf veriyi yollar diğer taraf beklemede olursa gelen veriyi alabilir çünki veri kapısında bekliyordur.buna senkron sağlandı denir. Ama o anda bir iş yapıyorsa ve tam işini bitirip veri kapısına baktığında bir kaç bit gelmiş geçmiş ise verileri kaçırır yada veri paketinin arsından giriş yaparak veri almaya başlarsınki bunada senkron kaçırma deniliyor. Bu alternatifte haberleşme elbette mümkün olamıyor.

Ete

furkan_2210

ETE hocam, son yazdıklarımı mobilden yazdım verdiğiniz cevaptan sonra okudum yanlış yazmışım sizde doğal olarak öyle anlamışsınız , verdiğiniz cevaplardan dolayı teşekkür ediyorum bizi aydınlatıyorsunuz ve bilgilendiriyorsunuz . Şu anda da mobilden yazıyorum elimden geldiğince dikkat ederek yazıyorum yanlışım olursa kusura bakmayın ..ewe gidince detaylı olarak düzgün bir şekilde cevap yazıcam size ..

Saygılarımla...

furkan_2210

Alıntı yapılan: ete - 06 Ağustos 2014, 08:26:56
Bu şekilde bir mantık senkron sorunu doğurur. Doğru dürüst haberleşme sağlayamazsın.
Onun yerine HSERIN [WAIT("ETE"),GelenA,GelenB,GelenC] şeklinde tek komut satırı kullan ve karşıdan daima tek gönderi yap ama içinde   Byte olsun. Böylece senkron işini büyük ölçüde kurtarmış olursun.

Ete

ETE HOCAM,
dediğiniz gibi HSERIN [WAIT("ETE"),GelenA,GelenB,GelenC] bu komutu kullanır isem ,örn 1. entegrenin 4. pini aktif  ve ben 3. entegrenin 3. pinini de aktif hale getirmek istiyorum.  gönderim komutu olarak ne göndermem gerekiyor ..  çünkü GelenC'ye 4 gönderirsem komut tahmini olarak şöyle olucak ; php de yazdığım için sadece  kodları yazıyorum [....,,,4]   böyle olması gerekiyor sanırsam yani gelen a'da bişi yazma iki virgül aralıksız ,üçüncü virgülde aralıksız ,3. entegreye data komutu yani 3. pini aktif eden decimal 4 rakamı doğrumudur? 

yardımcı olursanız sevinirim ..

SAYGILARIMLA...

ete

GelenA, GelenB, GelenC gibi değerleri sürekli sen kontrol edeceksin. Dolayısıyla bu değerleri saklayacaksın sürekli. Diyelim 2. Ci entegrenin 2 ci çıkışı aktif iken 3 cü entegrenin 4 cü çıkışı aktif olacak ise sen değişkenlerini sıradan vereceksin.
Değeri değişmeyenler çıkışları etkilemeyecek yalnızca çıkışı değişen değer değişmiş olacaktır.
Bu nedenle gösterdiğim şekilde komut verilmeli.
Shift komutunda değişken vermeden yalnızca virgül konularak bilgi verilmez.
Ete

furkan_2210

ETE HOCAM, 

dediklerinizden yola çıkarak biraz yazma fırsatım oldu ,, denedim fakat senkronize sorunum oldu yani stabil çalışmıor,,  kodları aşşağıda paylaşıyorum,,  yanlış yazdığım bir yer mi var  ben göremedim çünkü  kontrol eder misiniz ??
SAYGILARIMLA...



@ DEVICE pic16F628a                      'işlemci 16F628a                               
@ DEVICE pic16F628a, WDT_OFF             'Watch Dog timer kapalı
@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılmıyor.
@ DEVICE pic16F628a, XT_OSC              'harici osilatör kullanılacak
'.......................................................................
DEFINE HSER_RCSTA 90h      '(alma yazmacının Enable edilmesi)
DEFINE HSER_TXSTA 24h      '(gönderme yazmacının Enable edilmesi)
DEFINE HSER_BAUD 9600      '(Haberlesme hızının belirlenmesi)
DEFINE HSER_CLROERR 1      ' Auto clear over-run errors
DEFINE HSER_SPBRG 25
'.......................................................................
TRISB=%00000010            '(trisb.1 hariç hepsi çıkış)
TRISA=%00000000            '(trisa çıkış olarak ayarlandı)
porta=0                    '(portanın içeriği sıfırlandı)
portb=0                    '(portbnin içeriği sıfırlandı)
'.......................................................................
option_reg.7=0
symbol CLK=PortA.2         '(porta.2 clock bacağı olarak ayarlandı)
SYMBOL DTA=PORTA.3         '(porta.3 data bacağı olarak ayarlandı)
SYMBOL AKTAR=PORTB.5       '(porta.5 aktarma bacağı olarak ayarlandı)
'.......................................................................
GELEN VAR byte
GELEN1 VAR BYTE
GELEN2 VAR BYTE
GELEN3 VAR BYTE
GELEN4 VAR BYTE
GELEN5 VAR BYTE
GELEN6 VAR BYTE
GELEN7 VAR BYTE
GELEN8 VAR BYTE
GELEN9 VAR BYTE
GELEN10 VAR BYTE
GELEN11 VAR BYTE
GELEN12 VAR BYTE
GELEN13 VAR BYTE
GELEN14 VAR BYTE
GELEN15 VAR BYTE
GELEN16 VAR BYTE
GELEN17 VAR BYTE
GELEN18 VAR BYTE
GELEN19 VAR BYTE
GELEN20 VAR BYTE
GELEN21 VAR BYTE
GELEN22 VAR BYTE
GELEN23 VAR BYTE
GELEN24 VAR BYTE
GELEN25 VAR BYTE
GELEN26 VAR BYTE
GELEN27 VAR BYTE
GELEN28 VAR BYTE
GELEN29 VAR BYTE
GELEN30 VAR BYTE
GIDEN VAR BYTE
GIDEN1 VAR BYTE
GIDEN2 VAR BYTE
GIDEN3 VAR BYTE
GIDEN4 VAR BYTE
GIDEN5 VAR BYTE
GIDEN6 VAR BYTE
GIDEN7 VAR BYTE
GIDEN8 VAR BYTE
GIDEN9 VAR BYTE
GIDEN10 VAR BYTE
GIDEN11 VAR BYTE
GIDEN12 VAR BYTE
GIDEN13 VAR BYTE
GIDEN14 VAR BYTE
GIDEN15 VAR BYTE
GIDEN16 VAR BYTE
GIDEN17 VAR BYTE
GIDEN18 VAR BYTE
GIDEN19 VAR BYTE
GIDEN20 VAR BYTE
GIDEN21 VAR BYTE
GIDEN22 VAR BYTE
GIDEN23 VAR BYTE
GIDEN24 VAR BYTE
GIDEN25 VAR BYTE
GIDEN26 VAR BYTE
GIDEN27 VAR BYTE
GIDEN28 VAR BYTE
GIDEN29 VAR BYTE
GIDEN30 VAR BYTE
'.......................................................................
basla:
     
'.......................................................................                 
       toggle portb.4
     
       HSERIN 10,SIFIRBIR,[gelen,gelen1,gelen2,gelen3,gelen4,gelen5,gelen6,gelen7,gelen8,gelen9,gelen10,gelen11,gelen12,gelen13,gelen14,gelen15,gelen16,gelen17,gelen18,gelen19,gelen20,gelen21,gelen22,gelen23,gelen24,gelen25,gelen26,gelen27,gelen28,gelen29,gelen30]

'.......................................................................
SIFIRBIR:
       HSERIN 10,basla,[Wait("HAL"),gelen]
       if gelen="a" then
       GOSUB SIFIR
       endif
       if gelen="B" then
       GOSUB BIR
       endif
'.......................................................................

GIDEN=GELEN
GIDEN1=GELEN1
GIDEN2=GELEN2
GIDEN3=GELEN3
GIDEN4=GELEN4
GIDEN5=GELEN5
GIDEN6=GELEN6
GIDEN7=GELEN7
GIDEN8=GELEN8
GIDEN9=GELEN9
GIDEN10=GELEN10
GIDEN11=GELEN11
GIDEN12=GELEN12
GIDEN13=GELEN13
GIDEN14=GELEN14
GIDEN15=GELEN15
GIDEN16=GELEN16
GIDEN17=GELEN17
GIDEN18=GELEN18
GIDEN19=GELEN19
GIDEN20=GELEN20
GIDEN21=GELEN21
GIDEN22=GELEN22
GIDEN23=GELEN23
GIDEN24=GELEN24
GIDEN25=GELEN25
GIDEN26=GELEN26
GIDEN27=GELEN27
GIDEN28=GELEN28
GIDEN29=GELEN29
GIDEN30=GELEN30
'.......................................................................
entegreler:
             shiftout dta,clk,1,[giden,giden1,giden2,giden3,giden4,giden5,giden6,giden7,giden8,giden9,giden10,giden11,giden12,giden13,giden14,giden15,giden16,giden17,giden18,giden19,giden20,giden21,giden22,giden23,giden24,GIDEN25,GIDEN26,GIDEN27,GIDEN28,GIDEN29,GIDEN30]
             PULSOUT aktar,1
             return       

'.......................................................................
SIFIR:
             shiftout dta,clk,1,[giden=0,giden1=0,giden2=0,giden3=0,giden4=0,giden5=0,giden6=0,giden7=0,giden8=0,giden9=0,giden10=0,giden11=0,giden12=0,giden13=0,giden14=0,giden15=0,giden16=0,giden17=0,giden18=0,giden19=0,giden20=0,giden21=0,giden22=0,giden23=0,giden24=0,GIDEN25=0,GIDEN26=0,GIDEN27=0,GIDEN28=0,GIDEN29=0,GIDEN30=0]
             PULSOUT aktar,1
             return
'.......................................................................             
BIR:
             shiftout dta,clk,1,[giden=255,giden1=255,giden2=255,giden3=255,giden4=255,giden5=255,giden6=255,giden7=255,giden8=255,giden9=255,giden10=255,giden11=255,giden12=255,giden13=255,giden14=255,giden15=255,giden16=255,giden17=255,giden18=255,giden19=255,giden20=255,giden21=255,giden22=255,giden23=255,giden24=255,GIDEN25=255,GIDEN26=255,GIDEN27=255,GIDEN28=255,GIDEN29=255,GIDEN30=255]
             PULSOUT aktar,1
             return

'.......................................................................
             goto basla
             end

kartal_0689

gelen verilerin için dizi oluşturabilirsin. Basicte nasıl bilmiyorum ama;
VERI: array[30] of byte;

şeklinde yapılabilir. Çok çok yazmana gerek yok o yüzden diyorum.
TURKEY/ANK

furkan_2210

Dediğini nasıl yapabilirim ,, yani bu komutları senin dediğin gibi en basite indirgeyebilirsem ,, muhtemelen sonuç alabilirim ...
Teşekkürler arkadaşım..

ete

Bu programda bir çok kusur var.
Birincisi, bazen gelen bilgi tek karekter bazen çok karekter oluyor. Buna kim karar veriyor. Yada kaç karekter geleceğini kim nasıl biliyor. Şayet gelen karekter sayısı sıra takip ediyor ise o zaman sorun yok ama yinede tereddütlarim var. Mesela,
ilk bilgi alımında;
HSERIN 10,SIFIRBIR,[gelen,gelen1,gelen2,gelen3,gelen4,gelen5,gelen6,gelen7,gelen8,gelen9,gelen10,gelen11,gelen12,gelen13,gelen14,gelen15,gelen16,gelen17,gelen18,gelen19,gelen20,gelen21,gelen22,gelen23,gelen24,gelen25,gelen26,gelen27,gelen28,gelen29,gelen30]
kullanılmış olup bu gelen data paketi başında bir işaretçi kullanılmamış (Neden?) Gelen karekter adedi ise 30 adet,
sonraki alımda ise;
   HSERIN 10,basla,[Wait("HAL"),gelen]
şeklinde bir ifade kullanılarak tek byte alınması amaçlanmış. Burada aynı zamanda "HAL" şeklinde bir de işaretçi kullanılmış. Bu şekilde bir çok bir tek karekter alınması söz konusu ise ve bunun zamanı belli değil ise bu programın çalışması imkansız olur.
Basic de dizi değişkenleri GELEN VAR BYTE[31] şeklinde tanımlanır [31] sayısı dizi eleman sayısını gösterir.(0-30 arası)
Yukarıda verilen komut satırı yerine;
HSERIN 10,SIFIRBIR,STR GELEN\31] yazılır ise seri portdan gelen 30 adet byte değeri gelen[0] ile Gelen[30] arasında toplam 31 adet değişkene otomatik yazılır.

Değişkenleri bir başka guruba aktarmak için
FOR I=0 to 30
  GIDEN[I]=GELEN[I]
next

şeklinde komut dizisi kullanılarak kolaylıkla bütün değerler bir başka değişkene aktarılmış olur. Burada unutulmaması gereken şey GIDEN isimli değişken de bir dizi değişkeni olmalı ve eşit sayıda eleman tanımlanmış olması gerekir.
GIDEN VAR BYTE[31]

Shift komutunda aşağıdaki şekilde kullanım olmaz.
SIFIR:
             shiftout dta,clk,1,[giden=0,giden1=0,giden2=0,giden3=0,giden4=0,giden5=0,giden6=0,giden7=0,giden8=0,giden9=0,giden10=0,giden11=0,giden12=0,giden13=0,giden14=0,giden15=0,giden16=0,giden17=0,giden18=0,giden19=0,giden20=0,giden21=0,giden22=0,giden23=0,giden24=0,GIDEN25=0,GIDEN26=0,GIDEN27=0,GIDEN28=0,GIDEN29=0,GIDEN30=0]
             PULSOUT aktar,1
             return

Değişkenler sıfırlanacak ise shift komutundan önce sıfırlanıp sonra komut satırına yalnızca değişken isimleri yazılmalıdır. Burada hatalı olan komut giden=0,giden1=0... şeklindeki komutlardır. Yani değişkenler shift komutu içinde sıfırlanamazlar.
Önce sıfırlanıp sonra giden,giden1,giden2... şeklinde kullanılabilirler.
Benzer şekilde değişkenler shift komutu içinde bir başka değere eşitlenemezler. Önce eşitlenip sonra değişken isimleri kullanılarak shift komutunda kullanılabilirler.

Ete

furkan_2210

ETE HoCAM, 
yardımlarınız için çok çok teşekkür ediyorum önerilerinizi kullanarak kodlarımı  derledim fakat syntax (yazım) hatası alıyorum ..  resimi ekledim . bir göz atarsanız sevinirim ..

SAYGILARIMLAA..

furkan_2210

ETE HOCAM,,
i harfini değişken olarak tanımlamamışım  ondan hata veriyormuş,, onu çözdüm  ama  şu anda  hala shiftout  satırındaki  hata devam ediyor..

furkan_2210

#29
ETE hocam ,,

kodları paylaşıyorum bakarsanız sevinirim..

@ DEVICE pic16F628a                      'işlemci 16F628a                               
@ DEVICE pic16F628a, WDT_OFF             'Watch Dog timer kapalı
@ DEVICE pic16F628a, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628a, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628a, MCLR_off            'MCLR pini kullanılmıyor.
@ DEVICE pic16F628a, XT_OSC              'harici osilatör kullanılacak
'.......................................................................
DEFINE HSER_RCSTA 90h      '(alma yazmacının Enable edilmesi)
DEFINE HSER_TXSTA 24h      '(gönderme yazmacının Enable edilmesi)
DEFINE HSER_BAUD 9600      '(Haberlesme hızının belirlenmesi)
DEFINE HSER_CLROERR 1      ' Auto clear over-run errors
DEFINE HSER_SPBRG 25
'.......................................................................
TRISB=%00000010            '(trisb.1 hariç hepsi çıkış)
TRISA=%00000000            '(trisa çıkış olarak ayarlandı)
porta=0                    '(portanın içeriği sıfırlandı)
portb=0                    '(portbnin içeriği sıfırlandı)
'.......................................................................
option_reg.7=0
symbol CLK=PortA.2         '(porta.2 clock bacağı olarak ayarlandı)
SYMBOL DTA=PORTA.3         '(porta.3 data bacağı olarak ayarlandı)
SYMBOL AKTAR=PORTB.5       '(porta.5 aktarma bacağı olarak ayarlandı)
'.......................................................................
GELEN VAR byte[31]
GIDEN VAR BYTE[31]
I var byte
'.......................................................................
basla:               
       toggle portb.4
     
       HSERIN 10,basla,[Wait("FAH"),STR GELEN\31]
'.......................................................................
       FOR I=0 to 31
       GIDEN[I]=GELEN[I]
       next
'.......................................................................
       shiftout dta,clk,1,[STR giden\31]
       PULSOUT aktar,1
'.......................................................................
       goto basla
       end

Powered by EzPortal