PicBasic Proda Serout ve Serin komutlarındaki Yapı ?

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

aRci

Lorayı fixed moda aldığınız zaman veri gönderimine alıcı cihazın adresi ve kanalı ile veri gönderine başlar ve ardından verinizi göndermelisiniz verici kısmını bu şekilde yaptığınızda alıcı cihaz başta gönderilen bu 3 bayti kendi içerisinde kontrol eder ve eğer veri kendisne geldi ise çıkışta sadece bu 3 byte dan sonra gelen veriyi size gönderir.
programlamak için kullanılan usb cihazını normal kullanım için pinleri değiştirerek pc üzerinden veri gonderip alarak testleri daha rahat yapabilirsiniz.

muyat

son ekledigim kodlara bakar mısın.
Verici adresi 0
alıcı adresi 1 yaptım.serin2 ve serout 2 komutları kullandım.Hata var mı sizce?

aRci

alıcı tarafında yanlışlık var alıcı tarafında sadece gelen adlı değer görebilirsin vericinin adres ve kanal verisi alıcı tarafında sana gönderilmez. Fixed mod da değilse vericiden gönderilen tum değerler alıcıdan cıkar aksi halde fixed modda ise verici ilk 3 byte ti adres ve kanal verisi kabul eder aynı şekilde alıcıda fixed modda ise gelen ilk 3 byte kanal ve adres verisi olarak yorumlar.

burada kanal aslında modülüm frekans aralığını belirliyor vericiye gelen 3 byte ile verici frekansını belirler ve oradan adres aldığı modüle veri gönderir.
alıcı tarafı ise tüm aynı kanal da olan cihazlar veriyi alır ve eğer kendi adresi veri ile gelen adresle uyarsa o zaman gelen verileri tx pininden gönderir.

SERIN2 GIRIS,84,[gelen]   ' timeout ekle

ete

Muyat,

Anlaşılan bu sistemi 12F675 ile çalıştırmakta kararlısın. Ancak şartlar senin bu isteğine pek uygun değil maalesef.
Lora data sheetlerini ve oradaki örnek bağlantı şekillerini incelersen bir Lora modül işlemciye en azından 5 pin kulanılarak bağlanmalıdır. Bunlar;
- Lora - TX .....işlemcinin RX pinine bağlanacak.
- Lora - RX .....işlemcinin TX pinine bağlanacak.
- Lora - M0 .....işlemcide bir giriş pinine bağlanacak
- Lora - M1 .....işlemcide bir giriş pinine bağlanacak
- Lora - Aux.....işlemcide bir giriş pinine bağlanacak.

Senin sistemde bir Buton birde Çıkış olduğu için toplam ihtiyacın olan pin sayısı 7 oluyor. Ne yazıkki 12F675 de bu amaçla kullanılabilecek yalnızca 6 pin mevcut. Bu durumda bu işlemciyi Lora modül ile birlikte kullanman mümkün değil. Zaten bir şema vermemişsin ancak pograma bakınca yalnızca RX ve TX pinlerini bağladığını anlıyorum. Bu şekilde zaten o modül ile haberleşmen pek mümkün değil. Değil derken belkide M0 ve M1 pinlerini kullanmadan default parametreleri kullanarak bu iş yapılabilir gibi geliyor ancak bunu denemedim ve emin değilim. Çünki haberleşme olabilmesi için modüllere modul numarasıda verilmelidir. Buda ancak Konfig ayarı ile veya PC arayüz kullanılarak yapılabilir.

Örnek bir Config verme işlemini açıklayayım.
Format :  C0, Başl_Addr(00), Kaç_Byte(08), Addrs(00 01), Baud_Parity(62), dB, Kanal, Fixed_Mod
HESEROUT [$C0,$00,$08,$00,IDNO,$62,$00,$17,$43,$00,$00]  ............ Veya
SEROUT2 CIKIS,84,[$C0,$00,$08,$00,IDNO,$62,$00,$17,$43,$00,$00]  komutu ile bu şekilde bir kereye mahsus veriliyor.
Parametreleri teker teker incelersek;
$C0 =Set Register komutudur.
$00 = registerlere değer vermek için başlangıç adresi
$08 = Kaç Byte blgi yolanacak onu belirtiyor. $08 den sonraki 8 byte oluyor
$00XX = Bu parametre yazılan modüle verilen adres değeri olacak. Burada $00ID şeklinde bir değer veriliyor. ($0001 gibi)
$62 = Haberleşmenin 9600 baud ve 8N1 formatında yapılacağını belirliyor.

$00 = Haberleşme gücü denilebilir $00 desibel en güçülü haberleşme oluyor
$17 = haberleşme için Kanal numarası (haberleşen iki modülde aynı kanal kullanılmalı)
$43 = Fixed mod haberleşme seçimi
$00 = Key-1 (haberleşme güvenliği için kullanılıyor) Key_HighByte
$00 = Key-0  Key_LowByte
Şimdi bu şekilde konfig verilmiş iki modülün haberleşebilmesi için TX tarafından nasıl veya ne bilgisi yollanmalıdır ona bakalım.

HSEROUT[$00,$XX,$17,Bilgi-1, Bilgi-2..]
Dikkat edilirse ilk yollanan bilgi Ortak Haberleşme adresi ki burada $00XX şeklinde xx=01 olabilir. İkincisi ise Kanal numarası ve ardından yollanan bilgiler geliyor.
Buradan çıkartılacak anlam şu olmalı. Aynı Haberleşme adresine sahip iki modül birbirini görebilir. O halde iki modülde de adres değeri aynı olmalı. Benzer şekilde iki modulde de Kanal numarası da aynı olmalıdır. Zira kanal aslında Mhz cinsinden haberleşme frekansını belirler ve aynı frekansta yayın yapılırsa iki modül bir birini görebilir.

Şimdi bunun üzerine iki modülün haberleşebilmesi için olmazsa olmazlar neler onlara bakalım.
Öncelikle iki modül de Normal modda olmalı. Yani M0=0 ve M1=0 olmalı her iki modülde.
Haberleşme Adresi iki modülde de aynı olmalı. Kanal numarasıda aynı olmalıdır.
Diğer parametreler zaten Konfig yolu ile modüllere verilmiş olacağından artık haberleşmede bir engel kalmayacaktır.

TX tarafı bir şey yolladığı zaman RX tarafının aynı anda bunu alabilmesi gerekir. Buna senkron tutması diyoruz. Bu işlem ancak RX tarafında USART kesmesi kullanılırsa mümkün olabilir.
USART kesmesi kullanılmıyor ise işiniz biraz zor zira gelen bilgiyi sürekli kontrol etmek gerekecek. USART kesmesinde işlemci gelen bilgiyi otomatik olarak alıp kendi buffer'ına atar ve HESERIN komutu ile bu bilgi gecikmelide olsa alınabilir. Ama kesme olmadığında sürekli olarak SERIN2 giris,84,[Gelen1,gelen2,gelen3) şeklinde beklemede olmak gerekir.

Sonuç olarak şunu söyleyebiliriz. USART modülü olmayan bir işlemci ile çalışmak sürekli olarak sıkıntı çıkartabilir. Ayrıca Lora modüle konfig verebilmenin şartı M0 ve M1 pinlerini kullanmak olduğundan yeterli pin sayısına sahip işlemci kullanmak mutlaka gereklidir.

O halde 12F675 ile bu işin yapılabileceğini sanmıyorum. Kısa yoldan bu işlemciyi kullanmaktan vazgeçmen gerekir.

Ete



muyat

Tekrar merhabalar .
Malesef Ete hoca'nın dedigi gibi 12f675 ve 12f683 de bu işi yapamadım..Her ne kadar yapay zeka bu işin 12f serisiyle olacagını söylese de serin2 ve serout2 ile bu bu iş olmadı.

Ben de usart donanımlı 14 pinli 16f688 kullandım ve onda da sonuç istedigim gibi değil.
Yapılan işlemleri söyleyim:

-Lora e32-433t20d kullandım.Header dişi pin kullandım.istedigimde lorayı sökebiliyorum
-Kendi config arayüz programıyla fixed voltage seçtim.
-M0 VE M1 pinleri kartta şaseye baglı..
-Sistemde pic ve lora beslemesi  tamamen 5v ile çalışıyor.
-Vericideki picin tx çıkışından loranın rx girişine girerken 10k ve 20k ile gerilimi bölerek o giriş voltajını 3,3 volta düşürdüm.Ama istedigim gibi çalışmıyor hala.
Tek verici ve 5 alıcı yapacaktım ama şu an 2 alıcı varken sorun yaşıyorum.
Butona basınca sırayla alıcıdaki ledler yanıp ledlere ait röleler çekecek.Ama bazen ya paketleri algılamıyor röleler çekili kalıyor bazen de röleyi bırakmıyor.Bunun nedeni ne olabilir.Denemeleri tezgah üzerinde yapıyorum.Butona basınca hem alıcıda hem vericide aux ledi göz kırpıyor zaten.

Yapmak istedigim senaryo butona basınca iki alıcıdaki rölenin sırayla çekmesi,sonrasında 1500 ms sonra da sırayla rölelerin bırakması.Senaryo aslında daha uzun ama bu halde bile sorun yaşadıgım için en basit halinden başlıyorum.

Gerçekten 1 aydır artık bu iş benı çok yordu.Basit bir röle çektiremiyorum.Kodları yazıyorum.
Tekrardan ya pcbyi değiştirecegim yada aurdino nano ile yapmayı deneyecegim.
Nerde yanlışlık var bakabilir misiniz

'*************************************************************
'*  VERICI — 16F688 @ 4 MHz @ 9600 baud — CH=23
'*************************************************************
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF
DEFINE OSC 4

OSCCON = %01100000
ANSEL  = 0
CMCON0 = 7

TRISA = %00000100        ' RA2 giriş
TRISC = %00100000        ' RC5 giriş (RX), RC4 çıkış (TX)
PORTA = 0
PORTC = 0

'---- Donanımsal UART
DEFINE HSER_TXSTA   20h
DEFINE HSER_RCSTA   90h
DEFINE HSER_BAUD    9600
DEFINE HSER_CLROERR 1

'---- Değişkenler
CH     CON 23
ADDH   CON 0
BUTON  VAR PORTA.2
AK     VAR BIT
GELEN  VAR BYTE
SURE   VAR BYTE
ADDL   VAR BYTE

SURE = 250
PAUSE 300

'-------------------- Döngü --------------------
Main:

    IF (BUTON = 0) AND (AK = 0) THEN
        AK = 1

        '--- YAK sıra: 1 › 2
        GELEN = 1

        ADDL = 1 : GOSUB SendCmd : PAUSE SURE : GOSUB SendCmd
        PAUSE 200

        ADDL = 2 : GOSUB SendCmd : PAUSE SURE : GOSUB SendCmd

        PAUSE 1500

        '--- SÖN sıra: 1 › 2
        GELEN = 0

        ADDL = 1 : GOSUB SendCmd : PAUSE SURE : GOSUB SendCmd
        PAUSE 200

        ADDL = 2 : GOSUB SendCmd : PAUSE SURE : GOSUB SendCmd
    ENDIF

    IF (BUTON = 1) AND (AK = 1) THEN
        AK = 0
        PAUSE 50
    ENDIF

GOTO Main

'-------------------- Alt program ---------------------
SendCmd:
    HSEROUT [ADDH, ADDL, CH, GELEN]
RETURN




'---------------- ALICI — 16F688 @ 4 MHz @ 9600 baud ----------------
@ __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _IESO_OFF & _FCMEN_OFF
DEFINE OSC 4

OSCCON = %01100000      ' 4 MHz iç osilatör
ANSEL  = 0              ' Tüm pinler dijital
CMCON0 = 7              ' Komparatör kapalı

' RC5 = RX (giriş), RA5 = LED (çıkış)
TRISA = %00000000      ' RA5 çıkış (0), diğer A giriş; burada =00100000 => RA5=0 (out)
TRISC = %00100000      ' RC5 giriş, diğerleri çıkış
PORTA = 0
PORTC = 0

' Donanımsal UART
DEFINE HSER_TXSTA  20h
DEFINE HSER_RCSTA  90h
DEFINE HSER_BAUD    9600
DEFINE HSER_CLROERR 1

LED VAR PORTA.5      ' *** LED PIN#2 ***
gelen VAR BYTE

LOW LED
PAUSE 200

Main:
    HSERIN 10, Main, [gelen]  ' LoRa Fixed Mode: 

    IF gelen = 1 THEN
        HIGH LED
        endIF
  IF gelen  = 0 THEN
        LOW LED
    ENDIF

GOTO Main





aRci

Merhaba baud ayarında gözden kaçan şeyler var onu düzelttirseniz çalışacaktır. donanımsal uart kısmını alttaki kodla değiştirin 4 mhz deki ayarınız bu olmalı 16f688 i bilmiyorum sigorta ayarlarını doğru var sayıyorum.

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 4MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

ete

Her zaman söylerim bu gibi ayarları , Mister E PIC multi-Calc (PicMultiCalc.exe) isimli kısacık ama faydalı bir program kullanarak alabilirsiniz.
aRci nin dediği gibi Baud register ayarların yanlış. Düzeltirsen bir ihtimal çalışacaktır.
Yine de alıcı da USART kesmesi kullansan çok iyi olurdu senkron tutturmak için önemli bu söylediğim.

USART kesmesini aktive edip bir bilgi alındığında bit değişkenini set ederek alım işini garantiye alabilirsin. Basla etiketinden sonra;
BASLA:
While aldım=0:wend
    IF gelen = 1 THEN
	        HIGH LED
	        endIF
	  IF gelen  = 0 THEN
	        LOW LED
	    ENDIF
aldım=0
goto basla
şeklinde kullanman daha mantıklı olurdu.

Ete

aRci

Aslında lora için pin sayısı problem olmadığın da AUX pini kesme için kullanıla bilir. Aux pini veri gönderim ve alımı sırasında düşen kenar sinyal verir ve veri gönderimi yada alması bitene kadar sıfıra çekili kalır. Aux pini gelen veriçözülünce ayar ile belirlenen süreye göre once düşen kenar sinyal verip sure kadar bekleyip ardından verileri gönderir. Genelde benim tercihim bu şekilde oluyor donanımsal uart kullanamadığım zamanlarda.

Powered by EzPortal
▲