PicBasic Proda Serout ve Serin 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

muyat

Merhabalar .
Lora modül kullanarak bir çalışma yapıyorum bende.1 verici ve 6 farklı alıcı var.
Vericiden "KEMAL" şifresi alıcılara ulaştıgında alıcılardaki röleler çeksin istiyorum.Yazdıgım kod blogu dogru mudur? pic olarak 12f675 kullanacagım.Alıcılardaki röleler 500 er milisaniye arayla çekecek.

Verici:

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2025 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                              *
'*  Date    : 26.9.2025                                        *
'*  Version : 1.0                                              *
'*  Notes  :                                                  *
'*          :                                                  *
'****************************************************************
'---------------- VERICI (KEMAL ŞİFRELİ) ----------------
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF
DEFINE OSC 4
INCLUDE "modedefs.bas"

CMCON  = 7
ANSEL  = 0
TRISIO = %00001000        ' GP3 giriş (buton), GP1 çıkış (SEROUT)

' Pin isimleri
SYMBOL CIKIS = 1          ' SEROUT pini (GP1)
SYMBOL BUTON = GPIO.3      ' Buton pini (pull-up ile, basınca 0)



' Değişken
gelen VAR BYTE

'----------------------------------------------------------
Main:
    IF BUTON = 0 THEN      ' Buton basılıysa sırayla 1..6 gönder
        gelen = 1 : GOSUB SendCmd : PAUSE 500 : IF BUTON = 1 THEN GOTO Release
        gelen = 2 : GOSUB SendCmd : PAUSE 500 : IF BUTON = 1 THEN GOTO Release
        gelen = 3 : GOSUB SendCmd : PAUSE 500 : IF BUTON = 1 THEN GOTO Release
        gelen = 4 : GOSUB SendCmd : PAUSE 500 : IF BUTON = 1 THEN GOTO Release
        gelen = 5 : GOSUB SendCmd : PAUSE 500 : IF BUTON = 1 THEN GOTO Release
        gelen = 6 : GOSUB SendCmd : PAUSE 500 : IF BUTON = 1 THEN GOTO Release
    ENDIF
    GOTO Main

Release:
    gelen = 0
    GOSUB SendCmd          ' hepsi bıraksın
    GOTO Main
'----------------------------------------------------------

' Alt program: Kemal + komut gönder
SendCmd:
    SEROUT CIKIS, T9600, ["KEMAL", gelen]
RETURN
'---------------- SON VERICI ----------------


aLICI :
'---------------- ALICI (KEMAL ŞİFRELİ) ----------------
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF
DEFINE OSC 4
INCLUDE "modedefs.bas"

CMCON = 7
ANSEL = 0
TRISIO = %00000001        ' GP0 giriş (SERIN), GP2 çıkış (ROLE)

gelen  VAR BYTE
MY_ID  CON 3              ' Bu kartın ID'si (1..6)

SYMBOL GIRIS = 0          ' SERIN pin numarası (GP0)
SYMBOL ROLE  = GPIO.2     ' Röle çıkışı

ROLE = 0

Main:
    ' Önce "KEMAL" kelimesini bekle
    SERIN GIRIS, T9600,["KEMAL"],gelen

    ' Şifre doğruysa gelen komutu uygula
    IF gelen = MY_ID THEN
        ROLE = 1
    ELSE
        IF gelen = 0 THEN
            ROLE = 0       ' 0 gönderilince hepsi bırak
        ELSE
            ROLE = 0       ' yanlış ID › kapalı
        ENDIF
    ENDIF
GOTO Main
'---------------- SON ALICI ----------------



ete

Ben olsam şöyle düşünürdüm.
Lora USART kullanır. Bunun komut karşılığı alma işinde Hserin ve verme işinde ise Hserout komutlarıdır. Madem kullandığın işlemcide usart portu yok bu durumda Hserin ve Hserout komutlarının karşılıklarını kullanman gerekir ki onlarda Alma işinde SERIN2,
SERIN2 GIRIS,84,[WAIT("KEMAL"),GELEN]
ve verme işinde ise
SEROUT2 CIKIS,84,["KEMAL",GIDEN] şeklindedir.

Diğer taraftan senin kullandığın şekilde de SERIN ve SEROUT komutlarını kullanmak mümkün.
TRUE mod da kullanmak şartı ile ki sende o şekilde kullanmışsın.

Bu durumda Alma işinde  SERIN GIRIS,T9600,["KEMAL"],GELEN

verme işinde ise        SEROUT CIKIS,T9600,["KEMAL",GIDEN]

şeklinde kullanılabilir.

Komut kullanımında bir sorun olmadığına göre işin mantık kısmına bir bakalım.

Verme kısmında istenen "Buton basılıysa sırayla 1..6 gönder" işinde ilk komuta bakacak olursak;
gelen = 1 : GOSUB SendCmd : PAUSE 500 : IF BUTON = 1 THEN GOTO Release
1 rakamını yollayıp 500ms bekliyorsun. Bu kısım doğru. Ancak buton bırakılmış ise Release etiketine gidip rölelinin bırakması için sıfır yolluyorsun. 500ms çok kısa bir süredir ve o anda buton bırakılmamış ise ne olacak bu kısım belirsiz. Buton 500ms gecikme esnasında bırakılmış ise program Release etiketine gidip sıfır yollayacak. Peki bu durumda bütün rölelerin çektirlip bırakılması nasıl yapılacak. Bunun sağlanması için butonun bırakılmaması gerekir. Bu durumda ilk satırda yer alan, IF BUTON = 1 THEN GOTO Release komutu anlamsız oluyor.
Bana göre işin doğrusu Buton bırakılıncaya kadar bütün röleler çektirilip bıraktırılır ve sonunda butonun bırakılması beklenir. Şöyle,

     IF BUTON = 0 THEN      ' Buton basılıysa sırayla 1..6 gönder
	        gelen = 1 : GOSUB SendCmd : PAUSE 500 : GOSUB RELEASE
	        gelen = 2 : GOSUB SendCmd : PAUSE 500 : GOSUB RELEASE
	        gelen = 3 : GOSUB SendCmd : PAUSE 500 : GOSUB RELEASE
	        gelen = 4 : GOSUB SendCmd : PAUSE 500 : GOSUB RELEASE
	        gelen = 5 : GOSUB SendCmd : PAUSE 500 : GOSUB RELEASE
	        gelen = 6 : GOSUB SendCmd : PAUSE 500 : GOSUB RELEASE
                WHILE BUTON=0:WEND:PAUSE 100
	    ENDIF
Burada RELEASE etiketi sonundaki GOTO MAIN yerine RETURN yazılması gerekir bunuda unutmayalım.

Senin yazdığın şekilde komut kullanılabilir. Zira butona basılıp bırakılmaz ise 1 nolu röle çektirilir ardından 1 nolu röle RELEASE ile bıraktırılmadan 2 nolu röle çektirilir. İşte bu komut 1 nolu rölenin bıraktırılmasınıda sağlar (aşağıda alıcı kısmında benim yaptığım değişiklik ile birlikte). Böylece Buton bırakılıncaya kadar bütün röleler çektirilir ve bıraktırılır. Ancak döngü tamamlandıktan sonra yeniden başa dönülerek tekrardan 1 nolu röleden başlayarak yeniden çektir bırak işlemi yapılmaya başlar. Bu istenen bir durummudur değilmidir sen karar ver. İşin doğrusu bence yukarıda açıkladığım şekilde olmalı.


Gelelim ALma kısmına,
Her bir işlemci için MY_ID CON x şeklinde bir ID tanımlamışsın bu doğru.

Verici bir sinyal yolladığında alıcıların hepsi bu sinyali alacak ve ID numarası uyan röle çekecek.
Uymayan ise her halukarda röleyi bıraktıracak. Amaç bu.
Bu amaçla yazılan kod da hata yok ancak daha uygun şekilde yazılabilir.

        IF gelen = MY_ID THEN
            ROLE = 1
        ELSE
            ROLE = 0       ' 0 gönderilince hepsi bırak
        ENDIF
Bu kod dizisi de aynı işi yapar. Mantık sıralamasına bakılacak olursa,
- ID, gelen ile aynı ise ROLE=1 olacak.
- ID, gelen ile aynı değilse yani gelen sıfır ise yada ID nin haricinde bir sayı ise ROLE=0 yapılacak. Sende aynı amacı daha fazla kod yazarak elde ediyorsun sonuçta.

İş burada bitmiyor elbette. Şayet programı Goto Main ile başa gönderir isen Role=1 olmasına rağmen ve Gelen=1 değişmediği sürece sürekli Role=1 komutu icra edilir. Bu nedenle programı biraz daha iyileştirmek gerekir.
IF gelen = MY_ID THEN
    IF ROLE = 0 THEN ROLE = 1
ELSE
    IF ROLE = 1 THEN ROLE = 0    
ENDIF
Bu şekilde lüzumsuz röle aç röle kapat komutlarının verilmesi engellenmiş olur.

Ete

 

muyat

Ete hocam
Hem alıcı hem vericide E220-400T22D kullandım.
Besleme ise 12volt trafodan sonra 7805 ile hem 12f675 hem lora modülleri besleniyor.
Ama bir türlü haberleşme saglayamadım.Sadece 1 adet alıcı ve 1 adet verici yaptım.Röle çektirmeye çalışıyorum.Röleyi çektirmeyi başarabilirsem diger alıcıları ondan sonra yapacagım. m0 ve m1 pinleri hem alıcıda hem vericide şaseye baglı
Burda sorun beslemenin 5volt olması mı?Ne yapmalıyım. 7805'den sonra gerilim bölerek 3,3volta düşürsem sistemi 12f675 çalışır mı ?Siz nasıl yapmıştınız?

ete

İlk mesajında hangi modülü kullandığını söylemediğin için olaya Standart bir RF modül kullandığını varsayarak cevap yazmış idim. Şimdi ne kullandığını söyleyince işin rengi belli oldu.

Lora RF modül bilinen diğer 433 Mhz RF modüllerden çok farklı.Kendine has bir habrleşme formatı var. Öncelikle hem TX olarak kullanılan modülün hemde RX olarak kullanılan modülün önce ayarlanmaları gerekiyor (Config işlemi). Bu PC arayüz programı ile yapılabiliyor ama bir ara bağlantı elemanı gerekiyor idi hatırladığım. Ancak bu işi yazacağınız kod içine yerleştirilecek bir Config kodu ile de yapabilirsiniz.

Bu modül data sheet'inde her ne kadar 5V da çalışabilir desede haberleşme seviyesi 3V3'e göre yapılmış. Bu nedenle tavsiyem modülü 3V3 ile çalıştırman ve bu voltaja uygun birde işlemci kullanman en doğrusu. Çoğu yeni nesil işlemciler bu voltajla çalışabiliyor. Sende 12F1822 kullanabilirsin.
İlla 5v İşlemci kullanacak isen TX ve RX hatlarına seri 4K7-10K aralığında pullup direnci bağlaman data sheet de öneriliyor. Ben sistemi 3V3 da çalıştırmıştım.

Haberleşme sağlayabilmen için TX ve RX modüllerine aynı adres numarasını ve aynı kanal numarasını vermen gerekir.
Örnek Konfig bilgisi şöyle olabilir. Bu bilgi hem TX modüle hemde RX modüle başlangıçta verilmelidir.
Hserout [$c0,$00,$08,$00,IDNO,$62,$00,$17,$43,$00,$00] 
Burada $C0 bir komut verileceğini belirliyor. $C0dan sonraki bilgilerin karşılığı şöyle,
$00=Adres
$08 = 8 adet byte bilgisi verileceğini gösteriyor
$00 = ilk byte bilgisi olarak adres HighByte
IDNO=ikinci byte bilgisi olarak Adres Lowbyte (modüllere numara verebilirsin otomatikman onun adresi olur)
$62=Baud Parity değeri  9600 8N1 karşılığı
$00=dB seçim değeri (haberleşme gücü en kuvvetlisi $00)
$17=Kanal numarası
$43=Özellikle Fixed mod seçimi için bu değer verildi
$00=key High Byte
$00=Key Low byte

Bu bilgi modüle programın en başında bir kere verilecek ve böylece modül
17 kanal ve $00xx kanal numarasına sahip olacak. Bu modüle bir bilgi iletebilmen için
Şimdi modüller fixed Mode konumunda oldukları için bu moddaki haberleşme formatına bakacak olursak,
Fixed mod da haberleşme formatı na bakarsak,
HSEROUT[$00, $IDNO, $17, AA, BB, CC]   şeklinde olduğunu görürüz.
Açıklaması şöyle (IDNO=2 olsun) bu modülde Adres değeri $0002 olarak ayarlanmış ve kanal numarası da $17 olarak veriliyor. O halde bu modülün yolladığı AA - BB - CC şeklindeki 3 byte bilgi, Karşıdaki alıcılarda Adres değeri $0002 olan ve kanal değeride $17 olan bütün alıcılar tarafından alınır.
Şayet TX tarafı adres olarak $FFFF kullanır ise kanal numarası tutan bütün farklı adresler bu bilgileri alabilir.

Diyelimki adres bilgisi $0002 olan tek bir modül var. Bu durumda yalnızca o modül bu bilgileri alacaktır. Şunu unutma karşılıklı haberleşme için ADRES, KANAL, BAUD_RATE uyumu mutlaka olmalıdır.

LOra modül kullanalı epeyce olmuş. Pek çok şeyi hatırlayamadım. BU nedenle senin modül datasheet'ini okuyarak pek çoğunu hatırladım ve önemli olanlarıda sana bildirdim.
Umarım başarırsın.

Ete



 

muyat

Hocam tekrar merhabalar.
alıcı ve vericide 12f675 kullandım.
Derslerinizden bakarak uyarladıgım aşagıdaki kod lorae32 de çalışmıyor.Yapmak istedigim şey vericide butona basınca 1 degeri gönderip röleyi çektirmek sonrasında 2 saniye sonra 0 degeri gönderip alıcıdaki röleyi bırakmak.Ama kesinlikle vericiden 0 degeri gitmeden rölenin bırakmasını istemiyoruz.

Alıcı ve vericilerin yazılımında aşagıdaki gibi "ETE" kaldırınca butona basınca alıcıdaki röleyi çektirip ledi yakıyor.2 saniye sonra(vericide pause 2000 olarak belirttim )  0 degeri alınca da ledi kapatıyor.

Burda da "ETE" yokken şöyle bir sorun ortaya çıkıyor.rölenin bırakması için gerekli deger 0 yerine örnek  101 olsun deyince bazen röleyi bırakmıyor.Halbuki al ve ver değişkenleri byte olarak tanımlı.ikisi de 101 degeri alabilir.Bu problemleri çözersem 1 vericili 5 alıcılı bir hobi projem var onu tamamlayacagım.

Bu arada lorae32 yi 5 voltla besledim.Rx ve tx pinleri gerilim bölücü olmadan oldugu gibi pine baglı.Yani "ETE" değişkeni varken çalışmamasının,burayla alakası var mı bilmiyorum.Yapay zekaya sordugumda ise iyice saçmalıyor.Basit kodları daha da karmaşık hale getiriyor.

Verici:
SEROUT2 CIKIS,84,[ver]

Alıcı:
SerIn2 GIRIS,84,[AL]
 



verici:

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2025 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                              *
'*  Date    : 28.9.2025                                        *
'*  Version : 1.0                                              *
'*  Notes  :                                                  *
'*          :                                                  *
'****************************************************************
'---------------- VERICI 
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF
DEFINE OSC 4
INCLUDE "modedefs.bas"

CMCON  = 7
ANSEL  = 0
TRISIO = %00000100          ' GP2 giriş (buton), GP1 çıkış (SEROUT)
GPIO  = 0                  ' çıkışları temiz başlat

' Dahili pull-up (yoksa GP2'ye 10k harici pull-up ekle)
OPTION_REG.7 = 0            ' GPPU enable
WPU = %00000100            ' sadece GP2 pull-up

' Pin isimleri
CIKIS VAR GPIO.1              ' SEROUT pin numarası (GP1)
BUTON VAR GPIO.2            ' Buton (aktif-LOW: basınca 0)

' Değişken
AK VAR BIT
VER VAR BYTE
tekrar var byte
vuran var byte
PAUSE 500
SURE VAR BYTE
sondur var byte


'----------------------------------------------------------
Main:
SURE=100
  
IF BUTON=0 THEN                
AK=1



VER=1                '
GOSUB SendCmd
pause SURE
GOSUB SendCmd
pause SURE
GOSUB SendCmd
pause 300


pause 2000


VER=0
GOSUB SendCmd
pause SURE
GOSUB SendCmd
pause SURE
GOSUB SendCmd
PAUSE 300




ENDIF

IF BUTON=1 AND AK=1 THEN
AK=0
VER=0
GOSUB SendCmd
GOSUB SendCmd
endIF

GOTO main

'----------------------------------------------------------

'
SendCmd:
SEROUT2 CIKIS,84,["E","T","E",ver]
RETURN

Alıcı:

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2025 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 19.10.2025                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'================== ALICI 3 — SON HAL ==================
' PIC12F675 @ 4 MHz (Internal RC)
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF
DEFINE OSC 4
INCLUDE "modedefs.bas"

CMCON  = 7                  ' komparatörler kapalı
ANSEL  = 0                  ' tüm pinler dijital
TRISIO = %00000001          ' GP0 giriş (SERIN), diğerleri çıkış
GPIO   = 0

' Pinler
GIRIS  VAR GPIO.0           ' LoRa RX (SERIN2)
ROLE   VAR GPIO.5           ' Röle/LED çıkışı

' Değişken
gelen  VAR BYTE
VER VAR BYTE
AL VAR BYTE
ROLE = 0
PAUSE 200

' ------------------ Döngü ------------------
Main:
   
    SerIn2 GIRIS,84,[WAIT("ETE"),AL]
   


    IF AL=1 THEN
        ROLE = 1
        GOTO Main
    ENDIF
 
    IF AL=0 THEN
        ROLE = 0
    ENDIF
    GOTO Main


ete

Bana kalırsa bir sürü problemin var.
LORA modüllerinin haberleşme formatına uymuyorsun bu bir. İkincisi kesme kullanmıyorsun ki bu durumda senkron yakalama sorunun olabilir. Neden bu Lora yı bırakıp yapacağın işe uygun başka bir RF modül kullanmıyorsun?. Çünki programın böyle RF modüllere uygun Lora ya uygun değil.

Şimdi diyeceksin ki arada bir çalışıyor. Aslında o çalışmıyor. Tesadüfen bir komut tutuyor ve röleyi çektiriyorsun. Ama bıraktırmayı çalıştıramadığın için sistemin Lora ya uygun değil demektir.

Modülün M0 ve M1 pinleri var bunları kullanıp kullanmadığını bilemiyorum. Kullanmaz isen haberleşme yapamayacağınıda biliyorum. Zİra Modüle komut verirken M0=1, M1=1 yapılmalı ve haberleşme esnasında ise bu pinler her ikiside LOW olmalı. Modülün haberleşme parametreleri başlangıçta modüle verilmeli. 9600 Baud, 8N1 bilgisi, kanal numarası gibi parametreler. Ayrıca her bir modüle bir adres yani modül abone numarası vermen gerekir. Sonra haberleşirken bu parametreler kullanılarak bilgi yollanmalıdır.
Vericiye diyelimki 01 adresi verdin alıcı 02 adresinde olmalı. Programda bunların hiç birisini göremiyorum. Voltaj önemli demiştim. Modül 3,3V ile çalışıyor işlemci de bu voltajlarda çalışması gerekir yada işlemci illa 5V ile çalışacak ise arada seviye düzenleyici kullanman gerekir. Bunu internetten araştır 5V TTL den 3V3 TTL e çevirici şeklinde bulursun bir sürü yol.

Kısaca ya Lora formatına uyacaksın yada formatsız çalışan başka bir modül kullanacaksın.
Bunun başka yolu yok maalesef.
Nulabildiğim en teferruatlı data sheet aşağıdaki linkte verilmiş. Modül modeline görre açıklamalar yapılmış. Dikkatlice incelemeni öneririm.
https://ressources.labomedia.org/_media/media_08/lora_e32-868t20d_usermanual_en_v1.30.pdf

Ete

Pepe


muyat

hocam.vericiye 0 adresi verdim.Alıcıya 1 verdim.Kanal numarası 27
Bütün bu ayarları lora için üretilen  usb stick kullanarak ilgili konfigurasyon programıyla yaptım. m0 ve m1 kart üzerinde gndye bağlı.Modülün datasheetinde 5 voltla çalışabildigi yazıyor..Dikkat edilmesi gereken şeylerden biri de pic rx girişine 10k ve 20k gerilim bölücü dirençler girerek 5 voltu 3.3volta düşürdüm
Aşagıdaki basitçe kodlar sizce dogru mu?Çünkü hala  butona basınca alıcıdaki led yanmıyor.Besleme 5 volt.Çünkü datasheette supply voltage 5,2v lara kadar çıkabilir diyor.
Sadece communication level voltajı 3,2 volt gösteriyor. ben o kısmı 5v direk picden çıkış yaptım..Sorun bu kısımla alakalı da olabilir.

Verici
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2025 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                              *
'*  Date    : 28.9.2025                                        *
'*  Version : 1.0                                              *
'*  Notes  :                                                  *
'*          :                                                  *
'****************************************************************
'---------------- VERICI 
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF
DEFINE OSC 4


CMCON  = 7
ANSEL  = 0
TRISIO = %00000100          ' GP2 giriş (buton), GP1 çıkış (SEROUT)
GPIO  = 0                  ' çıkışları temiz başlat

' Dahili pull-up (yoksa GP2'ye 10k harici pull-up ekle)
OPTION_REG.7 = 0            ' GPPU enable
WPU = %00000100            ' sadece GP2 pull-up

' Pin isimleri
CIKIS VAR GPIO.1              ' SEROUT pin numarası (GP1)
BUTON VAR GPIO.2            ' Buton (aktif-LOW: basınca 0)

ADRR_H CON 0
ADDR1 CON 1                ' Alıcı-1 ADDL
CHAN  CON 27                ' Ortak kanal



' Değişken
AK VAR BIT
gelen VAR BYTE

PAUSE 500
SURE VAR BYTE




'----------------------------------------------------------
Main:
SURE=100
  
IF BUTON=0 and ak=0 THEN                
AK=1



gelen=1                '1.led YANDI
GOSUB SendCmd
pause SURE
GOSUB SendCmd
pause SURE
GOSUB SendCmd






ENDIF

IF BUTON=1 AND AK=1 THEN
AK=0
GELEN=0
GOSUB SendCmd
GOSUB SendCmd
endIF

GOTO main

'----------------------------------------------------------

'
SendCmd:
' hedef 1 için:
SEROUT2 CIKIS,84,[ADRR_H,ADDR1,CHAN,GELEN]


return
  

Alıcı:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2025 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 20.10.2025                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
'================== ALICI 1 ==================
' PIC12F675 @ 4 MHz  (Internal RC Oscillator)
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF
DEFINE OSC 4


CMCON = 7                   ' Komparatörleri kapat
ANSEL = 0                   ' Tüm pinleri dijital yap
TRISIO = %00000001          ' GP0 giriş (SERIN), diğerleri çıkış
GPIO = 0

'--- Pin tanımları ---
GIRIS VAR GPIO.0            ' LoRa TX ›<z PIC GP0 (SERIN2)
ROLE  VAR GPIO.5            ' Röle / LED çıkışı

'--- Değişkenler ---
HDR   VAR BYTE
ADRR  VAR BYTE
CHAN  VAR BYTE
GELEN VAR BYTE

'--- Başlangıç durumu ---
ROLE = 0
PAUSE 200

'---------------------- Döngü ----------------------
Main:
SERIN2 GIRIS,84,[hdr, adrr, chan, gelen]   ' timeout ekle

IF hdr = 0 AND adrr = 1 AND chan = 27 THEN
    IF gelen = 1 THEN
        HIGH ROLE
        pause 2000
    ELSEIF gelen = 0 THEN
        LOW ROLE
    ENDIF
ENDIF
GOTO Main


Powered by EzPortal
▲