PicBasic Proda Serout ve Sein komutlarındaki Yapı ?

Başlatan has_artvin_li, 06 Haziran 2022, 16:29:00

has_artvin_li

Herkese selamlar.

Değerli abiler ve @ete hocam pic basic ile 434MHZ rf uzaktan kumanda alıcı verici yaparken kullandığım ve gerçekten çok güzel çalışan iki tane komutum var aslında komut önemli değil de komuttaki yapı önemli.

SEROUT portb.2,N2400,[GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984"] ' Data yollamada kullanıyorum


SERIN PORTB.1,N2400,["1984"],OKU,SIFRE1,SIFRE2,SIFRE3,SIFRE4 ' Data almada kullanıyorum.

Programın tamamı şöyle :
Alıcı:

        INCLUDE "modedefs.bas"
@ DEVICE PIC16F628A 'işlemci 16F628
@ DEVICE PIC16F628A, WDT_OFF 'Watch Dog timer kapalı
@ DEVICE PIC16F628A, PWRT_OFF 'Power on timer açık
@ DEVICE PIC16F628A, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE PIC16F628A, MCLR_OFF 'MCLR pini kullanılıyor.
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak        
CMCON=7
    INPUT   PORTB.1
    OUTPUT  PORTA.0
    OUTPUT  PORTA.1
    OUTPUT  PORTA.2
    OUTPUT  PORTA.3
    
    SIFRE1 VAR BYTE
    SIFRE2 VAR BYTE
    SIFRE3 VAR BYTE
    SIFRE4 VAR BYTE
    OKU VAR BYTE
    
    TEKRAR  VAR WORD
    
    SIFRE1=0
    SIFRE2=0
    SIFRE3=0 
    SIFRE4=0
    OKU=0
    
BASLA:
    SERIN PORTB.1,N2400,["1984"],OKU,SIFRE1,SIFRE2,SIFRE3,SIFRE4
    IF SIFRE1=1 AND SIFRE2=9 AND SIFRE3=8 AND SIFRE4=4  THEN
    GOTO ATLA
    ELSE
    OKU=0
    GOTO BASLA
    ENDIF
ATLA:
    IF  OKU=10  THEN
    HIGH    PORTA.0
    PAUSE   500
    LOW    PORTA.0
    ENDIF
    IF  OKU=20  THEN
    HIGH     PORTA.1
    PAUSE   500
    LOW      PORTA.1
    ENDIF 
    IF  OKU=30  THEN
    HIGH     PORTA.2
    PAUSE   500
    LOW      PORTA.2
    ENDIF 
    IF  OKU=50  THEN
    HIGH     PORTB.4
    PAUSE   500
    LOW      PORTB.4
    ENDIF
    GOTO    BASLA  
    END


Verici :

INCLUDE "modedefs.bas"

@ DEVICE PIC16F628A 'işlemci 16F628
@ DEVICE PIC16F628A, WDT_OFF 'Watch Dog timer kapalı
@ DEVICE PIC16F628A, PWRT_OFF 'Power on timer açık
@ DEVICE PIC16F628A, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE PIC16F628A, MCLR_OFF 'MCLR pini kullanılıyor.
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak

CMCON=7

SIFRE1 VAR BYTE
SIFRE2 VAR BYTE
SIFRE3 VAR BYTE
SIFRE4 VAR BYTE

SIFRE1=1
SIFRE2=9
SIFRE3=8 
SIFRE4=4
input   porta.0
INPUT   porta.1
INPUT   porta.2
input   porta.3
input   portb.4
input   porta.5

bir     var     porta.1
iki     var     porta.2
uc      var     porta.3
dort    var     porta.0
bos     var     porta.4


GON VAR BYTE
GON=0


BASLA:
IF bir=1 THEN
GON=10
SEROUT portb.2,N2400,[GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984"]
ENDIF

IF  iki=1  THEN
GON=20
SEROUT portb.2,N2400,[GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984"]
ENDIF

if  uc=1    then
gon=30
SEROUT portb.2,N2400,[GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984"]
endif


if  dort=1    then
gon=50
SEROUT portb.2,N2400,[GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984"]
endif


if  bos=1    then
gon=60
SEROUT portb.2,N2400,[GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984"]
endif

GOTO BASLA
END


Vericideki kodlama yapısına göre hangi pine basılırsa GON adlı registere kama göre bir değer atıyorum 10 -50 150 gibi byte tipi bir değer.
Serot komutu bu değeri ve ardından 4 byte şifre olarak tanımladığım değeri yolluyor ama en son tırnak içindeki "1984" neye yarıyor kullanım yapısına göre adı nedir ? Proton basicde bu satır olduğu gibi nasıl yazılır ?

SEROUT portb.2,N2400,[GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984"] ' portb.2 pininden N2400 baud rate ile 4 byte şifre 1 byte iş yapan veri ve bir de "1984" gönderiyor bu komutu parçalarına bölerek nasıl açıklayabiliriz ?

Bir de aynı şey serin komutu için geçerli.

SERIN PORTB.1,N2400,["1984"],OKU,SIFRE1,SIFRE2,SIFRE3,SIFRE4

Burada da yine aynı şekilde portb.1 pininden n2400 naud rate ile köşeli parantez içinde ve tırnak içinde "1984" verisinin ne olduğunu nasıl çalıştığını merak ediyorum.

Burada tırnak içindeki sayıyı değiştirmem sorun teşkil etmiyor alıcı ve vericide bu sayılar eşit olursa hiç problemsiz iletişim çalışıyor.

Ben bu kodları windows 10 da da çalışan proton basicde de kullanmak istediğim için komutun yapısını ve çalışmasını öğrenmek istiyorum yardımcı olursanız çok memnun olacağım.

aRci

Merhaba;
İlk olarak serin ve serout komutları yada diğer parantez içeren komutlarda benim bildiğim veriler her zaman soldan sağa doğru ile sırası ile işleniyor.
 
SEROUT portb.2,N2400,[GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984"] 
Eğer yukardaki gibi bir veriniz varsa çıkışta verleriniz. soldan sağa sırası ile GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984" şeklinde gönderilecektir ve alıcı tarafında ise gene sırası ile veri gelecektir. o zaman anlaşılacağı gibi veri gönderim sırası yanlış oluyor çünkü asıl veri ve verinin şifresi yanlış sıra ile gönderiyorsunuz alıcı tarafı "1984" verisini beklerken ondan önce gönderilen asıl verileri kaçırıyor.

Bana göre olması gereken şu şekilde olmalıdır.

'Vericide
SEROUT PORTB.2,N2400,["1984",SIFRE1,SIFRE2,SIFRE3,SIFRE4,Data] 

'Alıcıda
Basla:
SERIN2 PORTB.1,396,Basla,100,[WAIT("1984"),SIFRE1,SIFRE2,SIFRE3,SIFRE4,GelenData] 

Bu komutlar ile verici sırası ile sabit olan "1984" verisini ardından 4 byte şifreyi ve asıl data yı gönderiryor.
Alıcı tarafı ise portb.1 pininden ilk olarak "1984" sabit değeri bekliyor. bu değeri alasıya kadar bekleiyor. eğer gelen verilerde istediği değeri bulamazsa 100ms sonra Basla etiketine gidiliyor. bu sayede program kilitlenmeden çalışmaya devam edecek. Sabit değer gelince sırası ile gelen verile değişkenlere aktarıp alt satıra geçiyor.
projenizi bu değişiklikleri uygulayarak devam etmelisiniz. daha sonrasında belki asıl veriden sonra başka sabit bir değer göndererek gelen datanın doğruluğunu sağlayabilirsiniz.

ete

Benzer açıklamayı ben yapacaktım Arci benden önce davranmış.
Burada 1984 rakam değil karekter olarak değerlendiriliyor ve bir şifreleme amaçlı karekter dizisi özelliği taşıyor. Alan 1984'ü gördüğünde bilginin kendisine ait olduğunu anlıyor. Ama yeri Arci'nin dediği gibi ters konumda.

Ete

has_artvin_li

Alıntı yapılan: ete - 06 Haziran 2022, 18:47:14Benzer açıklamayı ben yapacaktım Arci benden önce davranmış.
Burada 1984 rakam değil karekter olarak değerlendiriliyor ve bir şifreleme amaçlı karekter dizisi özelliği taşıyor. Alan 1984'ü gördüğünde bilginin kendisine ait olduğunu anlıyor. Ama yeri Arci'nin dediği gibi ters konumda.

Ete

Ama haberleşme bire bir uyum sağlıyor ? Yani bizzat elime direnci pic i programlayıcıyı alıp defalarcadır yapıp çalıştırdığım komutlar ve bu komutları çalıştırmak için de epey bi uğraşmıştım windows 10 da.

Peki bunu protona uyarlasak nasıl olur acaba ?

alisumer

#4
uyuum sağlıyor çünkü kullandığınız 1984 kısmı sadece öylesine gönderdiğiniz bir veri herhangi bir işlevi yok hiç yazmasanız 4 byte veriyi boşuna göndermemiş olursunuz zaman kazanırsınız.şifre kısımları bir şarta bağlı değil en azından serin içinde kontrolu yapılmaz gelen veri sırası ile değişkenlere kaydedilir program içerisinde ayrıca doğruluklarını kontrol ettiğiniz sürece bence sorun yok serin içerisinde kullandığınız "1984" kısmı ise nasıl bir tepki verir bilemedim açıkçası çünkü bir değişken değil bir sorgulama değil belki ayrı ayrı 4 ram adresi olarak algılayıp o adreslere bile veri yazıyor olabilir kullanımı sizin yaptığınız gibi olmamalı basic komutları belli kurala uymuyor aRci nin yazdığı gibi olmalı yani güvenlik için "1981" verisi geldiğinde iletişimin doğru vericiden alındığı anlaşılıp veri kaydedilmeli aksi halde gelen veri yoksayılmalı.yani 1981 verisi zaten bir şifre diğer şifre kısmının aksine iletişimin doğru kaynaktan geldiğini anlamak için kullanılmalı örneğin aynı anda iki ayrı verici yayın yapıyor ki kullandığınız frekans çok fazla gürültünün olduğu bir frekans( buna kapı kumandaları ve telsiz frekansları da dahil) wait "1984" komutu diğer kaynakların gönderdiklerini değişkenlere yazmasını engeller .
Hep meraktan

aRci

Sistemin nasıl çalıştığını yorumlarsak aslında olan peş peşe verileri gönderdiğinizde verilerin diziliş sebebi ile çalışıyor. aslında çalıştığını sanıyorsunuz.

verileri ard arda gönderdiğimizde şu şekilde görünecektir.

GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984" ... GON,SIFRE1,SIFRE2,SIFRE3,SIFRE4,"1984"

yukardaki sıralaya dikkat ederseniz sizin programda veriler arası zaman gecikmesi olmadığı alıcı kısım ilk olarak "1984" verisini alıp daha sonra gelenleri değişkenlere atıyordu. 1. paket veri gönderdiğinizde paket sonundaki "1984" alıcı tarafından alınasıya kadar o paket içindeki diğer verileri görmezden geliyor. ve paket sonundaki "1984" verisini alınca diğer verileri beklemeye geçiyor. diğer verileri ise 2. veri paketinde alıyor.
yani 1. paket verilerini görmezden gelip diğer paketten gelen verileri alıyor. aslında buradaki aksaklık sadece ilk pakette gecikme olarak yansıyor. uygulamada belki farkedilemiyor olabilir.
bu bence tutarsız çalışmaya ve programın duraksamasına sebep olacak varsa diğer işlemlerin yapılmasına engelleyecek bir yapı bunun üzerine düzeltme yapılarak ilerlemelisiniz.

ete

Ard arda yollanan bilgilere veri paketi diyoruz. Bu verileri alan tarafın  ortadan almaya başlamak alınacak verilerde kayıp olmasına sebep olur. Bu nedenle bu tür veri aktarımlarında önce bir veri başı yada dizi başı işareti yollanır. Alacak olan taraf öncelikle bu veri başı işaretini almaya çalışır aradan gelenleri dikkate almaz. Senin örneğinde veri başı işareti "1984" karekter dizisi (rakam değil).Ama ne yazıkki sen bu işareti en başa değil veri sonuna ekleyerek yollanan verilerin alınmasını zorlaştırmış oluyorsun. Şayet tek bir sefer yollama yapsan alıcı hiç bir şey alamayacak idi. Ard arda aynı bilgiyi yollaman seni bir nebze kurtarıyor. İstersen işi daha fazla uzatmayalım. İşin doğrusu veri paketinin başına "1984" karekterlerini koymak ve ardından veri paketini sırası ile yollamak şeklinde yapılmasıdır. Programını düzelt ve farkı gör derim.

Ete

Powered by EzPortal