877 ve usart

Başlatan transistor, 02 Ekim 2005, 14:07:54

transistor

arkadaşlar ,
877 ye pcden 3 baytlık data gönderiyorum ve bunu 877nin eepromuna kaydediyorum.
daha sonra eepromu okuyup değerleri kıyaslayarak işlem yapıyorum.
burada takıldığım husus pcden 3 baytlık veriyi almada
AL	
	BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	RETURN			; hayır tekrar kontrol et
	MOVF	RCREG,W		; evet, alınan veriyi W saklayıcısına yükle 
	MOVWF	ADRES
	MOVF	RCREG,W
	MOVWF	MOD
	MOVF	RCREG,W
	MOVWF	MANUEL

burada bir yanlışlık veya eksiklik var gibi
pcden ise vb de yazdığım programla gönderiyorum
Private Sub Command4_Click()
If MSComm1.PortOpen = False Then GoTo bitir1
MSComm1.Output = Chr(50)
MSComm1.Output = Chr(77)
MSComm1.Output = Chr(84)
bitir1:
End Sub

bu bölümdede eksiklik veya yanlışlık olabilir
yardımcı olursanız sevinirim.
Herşey Vatan İçin.

matematika

#1
.

transistor

vbden gelen datanın birinci byte ile ilk önce kontrol ediyorum
AL	
	BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	RETURN			; hayır tekrar kontrol et
	MOVF	RCREG,W		; evet, alınan veriyi W  yükle 
	MOVWF	ADRES
	MOVF	RCREG,W
	MOVWF	MOD
	MOVF	RCREG,W
	MOVWF	MANUEL
ADRES_KONTROL	
	MOVF	PORTB,W
	ANDLW	B'00000010'     ; KİME      (SELECT DIPSWITCH)
	ADDLW	0X30
	SUBWF	ADRES,W
	BTFSS	STATUS,Z
	RETURN

eğer gelen data kendisine ait ise ;
MODE_KONTROL
	MOVLW	'M'      
	SUBWF	MOD,W
	BTFSC	STATUS,Z
	GOTO	MANUEL_KAYDET    ; 2.byte M ise 
	MOVLW	'A'
	SUBWF	MOD,W
	BTFSC	STATUS,Z
	GOTO	AUTO_KAYDET        ; 2.byte A ise 
	RETURN

bu sefer 2. byte bakıyorum ve gelen 2.byte istenen ise bunu eeproma kaydediyorum
MANUEL_KAYDET	
	BANKSEL	EEADR  		; ÇALIŞMA MODU MANUEL 'M' EEPROMA YAZILIR
	MOVLW	0x01
	MOVWF	EEADR
	BANKSEL	MOD
	MOVF	MOD,W
	BANKSEL	EEDATA
	MOVWF	EEDATA
	BANKSEL	EECON1
	BCF	EECON1,7
	BSF	EECON1,WREN
	MOVLW	H'55'
	MOVWF	EECON2
	MOVLW	H'AA'
	MOVWF	EECON2
	BSF	EECON1,WR
	BTFSC	EECON1,1
	GOTO	$-1
	NOP
	NOP	
	NOP
	BCF	EECON1,WREN
	BANKSEL	EEADR  		; MANUEL ÇALIŞMA SICAKLIĞI EEPROMA YAZILIR		
	MOVLW	0x02
	MOVWF	EEADR
	BANKSEL	MANUEL
	MOVF	MANUEL,W
	BANKSEL	EEDATA
	MOVWF	EEDATA
	BANKSEL	EECON1
	BCF	EECON1,7
	BSF	EECON1,WREN
	MOVLW	H'55'
	MOVWF	EECON2
	MOVLW	H'AA'
	MOVWF	EECON2
	BSF	EECON1,WR
	BTFSC	EECON1,1
	GOTO	$-1
	NOP
	NOP	
	NOP
	BCF	EECON1,WREN
	BANKSEL	PORTA
	RETURN

eğer 2.byte A ise yine eepromun 1. satırına A kaydediyorum
ilk önce eeproma çalışmanın manuel olduğunu anlamak için eepromun ilk satırına M harfini 2.ye ise vbden gelen 3.byte içeriğini(ör.50) kaydediyorum.
daha sonra eepromun ilk adresini okuyup çalışma manuel mi yoksa auto mu diye bakıyorum
             CALL	EEPROM_OKU	; ÇALIŞMA MODU KONTROLU
EEPROM_OKU
	BANKSEL	EEADR
	MOVLW	0X01
	MOVWF	EEADR
	BANKSEL	EECON1
	BCF	EECON1,7
	BSF	EECON1,RD
	BANKSEL	EEDATA
	MOVF	EEDATA,W
	BANKSEL	EEOKUNAN
	MOVWF	EEOKUNAN
	BANKSEL	EEADR
	MOVLW	0X02
	MOVWF	EEADR
	BANKSEL	EECON1
	BCF	EECON1,7
	BSF	EECON1,RD
	BANKSEL	EEDATA
	MOVF	EEDATA,W
	BANKSEL	EEOKUNANM
	MOVWF	EEOKUNANM
	RETURN

eepromun ilk adresini ve 2. adresini okuyup gelen dataya göre işlem yapmaya çalışıyorum
MOVLW	'M'
	SUBWF	EEOKUNAN,W
	BTFSC	STATUS,Z	
	CALL        MANUEL_CALIS; MANUEL CALISMA İÇİN	
	MOVLW	'A'
	SUBWF	EEOKUNAN,W
	BTFSC	STATUS,Z
	CALL         AUTO_CALIS; AUTO ÇALIŞMA İÇİN DALLAN
	GOTO	ANA
MANUEL_CALIS
	MOVLW	D'40'
	SUBWF	EEOKUNANM,W
	BTFSC	STATUS,Z
	BSF	PORTC,3		; KAZAN ÇALIŞ	
	RETURN

fakat vbden gelen 3.byte problem yaşıyorum.
arkadaşlar biraz uzun oldu biliyorum özür dilerim.
Herşey Vatan İçin.

matematika

#3
.

transistor

hocam öncelikle ilgine teşekkür ederim.
söylediğini denedim fakat olmadı.
vbden 2bayt gönderdiğimde pic bunu işliyor ama 3.bayt geldiğinde buna karşı yapması gerekeni yapmıyor.
bana sorun vbden gönderdiğim datayı almadaymış gibi geliyor.
yani burada;
BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	RETURN		; hayır tekrar kontrol et
	MOVF	RCREG,W	; evet, alınan veriyi W ye yaz 
	MOVWF	ADRES
	MOVF	RCREG,W	
	MOVWF     MOD
	MOVF	RCREG,W 
	MOVWF	MANUEL
	BCF	PIR1,RCIF

bu kodda takıldım.  :(
1 byten fazla daya alma için yazılmış bir rutine ihtiyacım var ben burada tıkandım.
Herşey Vatan İçin.

matematika

#5
.

transistor

arkadaşlar bu konuda bilgisi olan ve yardımcı olacak birileri yok mu?
yardımlarınızı bekliyorum.
Herşey Vatan İçin.

transistor

BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	GOTO	$-1		; hayır tekrar kontrol et
	MOVF	RCREG,W		; evet, alınan veriyi W saklayıcısına yükle 
	MOVWF	ADRES
	BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	GOTO	$-1		; hayır tekrar kontrol et
	MOVF	RCREG,W		; evet, alınan veriyi W saklayıcısına yükle 
	MOVWF	MOD
	BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	GOTO	$-1		; hayır tekrar kontrol et
	MOVF	RCREG,W		; evet, alınan veriyi W saklayıcısına yükle 
	MOVWF	MANS

bu işi kesme kullanarak bu kodlarla çözdüm tabi eksik noktası var gelen data 3  byte tan az ise program tıkanıyor.
sayın matematika ve diğer arkadaşlar bu konu ile ilgili görüşlerinizi bekliyorum
Herşey Vatan İçin.

Pyrodigy

dostum buna benzer bir program yazdım ben.
ama seninkinden biraz farklı ben ilk gelen adres baytını kesmede kontrol ediyorum.eğer kesme içinde gelen adres doğruysa tanımladığım bir registerin herhangi bir bitini set yapıyorum.ve böylece.kesmeden çıktığımızda eğer o bit set ise program yön değiştiriyor ve diğer 3  baytı alarak işlem yapıyor.
ancak sen kseme felan kullanmamışsın.kodunu ayrıntılı incelemedim ancak ana programında yani ilk bayt pc den gönderildikten sonra 0,104 milisaniye sonra 2.bayt gelir(9600 b/sec için konuşuyorum)o konuya dikkat et.
önemli bir not:eğer kesme kullanmıcaksan ana programda bir sayac ata ve bu sayaç 3 baytlık olsun.her bayt alışında bu sayaçı arttır.sayaç 3 olduğunda program alt programlara dallanarak bu 3 baytı nereye istiyorsan işle ve bütün alt programlardan çıkarak,ilk haline döndür.
2.önemli not:eğer gelen baytın dipswitch ile uyuşup uyuşmadığını anlamak istiyorsan
dip adresini ve gelen baytı xorwf komutu ile test et.
ör:
 
 movf	RECREG,W	;gelen baytı w ye yaz
movwf	gelen_bayt	;w yi özel olarak atadığın reg.yaz
movf	dip_deger,W	;dip sdeğeri w ye yaz
xorwf	gelen_bayt,W	;ikisini karşıalştır
btfsc	STATUS,Z	;işlem sonucu?
goto	adres_dogru	;adres doğru diğer 3 bayt gelsin
return			;hayır programdan çık

ankaraya slm
Persistance is the name of the game in this business....

transistor

hocam ilgine teşekkür ederim. bende dediğin gibi ilk önce gelen byte ile dipswitch ile adres doğrulaması yapıyorum ve ondan sonraki gelen byteları kaydediyorum. yazdığın koddaki;
goto   adres_dogru   ;adres doğru diğer 3 bayt gelsin
alt rutunini yazabilirmisin ondan sonra ne yapıyorsun.
Herşey Vatan İçin.

Pyrodigy

Mesela şöyle olabilir;
SETUP kısmında programın ayarlarını yapıp dip switch i bir registere kaydederek daha sonra karşılaştırmak için kullanabilirsin.
ORG     0x0000		;place code at reset vector
ResetCode:		clrf    PCLATH		;select program memory page 0
  			       goto   SETUP
                              goto    Main		;go to beginning of program

Burası ana program rutini olabilir
Main:
	BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	GOTO	$-1		; hayır tekrar kontrol et
	CALL     Compare    ;karşılaştır(benim yazdığım alt program)
        GOTO    Main

B u alt programda gelen baytı dip switch verisiyle karşılaştırır ve eğer uyuişuyorsa adres_dogru alt programına akarak gelen baytları registerlere kaydedebilirsin..

Compare:
 
movf   RECREG,W   ;gelen baytı w ye yaz
movwf   gelen_bayt   ;w yi özel olarak atadığın reg.yaz
movf   dip_deger,W   ;dip sdeğeri w ye yaz
xorwf   gelen_bayt,W   ;ikisini karşıalştır
btfsc   STATUS,Z   ;işlem sonucu?
goto   adres_dogru   ;adres doğru diğer 3 bayt gelsin
return         ;hayır programdan çık

NOT:Eğer uyuşmuyorsa programına bir alt program daha ekleyerek senkron halde kalmasını ancak gelen baytları işlememesini söyleyebilirsin.
Bu konuya dikkat et.
Umarım işine yarar
Persistance is the name of the game in this business....

transistor

hocam öncelikle ilgine teşekkür ederim.
benim sıkıntım gelen ilk baytın dip switch ile kontrol etmek hususu değil
switchi unutun bana 1bytetan fazla en az 3 bayt alan bir rutin lazım takıldığım nokta burası
benim şuan yazdığım kod şu;
BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	GOTO	$-1		; hayır tekrar kontrol et
	MOVF	RCREG,W		; evet, alınan veriyi W saklayıcısına yükle 
	MOVWF	ADRES
	BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	GOTO	$-1		; hayır tekrar kontrol et
	MOVF	RCREG,W		; evet, alınan veriyi W saklayıcısına yükle 
	MOVWF	MOD
	BTFSS	PIR1,RCIF	; alıcı tampon boş mu?
	GOTO	$-1		; hayır tekrar kontrol et
	MOVF	RCREG,W		; evet

görüldüğü gibi burada 3byte tan az data gelirse program burada döngüye girer benim sıkıntım işte burda.
Herşey Vatan İçin.

Pyrodigy

Alıntı yapılan: "transistor"hocam öncelikle ilgine teşekkür ederim.
benim sıkıntım gelen ilk baytın dip switch ile kontrol etmek hususu değil
switchi unutun bana 1bytetan fazla en az 3 bayt alan bir rutin lazım takıldığım nokta burası
1-yazılanları iyi oku!!!!!!!!!
Alıntı yapılan: "Pyrodigy"Tarih: Çrş Ekm 12, 2005 12:38 am
önemli bir not:eğer kesme kullanmıcaksan ana programda bir sayac ata ve bu sayaç 3 baytlık olsun.her bayt alışında bu sayaçı arttır.sayaç 3 olduğunda program alt programlara dallanarak bu 3 baytı nereye istiyorsan işle ve bütün alt programlardan çıkarak,ilk haline döndür.
2-
ADRES_KONTROL   
   MOVF   PORTB,W
   ANDLW   B'00000010'     ; KİME      (SELECT DIPSWITCH)
   ADDLW   0X30
   SUBWF   ADRES,W
   BTFSS   STATUS,Z
   RETURN

Sıkıntın gelen ilk baytı dip ile kontrol etmek değil diyorsun ama yazdığın kodda AND komutu kullanmışsın.Sana tavsiyem Compare alt programını iyi gözden geçirmen.
Alıntı yapılan: "transistor"
görüldüğü gibi burada 3byte tan az data gelirse program burada döngüye girer benim sıkıntım işte burda.
Tabiki döngüye girer.Sen ne yolluyacağını bilmiyosan PIC e yazdığın program ne yapsın?Sihirli bir deynekle dokunup döngüden çıkartsınmı?
Eğer kaç bayt yolluyacağını bilmiyorsan neden 3 baytlık bilgiden bahsediyorsun?eğer korkun döngüyse watchdog timer yada timer1 ataman lazım.eğer okonulara girersen hem kafan hem programın karışır!!
Önce ne istediğini bilmen gerek.sana yazdığım rutine küçük eklemeler yaparak kullanabilirsin.Not olarak belirttimiştim  zaten
Persistance is the name of the game in this business....