serin2 ve serout2 hakkında Yardım

Başlatan GamzeDemir, 25 Mart 2008, 16:53:38

GamzeDemir

Merhaba arkadaslar

Ben seri iletişimle ilgili bi projede anlamadıgım bi hatayla karsılastım acaba bu komutların kullanımında bana yardımcı olabilirmisiniz

Verici kısmında ilgili kod su

Alıntı Yapfor i=0 to 10
   SEROUT2  GPIO.0,396,[ONCU,ONCU,ONCU]
   PAUSE 2
   SEROUT2  GPIO.0,396,[I3,I4,DATAS[0],DATAS[1]]     ;fabkod
   PAUSE 2
   SEROUT2  GPIO.0,396,[DATAS[2],DATAS[3],DATAS[4],DATAS[5]]   ;ID ve SUBE
   pause 2
   next i

Alıcı kısmında ise sanırım serin2 komutunu kullanmam lazım ama syntax hatası veriyor ben asagıdaki gb yaptım acaba dogrusunu bilen var mı

Alıntı YapDATA_AL:
   PAUSE  3
   SERIN2  PORTA.1,396,[I3,I4,DATAS[0],DATAS[1]]   ;gelen sinyal fabkod u mu ve
   PAUSE 1
   SERIN2  PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5]    ;id m mi eger
                ;öyleyse sube nosunu manchester halini data[4] ve 5 e al
   PAUSE 3

Lüütfen yardm edermisiniz :cry:

ete

Programın tamamını vermeden ve çıkan hata kodunun ne olduğunu söylemeden bize posteki saydırmak istediğini düşünüyorum.
Ortada bir kusur var ,kusura ilişkin ip uçları senin elinde ve bunları bize vermiyorsun ve kusuru bulun diyorsun bu çok adil değil. Lütfen mesajlarınızda detay veriniz.

Buna rağmen bir hata gördüm ve bildiriyorum.
SERIN2 PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5] ;id m mi eger

satırında en sonda köşeli parantezi kapatmayı unutmuşsun. Doğrusu şöyle olmalı idi.

SERIN2 PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5]] ;id m mi eger

Umarım yalnızca bu hata vardır.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

GamzeDemir

Alıntı yapılan: "ete"Programın tamamını vermeden ve çıkan hata kodunun ne olduğunu söylemeden bize posteki saydırmak istediğini düşünüyorum.
Ortada bir kusur var ,kusura ilişkin ip uçları senin elinde ve bunları bize vermiyorsun ve kusuru bulun diyorsun bu çok adil değil. Lütfen mesajlarınızda detay veriniz.

Buna rağmen bir hata gördüm ve bildiriyorum.
SERIN2 PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5] ;id m mi eger

satırında en sonda köşeli parantezi kapatmayı unutmuşsun. Doğrusu şöyle olmalı idi.

SERIN2 PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5]] ;id m mi eger

Umarım yalnızca bu hata vardır.
Ete

Ama
Alıntı YapSERIN2 PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5]]
Burda datas[5] in yanındaki parantezin baslangıcı olmamıs oluyor programın tamamını vereyim zaten ana kısımları idi bunlar o yuzden onemli gordugum kısımları eklemiştim baska hiç bi amacım yoktu

asagıda gondern pic12f675 kullandım

Alıntı YapINCLUDE  "modedefs.bas"
DEFINE OSC 4                            ; osilatör değeri
GPIO=0      ; çıkışlar temizlendi
OPTION_REG.7=1 'pull-up lar disable


i VAR byte


ONCU VAR BYte
oncu=%01010101
FABKOD var byte
fabkod=%00000000
ID var byte
ID=%00000000
SUBE var byte
sube=65 ;A
I3          CON %01100101               ; TANIMLAYICI
I4          CON %01011010               ; TANIMLAYICI   C

asm
   CLRWDT                              ; clear WDT regiterı
   BSF       STATUS, 5                   ; BANK1
   ;CALL   0x3FF                       ; 3430.Eğer 0x3FF adresindeki değer silindi ise ve bu adresteki degeri
   MOVLW    b'00110000'
   MOVWF   OSCCAL                     ; 4-MHz-ayarlama.Internal Osilator kullanıldı.
   CLRF    ANSEL                       ; digital I/O için gerekli olan ayar
   MOVLW   b'00001000'                 ; GPIO.1  set as output GPIO.3 input
   MOVWF   TRISIO
   BCF       STATUS, 5                   ; BANK0
   MOVLW   b'00000111'                 ; Comparator off
   MOVWF   CMCON                       ;      "      "
ENDASM



DEGER var byte
I1 var byte
I2 var byte
DATAS var byte[6]

deger=fabkod
GOSUB   DEGISTIRME
DATAS[0]=I1
DATAS[1]=I2

DEGER=id
GOSUB   DEGISTIRME
DATAS[2]=I1
DATAS[3]=I2

deger=sube
gosub  degistirme
datas[4]=i1
datas[5]=i2


;************** datayı gönder************************************
GONDER:
   GPIO.5=1                          ; tx on
   pause 10
   
   for i=0 to 10
   SEROUT2  GPIO.0,396,[ONCU,ONCU,ONCU]
   PAUSE 2
   SEROUT2  GPIO.0,396,[I3,I4,DATAS[0],DATAS[1]]     ;fabkod
   PAUSE 2
   SEROUT2  GPIO.0,396,[DATAS[2],DATAS[3],DATAS[4],DATAS[5]]   ;ID ve SUBE
   pause 2
   next i
   
   pause 10
   GPIO.0=1  
   GPIO.1=1  
   pause 20000
   GPIO.5=0                            ; tx off

;****************************************************************


END


DEGISTIRME:
asm
   CLRWDT
   MOVLW   h'0F'
   ANDWF   _DEGER, W
   MOVWF   _I1  
   SWAPF   _DEGER, W
   ANDLW   h'0F'
   MOVWF   _I2
Endasm
   I1.7=I1.3 : I1.5=I1.2 : I1.3=I1.1 : I1.1=I1.0        
   I2.7=I2.3 : I2.5=I2.2 : I2.3=I2.1 : I2.1=I2.0        
ASM
   CLRWDT
   MOVLW   h'AA'
   ANDWF   _I1, F
   ANDWF   _I2, F
   BCF     STATUS, C
   RRF     _I1, W
   XORLW   b'01010101'
   IORWF   _I1, F
   BCF     STATUS, C
   RRF     _I2, W
   XORLW   b'01010101'
   IORWF   _I2, F
ENDASM        
   RETURN

Alıcı kısım olarak da 16f870 kullandım kodlar asagıda

Alıntı Yapinclude "modedefs.bas"

DEFINE OSC 4 'Oscillator speed in MHz: 3(3.58) 4

ADCON1=%00000110    ;digital input/output
TRISA =%00000010 ;PORTA.1 giriş PORTA.2 çıkış

PORTA=0


DEGER var byte
I1 var byte
I2 var byte
DATAS var byte[6]
SONUC var byte
AI1 var byte
AI2 var byte
;***********

SAYAC var byte
i var byte  

sayac=0  

ONCU VAR BYte
oncu=%01010101
FABKOD var byte
fabkod=%00000000
ID var byte
ID=%00000000
SUBE var byte
sube=65 ;A
I3          CON %01100101               ; TANIMLAYICI
I4          CON %01011010               ; TANIMLAYICI   C

deger=fabkod
GOSUB   DEGISTIRME
DATAS[0]=I1
DATAS[1]=I2

PAUSE 50

DEGER=id
GOSUB   DEGISTIRME
DATAS[2]=I1
DATAS[3]=I2

MAIN:


   GOSUB DATA_AL
   if sube == 65 then

      PORTA.2=1
   endif
 


goto main

END

;*************** gelen datayı alma ******************************
DATA_AL:
   PAUSE  3
   SERIN  PORTA.1,396,[I3,I4,DATAS[0],DATAS[1]]   ;gelen sinyal fabkod u mu ve
   PAUSE 1
   SERIN  PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5]    ;id m mi eger
                ;öyleyse sube nosunu data[4] ve 5 e al
   PAUSE 3
   AI1=DATAS[4]
   AI2=DATAS[5]
   GOSUB  DEGIS
   Sube=SONUC
   
   RETURN


DEGISTIRME:
asm
   CLRWDT
   MOVLW   h'0F'
   ANDWF   _DEGER, W
   MOVWF   _I1  
   SWAPF   _DEGER, W
   ANDLW   h'0F'
   MOVWF   _I2
Endasm
   I1.7=I1.3 : I1.5=I1.2 : I1.3=I1.1 : I1.1=I1.0        
   I2.7=I2.3 : I2.5=I2.2 : I2.3=I2.1 : I2.1=I2.0        
ASM
   CLRWDT
   MOVLW   h'AA'
   ANDWF   _I1, F
   ANDWF   _I2, F
   BCF     STATUS, C
   RRF     _I1, W
   XORLW   b'01010101'
   IORWF   _I1, F
   BCF     STATUS, C
   RRF     _I2, W
   XORLW   b'01010101'
   IORWF   _I2, F
ENDASM        
   RETURN
 
DEGIS:
   AI1.0=AI1.1 : AI1.1=AI1.3 : AI1.2=AI1.5 : AI1.3=AI1.7
   AI1= AI1 & %00001111
   AI2.6=AI2.5 : AI2.5=AI2.3 : AI2.4=AI2.1
   AI2= AI2 & %11110000
   SONUC=AI1|AI2
   RETURN  
   
;****************************************************************    

GamzeDemir

Alıntı YapSERIN2 PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5]]

yapmak istediğim ise su yani datas[2] ve datas[3] ü dogru almıssa eger datas[4] ve datas[5]  değişkenlerine gelecek olan 2 byte lık veriyi sıra ile ataması...

Tesekkurler

ete

Görülüyorki arada köşeli parantezi kapatmışsın. Gözümden kaçmış.
Ancak gelen bilginin tamamı köşeli parantez içinde olmalı. O nedenle dışarıda olanları içeri al. Zaten aynı işi yapacaktır.

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

GamzeDemir

Alıntı yapılan: "ete"Görülüyorki arada köşeli parantezi kapatmışsın. Gözümden kaçmış.
Ancak gelen bilginin tamamı köşeli parantez içinde olmalı. O nedenle dışarıda olanları içeri al. Zaten aynı işi yapacaktır.

Ete

tsekkurler ama yukarda yazmıs oldugum serin le alakalı kod serin2 değilde "serin" oldugunda syntax hatası vermeden calısıyor ama serin 2 yaptıgımda hata veriyor yani sizce bu normal mi bide

Alıntı Yapyapmak istediğim ise su yani datas[2] ve datas[3] ü dogru almıssa eger datas[4] ve datas[5] değişkenlerine gelecek olan 2 byte lık veriyi sıra ile ataması...

data[4] ve data[5] e atayacagını nerden bilecek yani sizin dediğiniz gb hepsini tek köşeli parantez içine koyarsam :oops:

Tesekkurler

ete

Serin komutunun özelliği gereği komut doğru çalışır.
SERIN Pin,Mode,{Timeout,Label,}{[Qual...],}{Item...}
Bu komut sizin için daha uygun. Köşeli parantez içinde yakalamak istediğiniz data yer alır ve peşinden esas datalarınız alınır. Ancak Serin2 komutunuda uygun biçimde kullanırsanız size uygun çalışabilir. Aşağıda bunun nasıl olduğunu anlatmaya çalışacağım.

Seri haberleşmede bilgiler verildiği sıra ile alınır. Dolayısıyla, bilgilerinizin;
Data(2) ardından Data(3), ardından Data(4) ve son olarakda Data(5) in sıra ile verildiğini düşünün. Bilgi hattında bunların dizilişi;
===> bilgi akış yönü olduğuna göre Data(5) - Data(4) - Data(3) - Data(2)
şeklindedir.
O halde Data(2) ve Data(3) alınmış ise zaten peşinden Data(4) ve Data(5)geldiği için otomatikman onlarda alınacaktır.
Ancak sizin şartlı alım yapma fikrini daha iyi uygulamak için bir yakalama sinyalini önden vermek daha doğru olacaktır. Zira gönderdiğiniz bir bilgi paketidir ve bilginin doğru alınması için paketin başının yakalanması gerekir.

Seri haberleşmede bilgi paketinin başının yakalanması için bazı usuller vardır. İşe verici kısmından başlarsak ,Bir defa önce bir uyandırma sinyali gönderilmesi gerekiyor. Bu sinyal ;
- 5 adet $AA baytı
- 5 adet $00 baytı
- 5 adet $FF baytından oluşur.
Bu bilgiler veri yoluna gönderildikten sonra yakalama sinyalinizi verirsiniz.
Ardından bilgilerinizi teker teker yollarsınız.
Örnek verecek olursak;
'Verici:
SEROUT2 GPIO.0,396,[$AA,$AA,$AA,$AA,$AA]
SEROUT2 GPIO.0,396,[$00,$00,$00,$00,$00]
SEROUT2 GPIO.0,396,[$FF,$FF,$FF,$FF,$FF]
SEROUT2 GPIO.0,396,[("D"),("E"),("M"),ONCU,DATAS[0],DATAS[1],DATAS[2],DATAS[3],DATAS[4],DATAS[5]] 
'Verici kısmında Serout komutlarının arasına PAUSE komutu koymayın. 

'Alıcı:
SERIN2 PORTA.1,396,[WAIT ("DEM"),ONCU,DATAS[0],[DATAS[1],DATAS[2],DATAS[3],DATAS[4],DATAS[5]]

Şayet uyandırma sinyalinin işi geciktirdiğini düşünürseniz biraz daha kısaltılabilir.
O zaman ilk 3 satır yerine aşağıdakileri yazın.
SEROUT2 GPIO.0,396,[REP$AA\5,REP$00\5,REP$FF\5]

Sistemin işleyişi ise şöyle olacaktır.
Yakalama sinyaliniz olan DEM işareti bulunursa peşinden gelen data lar sırası ile alınırlar değilse komut atlanır.
Uyandırma sinyali alıcının gönderilen dataların ortasından girmesini önler.

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

GamzeDemir

Alıntı yapılan: "ete"

'Alıcı:
SERIN2 PORTA.1,396,[WAIT ("DEM"),ONCU,DATAS[0],[DATAS[1],DATAS[2],DATAS[3],DATAS[4],DATAS[5]]

[/code]
Şayet uyandırma sinyalinin işi geciktirdiğini düşünürseniz biraz daha kısaltılabilir.
O zaman ilk 3 satır yerine aşağıdakileri yazın.
SEROUT2 GPIO.0,396,[REP$AA\5,REP$00\5,REP$FF\5]

Sistemin işleyişi ise şöyle olacaktır.
Yakalama sinyaliniz olan DEM işareti bulunursa peşinden gelen data lar sırası ile alınırlar değilse komut atlanır.
Uyandırma sinyali alıcının gönderilen dataların ortasından girmesini önler.

Kolay Gelsin
Ete

Çok teşekkür ederim gercekten çok guzel anlatmıssınız ama dediğiniz komutu da denedim
su hatayla karsılastım gene syntax hatası :cry:



Hatta söyle de değiştirip denedim gene olmadı

Alıntı YapSERIN2 PORTA.1,396,[WAIT ("DEM"),ONCU,DATAS[0],[DATAS[1],DATAS[2],DATAS[3]],DATAS[4],DATAS[5]

Ama su kod hata vermiyor

Alıntı YapSERIN  PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5]  

:?

Hatta aynı kod da yani sunda söyle bi değişiklik yapıyorum

Alıntı YapSERIN  PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5]  
Şöyle
Alıntı YapSERIN2  PORTA.1,396,[DATAS[2],DATAS[3]],DATAS[4],DATAS[5]  

İkincisi syntax hata veriyyor
Nasıl oluyor anlamadım :?  Lütfen yardım edin :(

ete

Komutun yazılışında ufak bir hata var. Hatayı ben yapmışım sende kopyalamışsın. açıklıyorum.

Yazılan komut şöyle;
SERIN2 PORTA.1,396,[WAIT ("DEM"),ONCU,DATAS[0],[DATAS[1],DATAS[2],DATAS[3],DATAS[4],DATAS[5]]

DATAS[1] inbaşında bir köşeli parantez var. Fazlalık bu işte o yüzden komut hata veriyor.
Doğrusu şöyle olmalı
SERIN2 PORTA.1,396,[WAIT ("DEM"),ONCU,DATAS[0],DATAS[1],DATAS[2],DATAS[3],DATAS[4],DATAS[5]]

Hadi bakalım başar şu işi artık.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

GamzeDemir

Alıntı yapılan: "ete"Komutun yazılışında ufak bir hata var. Hatayı ben yapmışım sende kopyalamışsın. açıklıyorum.

Yazılan komut şöyle;
SERIN2 PORTA.1,396,[WAIT ("DEM"),ONCU,DATAS[0],[DATAS[1],DATAS[2],DATAS[3],DATAS[4],DATAS[5]]

DATAS[1] inbaşında bir köşeli parantez var. Fazlalık bu işte o yüzden komut hata veriyor.
Doğrusu şöyle olmalı
SERIN2 PORTA.1,396,[WAIT ("DEM"),ONCU,DATAS[0],DATAS[1],DATAS[2],DATAS[3],DATAS[4],DATAS[5]]

Hadi bakalım başar şu işi artık.
Ete

Çok teşekkür ederim çok hakkınız gecti hemen deniyecegim :oops:  ;) oldu çok sağol un :D