Seri haberleşme hatası UDEA

Başlatan Mustafa48, 06 Ekim 2008, 11:28:40

Mustafa48

Arkadaşlar UDEA dan aldığım modülle RF haberleşme yapıyorum :aslında yapmak istiyorum. Ama bir türlü olmuyor 2 led 2 anahtar var bir tanesi yanıyor ama aynı anda ikincisi asla yanmıyor.Serout2 komtunda bir yanlış mı yapıyorum acaba Yardımcı olursanız sevinirim

PİC olarak her iki kısımda 16F628A kullanıyorum

Verici
INCLUDE "modedefs.bas"

OPTION_REG.7=1
trisa=%00000
trisb=%00001001


symbol pyeni=portB.0  
symbol peski=portB.3  
veri1 var byte
veri2 var byte
veri1=0
veri2=0
pause 50
basla:
if pyeni=0 then veri1=11
if pyeni=1 then veri1=22
if peski=0 then veri2=33
if peski=1 then veri2=55

pause 50
serout2 portb.2,396,[REP$AA\5,REP$00\5,REP$FF\5] 'uyandırma işareti yolla
serout2 portb.2,396,[$24,$52,$46,("M"),("U"),veri1,veri2,$45,$4E,$44,$0D,$0A]
pause 200
serout2 portb.2,396,[$24,$52,$46,("M"),("U"),veri1,veri2,$45,$4E,$44,$0D,$0A]
serout2 portb.2,396,[$24,$52,$46,("M"),("U"),veri1,veri2,$45,$4E,$44,$0D,$0A]
serout2 portb.2,396,[$24,$52,$46,("M"),("U"),veri1,veri2,$45,$4E,$44,$0D,$0A]
pause 100
goto basla


Alıcı

INCLUDE "modedefs.bas"
pyeni var porta.0  
peski var porta.1  
veri1 var byte
veri2 var byte
pyeni=0
peski=0
veri1=0
veri2=0

pause 50
basla:
PAUSE 2
serin2 portb.1,396,[wait("MU"),veri1,veri2]

pause 3
IF veri1=11 then
low pyeni
endif
if veri1=22 then
high pyeni
endif
if veri2=33 then
low peski
endif
if veri2=55 then
high peski
endif
pause 5
goto basla

end

Verici deki pyeni değişkenini buton1 peski değişkenini buton2 olarak alıcıdaki pyeni değişkenini led1 peski değişkenini led2 olarak algılarsanız daha anlaşılır olur diyorum. led1 anahtarla kontrol ediliyor ama ikisi aynı anda asla. serout2 komutunda aynı satırda 2 datayı peşpeşe göndermek doğrumu sizce

ete

Anladığım kadarı ile verici tarafında kullandığın iki buton LOW da bekliyor tuşa basılınca High oluyor.
Tuşun birisini ele alır isek;
Tuşa basılmaz ise 11 gönder ki bu alıcıda led=0 yapıyor.
Tuşa basılır ise     22 gönder ki buda alıcıda led=1 yapıyor.
Diğer Tuşda benzer şekilde;
Tuşa basılmaz ise 33 gönder ki buda led=0 yapıyor
Tuşa basılır ise    55 gönder ki buda led=1 yapıyor.

Şimdi tuşlara basılmadığı sürece ledlerin sönük olması gerekiyor (program gereği)
Peki tuşlardan birine basılırsa ona ait led yanıyor diğeri sönük kalıyor. Buda normal.
Aynı anda iki tuşa birden basmaz isen iki ledin aynı anda yandığını görmen mümkün değil. ELini butonun birinden çeker çekmez program senden hızlı davranıp ledi söndür bilgisini hemen karşıya aktaracaktır. Dolayısıyla yanan led derhal sönecek bir diğer tuşa basarsan ona ait led yanacaktır.
Aynı anda iki ledi de yanar görebilmen için iki tuşa aynı anda basman gerek.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mustafa48

iyi olacak hastanın doktor ayağına gelir derler ya  tam da bu durum oldu.
bu sitedeki hemen hemen tüm yazılarınızı (ete) okudum.Hatta bir çok projede kaynağım siz oldunuz .Bunun için teşekkür ederim.
Buton yerine anahtar koyalım. Aslında ben bu işi kontaktörlerle yapmayı planlıyorum.6 km ötedeki 2 adet pompayı açıp kapatmak istiyorum pompalar birbirinden bağımsız çalışıyor. 2 adet UDEA UFM-A12WPA aldım(transreceiver) 1-10km alanda etkili dediler. Sayın ETE  https://www.picproje.org/index.php/topic,5142&highlight=serout2 bu sayfadaki yazınızı okudum zaten kafamda iyice karıştı Bu proje aslında çift yölü haberleşme var ama ben en az düzenekle çalıştırabilsem ilerleyeceğim.
Şimdi şu serout2 komutunu sizce düzgün kullanıyormuyum. arka arkaya aynı satırda (veri1,veri2,veri3....verix) gibi datalar yollayabilirmiyim
Udea derki data olarak 72 byte kullanabilirsiniz.
udea nın istediği çerçeve formatı şöyle
24h 52h 46h (Max 72 BYTE) 45h 4Eh 44h 0Dh 0Ah
start of frame,  data   , end of frame
Bu şartlar altında ne yapcaz şimdiden teşekkürler

OG

Alıntı Yap1-10km alanda etkili dediler.
Ancak iyi yönlü bir anten ile mümkün. Hayal kırıklığı olmasın.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Mustafa48

Alıntı yapılan: "OG"
Alıntı Yap1-10km alanda etkili dediler.
Ancak iyi yönlü bir anten ile mümkün. Hayal kırıklığı olmasın.

Bende zaten öyle yaptım 2 yönlü anten transreceiver aldım

OG

UFM-A12WPA ve anten fiyatları (hangi anten ise) nedir?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Mustafa48

2 adet UFM A12WPA  Modul

2 adet UGPA 868 Anten ve konektörleri

300 ytl civarı

OG

UGPA 868 yönlü anten değil. Groundplane, temel çeyrek dalga dipol anten, 360 derece çalışır.

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Mustafa48

Aynen bu anten fakat udea yetkilileri çalışır dediler bende aldım. Benim zaten ilk etaptaki sorunum 2 datayı aynı anda yollayamam İSİS te herşey güzel. Ama gel görkü bordda çalışmıyor

ete

Yazıları okumuş isen göreceksinki dişe dokunur bir cevap gelmedi o zaman. SOnra yine ben kendim halletmiştim o sorunu. Sebep Serin komutlarının istenen bilgi gelmediği zaman programı bir müddet bloke etmesinden kaynaklanıyor idi. Tabiiki çözüm USART kesmesi kullanmak idi. Öyleyaptım ve o sorunu halletmiş idim.

Transreceiver henüz kullanmadım. Mesafeleri ne kadardır bilemiyorum. Yalnız Udea bunları taksi çağırma sistemlerinde bolca kullanıyor  ve sanırım randımanda alıyorlar.  6 Km öteye bu kontrol komutlarını aktarmak bayağı iddialı bir proje ama halledilmeyecek bir işde değil.

Bu tip işlerde Hserin ve Hserout komutlarını kullanmanı tavsiye ediyorum.
Özellikle alıcı kısmında USART kesmesine bağlı bir alış sistemi uygulaman bilginin alınma garantisi açısından daha uygun olacaktır.

16F628 pinlerini incelersen PortB.1 bacağı açıklamalarında RX ifadesini ve PortB.2 bacağı açıklamalarında ise TX ifadesini göreceksin. İşte bu bacaklar USART kullanıldığı zaman aktif olacak olan giriş ve çıkış bacaklarıdır.
Hserin ve Hserout komutu bu bacaklardan çalışır. Uygulamasıda son derece basittir. Gerekirse örnek verir yada yollarım. Aslında bu konuyla ilgili örnek forumda vermiştim USART kesmesi şeklinde aratırsan mutlaka bulursun. Dediğim gibi bulamaz isen haber ver.
USART kullanırsan her bir komutu 1 kere yazman yeterli olacaktır. Arka arkaya vermenin bir yararı yok. Bunları hep denedim zamanında ben.
Programda kullandığın mantık çok güzel değil. Meramını tam anlatabilirsen daha uygun bir kontrol sistemi yaratabiliriz.
Çok uzaklardaki kontrollar için sistemin açma ve kapatma emirlerini tekrarlamasında yarar görüyorum. Ancak transreceiver kullanınca karşılklı aldım verdim gibi onaylar birbirlerine yollanarak alma ve verme işleminin onayları alınabilir. Bu konuda daha fazla örnek ve mantık incelemeye bakmanı öneririm. Udea nın formatını çok fazla beğenmedim. Nedir o önden yollanan bilgiler. Yalnızca uyandırma bilgileri sana yeterli olacaktır. Diğerlerine gerek yok. (Bence) ama varsa bir açıklaması ona bir şey diyemem.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

OG

Alıntı YapModulun MAC katmanı datanın RF ile iletilmesi için gerekli eklemeleri (preamble, synchronization header) yaparak RF katmanına verir.
Oysa senin kodlarında ilave edilmiş.

Alıntı YapData paketiniz 72 byte'tan uzun ve arka arkaya gönderme yapacaksanız, yahut data
paketiniz 72 byte'tan kısa olmasına rağmen arka arkaya gönderme yapacaksanız, iki
gönderme paketi arasında aşağıdaki hesaplama kadar zaman boşluğu bırakmanız
gereklidir.
Td = (300 + Data Boyu*4) msn.
Oysa senin kodda herhangi bir zaman hesabı dikkate alınmamış. Ve tekrarlı gönderim yapılmış.

İlk bakışta görünen bunlar.

Yapacağın işi bir süre için unutup, basit bir alma gönderme yaparak kod yazmaya başlarsan işin kolaylaşır.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Mustafa48

Sayın ETE
bu konuyla ilgili projenin tamamını isis te çelıştırdım. Bunlarıda bu sitede elbette paylaşacağım.Çünkü bu siteden çok şey kazandım vermesinide bilirim. Dediğiniz gibi bu kadar uzak mesafede bi takım kontroller şart aslında projede lcdler roleler birçok şey var ama şimdiden buraya koyup kafa karıştırmak bu zor deyip arkadaşların yalnızca bakıp geçmesinide istemedim. Yanlış bilgi verip kişileride yanıltmak istemiyorum. Proğramı kısaca yazıp geçtim.İlginize teşekkür ederim Hserin ile biraz çalışayım

Mustafa48

Alıntı yapılan: "OG"
Alıntı YapModulun MAC katmanı datanın RF ile iletilmesi için gerekli eklemeleri (preamble, synchronization header) yaparak RF katmanına verir.
Oysa senin kodlarında ilave edilmiş.

Alıntı YapData paketiniz 72 byte'tan uzun ve arka arkaya gönderme yapacaksanız, yahut data
paketiniz 72 byte'tan kısa olmasına rağmen arka arkaya gönderme yapacaksanız, iki
gönderme paketi arasında aşağıdaki hesaplama kadar zaman boşluğu bırakmanız
gereklidir.
Td = (300 + Data Boyu*4) msn.
Oysa senin kodda herhangi bir zaman hesabı dikkate alınmamış. Ve tekrarlı gönderim yapılmış.

İlk bakışta görünen bunlar.

Yapacağın işi bir süre için unutup, basit bir alma gönderme yaparak kod yazmaya başlarsan işin kolaylaşır.

data boyu malum 2 byte Td bu şartlar altında 308 ms oluyor. Bu konuyu udea ile görüştüm derlerki 308 ms sn üstünde bir zaman verebilirsiniz.
bende yaptım ama nafile zaten devreyi en basite indirdim. 2 anahtar(toggle) 2 led. led ve anahtar gurubunun bir tanesi zaten çalışıyor hemde hiç sorunsuz. ikincisi asla çalışmadı .

Mustafa48

Arkadaşlar ETE arkadaşın büyük yardımlarıyla problem çözüldü
Bu projede bir merkezden yaklaşık 2 km uzaktaki 2 adet pompayı
kablosuz olarak açıp kapatmayı sağlar. Pompaların elektrik kesintisi veya termik atması veya çalışıyor bilgisi sürekli olarak merkeze iletilmektedir.
Merkezdeki LCD aracılığla bilgiler görüntülenir
RF haberleşmesinde UDEA nın 1-10 km alan etkili modülleri kulanılmıştır

MERKEZ Yazılımı

define osc 4
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
CMCON=7
trisa=%00000000
trisb=%00001011
INCLUDE "modedefs.bas"
define LCD_BITS 4     ' LCD Veri bus 4 bit
define LCD_DREG PORTB ' LCD Veri yazmacı B portu
define LCD_DBIT 4     ' LCD Başlangıcı 4.bit
define LCD_RSREG PORTA' LCD yazmaç seçimi a portu
define LCD_RSBIT 0    ' LCD reset 0.bitten yapılır
define LCD_EREG PORTA ' LCD Etkinleştirme PORT a de
DEFINE LCD_EBIT 2     ' LCD Etkinleştirme 2.bitten
DEFINE LCD_RWREG PORTA
DEFINE LCD_RWBIT 1
DEFINE LCD_LINES 2
LOW PORTA.1

INTCON=%00000000 
ON INTERRUPT GOTO INT 

symbol pompa1=portB.0 
symbol pompa2=portB.3

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

veri1 var byte 56
veri2 var byte 57
veri3 var byte 58
veri4 var byte 59
veri5 var byte 60
veri6 var byte 61
veri7 var byte 62
veri8 var byte 63
temp  var byte 64
a var byte 65
LCDOUT $fe,1
FOR temp=0 to 255
pauseus 5
next
veri1=0
veri2=0
veri3=0
veri4=0
veri5=0
veri6=0
veri7=0
veri8=0 

RCIE=1
PEIE=1
GIE=1

BASLA:
    if veri3=12 then LCDOUT $FE,2,"YENi HAT ELK YOK": goto eski                
    if veri4=13 and veri5=14 then 
    LCDOUT $FE,2,"YENi  HAT  DURDU"
    ENDIF
    if veri4=31 and veri5=14 then 
    LCDOUT $FE,2,"YENi  HAT  ARIZA"
    ENDIF
    if veri4=31 and veri5=41 then 
    LCDOUT $FE,2,"YENi H.CALiSiYOR"
    ENDIF
eski:
    if veri6=15 then LCDOUT $FE,$C0,"ESKi HAT ELK YOK": goto peski
    if veri7=16 and veri8=17 then 
      LCDOUT $FE,$C0,"ESKi  HAT  DURDU"
    ENDIF
    if veri7=61 and veri8=17 then 
      LCDOUT $FE,$C0,"ESKi  HAT  ARIZA"
    ENDIF
    if veri7=61 and veri8=71 then 
      LCDOUT $FE,$C0,"ESKi H.CALiSiYOR"
    ENDIF
peski:
    if pompa1=0 then veri1=11
    if pompa1=1 then veri1=22
    if pompa2=0 then veri2=33
    if pompa2=1 then veri2=44

    'HSEROUT [REP$55\5,REP$00\5,REP$ff\5] 'uyandirma sinyali preambl
    'PORTB.2=0:PORTB.2=1  'stop ve start bitleri
    hserout [$24,$52,$46,"M","U","S",veri1,veri2,$45,$4E,$44,$0D,$0A]
    for a= 0 to 63200
    pauseus 2
    next
    GOTO BASLA
    

DISABLE
INT:
    GIE=0
   Hserin 200,h6,[wait("ABC"),veri3,veri4,veri5,veri6,veri7,veri8]

h6:   
   TEMP=RCREG 
   GIE=1
   Resume
   enable
end



UZAK POMPA İstasyonu

INCLUDE "modedefs.bas"

define osc 4
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
INTCON=%00000000 
ON INTERRUPT GOTO INT 

trisa=%00000000
trisb=%11111011
CMCON=7
symbol pompa1=portA.0 'Pompa1 açık kapalı 
symbol pompa2=portA.1 'Pompa2 açık kapalı 
symbol E1=portB.0     'Pompa1 elektrik kontrolu
symbol M1=portB.3     'Pompa1 Pako kontrolu
symbol A1=portB.4     'Pompa1 Termik kontrolu
symbol E2=portB.5     'Pompa2 elektrik kontrolu
symbol M2=portB.6     'Pompa2 Pako kontrolu
symbol A2=portB.7     'Pompa2 Termik kontrolu

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

veri1 var byte 56
veri2 var byte 57
veri3 var byte 58
veri4 var byte 59
veri5 var byte 60
veri6 var byte 61
veri7 var byte 62
veri8 var byte 63
temp  var byte 64
a var byte 65
pompa1=0
pompa2=0
veri1=0
veri2=0
veri3=0
veri4=0
veri5=0
veri6=0
veri7=0
veri8=0

RCIE=1
PEIE=1
GIE=1
'-------------------------------------------------------------------------------
BASLA: 

      IF veri1=11 then low pompa1
      IF veri1=22 then high pompa1
      IF veri2=33 then low pompa2
      IF veri2=44 then high pompa2
      
      if E1=0 then veri3=12
      if E1=1 then veri3=21
      if M1=0 then veri4=13
      if M1=1 then veri4=31
      if A1=0 then veri5=14
      if A1=1 then veri5=41
      if E2=0 then veri6=15
      if E2=1 then veri6=51
      if M2=0 then veri7=16
      if M2=1 then veri7=61
      if A2=0 then veri8=17
      if A2=1 then veri8=71
      
    'HSEROUT [REP$55\5,REP$00\5,REP$ff\5]
    'portb.2=0:portb.2=1 ' vericiyi kapat aç
    hserout [$24,$52,$46,"A","B","C",veri3,veri4,veri5,veri6,veri7,veri8,$45,$4E,$44,$0D,$0A]
    for a= 0 to 63200
    pauseus 2
    next 
    GOTO BASLA

DISABLE
INT:
    GIE=0
    Hserin 200,CIK,[wait("MUS"),veri1,veri2]
CIK:
    TEMP=RCREG 
    GIE=1
    Resume
    enable
END


ETE arkadaşımıza büyük yardımlarından dolayı sonsuz teşekkürler

efsanepoldem

    arkadaşım bende böyle bir devre ile uğraşıyorum. yalnız senin programda bu kanal seçme işlemlerini falan göremedim. bildiğim kadarıyla $C1 yada $C2 datasi ile kanal seçiyorsun. Acaba ben mi yanlış biliyorum.