SERİ İLETİŞİMDE BİR HATA

Başlatan kaplan_65, 01 Şubat 2007, 18:42:21

kaplan_65

SLM
Aşağıda vermiş olduğum iki programla iki pic arasında; PORTA'nın  RA0 pinini kullanarak seri olarak 1 byte veri göndermeye çalışıyorum(iki pic in de RA0 pinleri birbirine bağlı). Örneğin gönderici.asm programında PORTB den okuduğum  Â‘10000000' veriyi alıcı.asm programı ile diğer pic e ‘00000001' şeklinde PORTB ye yazdıracağım(simetrik bir şekilde). Fakat göderdiğim bilgi 1 bit kaymış şekilde gidiyor. Mesela  Â‘01000000' bilgisini karşı taraftan ‘00000010' şeklinde almam gerekirken ‘00000100' şeklinde bir bit sola kaymış şekilde alıyorum. Programdaki hatayı bir türlü bulamadım.
Yardım ederseniz sevinirim…
YENİ KOD:
;______________________VERICI______________________
	LIST	P=16f84
	INCLUDE	"P16F84.INC"
	__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC
ADATA	EQU	h'0C'
MASK	EQU	h'0D'
SAYAC	EQU	h'0E'
SAYAC1	EQU	h'0F'
SAYAC2	EQU	h'10'
	BSF	STATUS,5
	CLRF	TRISA
	MOVLW	h'FF'
	MOVWF	TRISB
	BCF	STATUS,5
	CLRF	PORTB
	CLRF	PORTA
BASLA
	MOVF	PORTB,0
	MOVWF	ADATA
GONDER
	MOVLW	B'00000001'
	MOVWF	MASK
	MOVLW	H'8'
	MOVWF	SAYAC
DONGU
	BCF	PORTA,0	;start biti
	CALL	BEKLE
	MOVF	ADATA,0
	ANDWF	MASK,0
	MOVWF	PORTA
	CALL	BEKLE
	DECFSZ	SAYAC,F
	GOTO	KAYDIR
	BSF	PORTA,0	;stop biti
	CALL	BEKLE
	GOTO	BASLA
BEKLE
	MOVLW	h'C'
	MOVWF	SAYAC1
DONGU1
	MOVLW	h'C'
	MOVWF	SAYAC2
DONGU2
	DECFSZ	SAYAC2,F
	GOTO	DONGU2
	DECFSZ	SAYAC1
	GOTO	DONGU1
	RETURN
KAYDIR
	RRF	ADATA,F
	GOTO	DONGU
	END

;______________________________ALICI___________________
	LIST	P=16F84
	INCLUDE	"P16F84.INC"
	__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_XT_OSC
ADATA	EQU	h'0C'
SAYAC	EQU	h'0D'
SAYAC1	EQU	h'0E'
SAYAC2	EQU	h'0F'
	BSF	STATUS,5
	CLRF	TRISB
	MOVLW	H'FF'
	MOVWF	TRISA
	BCF	STATUS,5
	CLRF	PORTA
	CLRF	PORTB
BASLA
	MOVLW	h'00'
	MOVWF	ADATA
	MOVLW	h'8'
	MOVWF	SAYAC
DONGU
	BTFSC	PORTA,0	;start bitini kontrol et
	GOTO	BASLA
	CALL	BEKLE
	MOVF	PORTA,0
	IORWF	ADATA,F
	CALL	BEKLE
	DECFSZ	SAYAC,F
	GOTO	KAYDIR
	MOVF	ADATA,0
	MOVWF	PORTB
	CLRF	PORTA	;Stop biti alımı için hazırlan
STOP			
	BTFSS	PORTA,0 ; stop	bitini kontrol et
	GOTO	HATA
	GOTO	BASLA
BEKLE
	MOVLW	h'C'
	MOVWF	SAYAC1
DONGU1
	MOVLW	h'C'
	MOVWF	SAYAC2
DONGU2
	DECFSZ	SAYAC2,F
	GOTO	DONGU2
	DECFSZ	SAYAC1
	GOTO	DONGU1
	RETURN
HATA
	BSF	PORTB,4
	GOTO	STOP
KAYDIR
	RLF	ADATA,F
	GOTO	DONGU
	RETURN
	END
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

MICROCEBEL

Kardeş programını incelemedim ama.Şöyle bir öneride bulunabilirim sana.Senkron haberleşme yapman gerekir.Eğer asenkron yapıyorsan haberleşmeyi her iki taraftaki alım ve gönderim zamanı eşit olmalıdır yani baud rate denilen olay.Kolay gelsin...

omenek

BASLA            ;programın baslangıcı
  MOVLW   h'08'      ;W'ye 0x08 sayısını yuke
  MOVWF   SAYAC                 ;SAYAC degıskenine W'yı yukle
  MOVLW   h'00'      ;W'ye 0x00 sayısını yukle
  MOVWF   ADATA                 ;W'yi ADATA degiskenine yukle
DONGU
  MOVF   PORTA,0                   ;PORTA'yı W'ye yukle
  IORWF   ADATA,F            ;W ile ADATA'ya OR uygula sonucu ADATA'ya yaz
  CALL   BEKLE                    ;200ms bekle
  DECFSZ   SAYAC,F                    ;
  GOTO   KAYDIR             ;donguyu kalan 7 bit icin tekrarla
  MOVF   ADATA,0                    ;ADATA'yı W'ye yukle
  MOVWF   PORTB                    ;W'yi PORTB'ye yukle
  GOTO   BASLA                    ;yeni bayt icin basa don
KAYDIR
  RLF   ADATA,F                   ;ADATA'yı bir bit sola kaydır
  GOTO   DONGU

ilk okumayı yapmadan kaydırma yaptığın için yanlış okuyor sanırım
bu şekilde bir dene istersen.

kaplan_65

Sayın omenek; ilk okumayı yapmadan kaydırma yapmanın bir zararı yok. Çünkü ilk başta geçici değişken sıfır olduğu için ilk kaydırma problem olmaz.Sizin dediğiniz gibi yaptım.Ama sonuç aynı oldu.
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

alabora

Programında bence de bir zamanlama hatası var gibi görünüyor. Yani göndericide okuma yapıp göndermeyi beklemeden alıcıda okuma yapıp portb'ye gönderiyosun. Öncebiraz bekleme yap alıcıda.

XX_CİHAN_XX

Hani start biti?
Alıcı datanın nezaman geldıgının nerden bılecek.
Sisteme enerji veridiğinde aralarında hicbir el sıkışma olmadan ıkısıde calısmaya başlarsa datayı tabııkı aynlıs alır.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

alabora

Bence en kısa yol olarak alıcıyı bir kere daha kaydırman gerekir. Çünkü alıcı olması gereken data daha RA0'a gelmeden okuma yapıp 8 sayımlık döngüyü erken bitiriyor. Yani eğer sen b'00000001" bilgisini göndermek istesen eminimki onu hiç göstermeyecek. Bence sen alıcıdaki registere 8 değil 9 atayıp bi dene istersen. Ama tabiki işin en doğrusu arkadaşın da dediği gibi start stop bitleri. bunu alışkanlık edinmelisin şimdiden. kolay gelsin bakalım.

kaplan_65

Arkadaşlar ben bilgiyi start ve stop ile değil de, 5 byte 0xFF ve 0x00 ön bilgileri ile şifrelemiştim. Fakat bilginin okunmadığını görünce bunları kaldırdım. Ve bu şekilde proteusta simüle ettiğimde gönderdiğim byte ların bir bit kaydığını gördüm. Eğer bu bit kaymasını önlersem o zaman hem start hem de stop biti, hem de ön bilgilerle şifreleyeceğim.Bu şekilde de programlar çalışıyor. Sizlerin programı daha rahat inceleyebilmeniz için programı kırptıktan sonra sadece bilginin okunup ve yazılan kısımlarını yazdım.
Sayı alabora alıcı registere 9 sayısını da atadım.Fakat bu sefer de bitlerin bir tanesi sıfırlanıyor.Çünkü bilgideki 9. bit sıfır olarak algılandığı için 9. kaydırmamda  bu  sıfır olan bit başa geçiyor ve birinci biti sıfırlıyor.
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

XX_CİHAN_XX

Alıntı yapılan: "kaplan_65"Arkadaşlar ben bilgiyi start ve stop ile değil de, 5 byte 0xFF ve 0x00 ön bilgileri ile şifrelemiştim. Fakat bilginin okunmadığını görünce bunları kaldırdım. Ve bu şekilde proteusta simüle ettiğimde gönderdiğim byte ların bir bit kaydığını gördüm. Eğer bu bit kaymasını önlersem o zaman hem start hem de stop biti, hem de ön bilgilerle şifreleyeceğim.Bu şekilde de programlar çalışıyor. Sizlerin programı daha rahat inceleyebilmeniz için programı kırptıktan sonra sadece bilginin okunup ve yazılan kısımlarını yazdım.
Sayı alabora alıcı registere 9 sayısını da atadım.Fakat bu sefer de bitlerin bir tanesi sıfırlanıyor.Çünkü bilgideki 9. bit sıfır olarak algılandığı için 9. kaydırmamda  bu  sıfır olan bit başa geçiyor ve birinci biti sıfırlıyor.
Sevgili kaplan_65,
start stop bitlerinin amacı şifreleme değil bu tür hataları ortadan kaldırmaktır.Burada kaba hesaplama ile birbirinden calısan ıkı pıcın hızları aynı(xt den dolayı) yaptıkları ıslem surelerı ve komut sayıları senkron olsa dahi pratikte hiçbir zaman oyle olmaz.Burada mikrosaniyelerden bahsediyoruz.Göndermeye başlarken karsılıklı el sıkısma(start biti) olmaz ise vericinin gondermeye baslama anı ile alıcının okumaya başlama anı hic bir zaman denk gelmez ve bu tarz kayık okumlar her zaman olur.
Asenkron veri iletimini biraz araştırmanızı ve orada kullanılan protokole aynen uymanızı tavsiye ederim....
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

kaplan_65

Çeşitli asenkron iletişim algoritmalarına baktım.Kodlara aynen uygulayıp üstte düzelttim.Bilgi alışverişi daha da düzgünleşti, fakat bit kaymasını bir türlü düzeltemedim. VERICI.ASM de sayacı 9 yaptığımda bit kayması biraz düzeldi. Ama ilk gönderdiğim bit kararsız çalışıyor.(Bazen start bitinden dolayı sıfırlanıyor.)
Programa bir de bu şekilde bir bakarsanız!!!
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

XX_CİHAN_XX

Senin için oturup haberleşme programı yazdım
Buyur kardeş...
Verici program
;TEK HATTAN VERI GONDERIR
;VERICI PROGRAMI
;*****************************************
		LIST		P=16F876A
		INCLUDE		"P16F876A.INC"
;*****************************************
		ERRORLEVEL	-302
		ERRORLEVEL	-306
		__CONFIG	_XT_OSC & _BODEN_OFF & _PWRTE_OFF & _LVP_OFF & _WDT_OFF	
		CBLOCK		0x20
TX_REG
SERI_REG
REG1
		ENDC
;*****************************************
#DEFINE	TX			PORTB,1
;*****************************************
		ORG			0x00
		GOTO		SETUP
		ORG			0x04
		RETFIE
;*****************************************
SETUP
		BSF			TX
		BSF			STATUS,5
		MOVLW		0x07
		MOVWF		ADCON1
		MOVLW		0x01
		MOVWF		TRISB
		BCF			STATUS,5
		CALL		DELAY_1
;*****************************************
MAIN

		MOVLW		0xAA		;GONDERILECEK VERI
		CALL		GONDER		;W DEKİ BİLGİYİ GONDER

		GOTO		MAIN
;*****************************************
GONDER
		MOVWF		SERI_REG
		BCF			TX			;START BITI GONDERILDI
		CALL		DELAY_1
		BSF			STATUS,C
;*****************************************
START
		RLF			SERI_REG,F
		MOVF		SERI_REG,W
		BTFSC		STATUS,Z
		GOTO		STOP			
		BCF			TX
		BTFSC		STATUS,C		
		BSF			TX
		CALL		DELAY_1
		BCF			STATUS,C
		GOTO		START	
;*****************************************
STOP
		BSF			TX
;*****************************************
DELAY_1
		MOVLW		.15
		MOVWF		REG1
		NOP
		NOP
		NOP
		DECFSZ		REG1,F
		GOTO		$-4
		RETURN
;*****************************************
		END

Alıcı Program,
;TEK HATTAN VERI ALIR(RB0 KESMESI ILE)
;ALICI PROGRAMI
;*****************************************
		LIST		P=16F876A
		INCLUDE		"P16F876A.INC"
;*****************************************
		ERRORLEVEL	-302
		ERRORLEVEL	-306
		__CONFIG	_XT_OSC & _BODEN_OFF & _PWRTE_OFF & _LVP_OFF & _WDT_OFF	
		CBLOCK		0x20
RX_REG
REG2
		ENDC
;*****************************************
#DEFINE	RX			PORTB,0
;*****************************************
		ORG			0x00
		GOTO		SETUP
		ORG			0x04
		CLRF		RX_REG
;*****************************************
		CALL		DELAY_2	;START BITINI GEC	
		CALL		VERI_AL		;7.BITI AL
		CALL		DELAY_2
		CALL		VERI_AL		;6.BITI AL
		CALL		DELAY_1
		CALL		VERI_AL		;5.BITI AL		
		CALL		DELAY_2
		CALL		VERI_AL		;4.BITI AL		
		CALL		DELAY_1
		CALL		VERI_AL		;3.BITI AL		
		CALL		DELAY_2
		CALL		VERI_AL		;2.BITI AL		
		CALL		DELAY_1
		CALL		VERI_AL		;1.BITI AL		
		CALL		DELAY_2
		CALL		VERI_AL		;0.BITI AL		
		CALL		DELAY_1	;STOP BITINI GEC	
		BCF			INTCON,INTF
		RETFIE
;*****************************************
VERI_AL
		BCF			STATUS,C
		BTFSC		RX
		BSF			STATUS,C
		RLF			RX_REG,F
		RETURN
;*****************************************
SETUP
		BSF			STATUS,5
		CLRF		OPTION_REG
		BSF			OPTION_REG,7
		MOVLW		0x07
		MOVWF		ADCON1
		MOVLW		0x01
		MOVWF		TRISB
		CLRF		TRISC
		BCF			STATUS,5
		CLRF		RX_REG
		MOVLW		0x90
		MOVWF		INTCON
		CALL		DELAY_1
;*****************************************
MAIN

		MOVF		RX_REG,W	;MANUEL USARTTAN OKUNAN VERIYI
		MOVWF		PORTC		;PORTC YE GONDER

		GOTO		MAIN
;*****************************************
DELAY_1
		MOVLW		.10
		MOVWF		REG2

		NOP
		NOP
		NOP
		DECFSZ		REG2,F
		GOTO		$-4
		RETURN
;*****************************************
DELAY_2
		MOVLW		.20
		MOVWF		REG2

		NOP
		NOP
		NOP
		DECFSZ		REG2,F
		GOTO		$-4
		RETURN
;*****************************************
		END

Alıcı Rb0 kesmesi ile çalışıyor.Yani bit kaçırma diye birşey söz konusu değil ;)
Ayrıca bu sayede sürekli girişi sormak yerine başka işlede meşgul olabilirsin ;)

Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

kaplan_65

Sayın XX_CİHAN_XX;
İlginiz ve yardımlarınız için çok teşekkürler.Ben kendi programımdaki hatayı düzelttim, ama hiç verimli olmadı.Çünkü her bit için start biti gönderiyorum.Ancak kaymaları böyle önleyebildim.Sizin yazdığınız programı inceleyip 16f84 için biraz değiştireceğim.Tekrar sağolun...
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

Dagci-85

XX_CİHAN_XX hocam konuyla alakalı değil ama bişey sorucam. Yazdığınız programda

ERRORLEVEL -302
ERRORLEVEL -306

diye iki satır var bu ne demek, ne işe yarıyor acaba?

kaplan_65

Zannedersem bank uyarılarının .ERR dosyasında gözükmemesini sağlıyor.
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

XX_CİHAN_XX

Evet bank degısımlerı ve regısterlerden dolayı sıkca cıkan message 302 ve306 ların derlendıkten sonra göz zevkimi bozmasını önlüyor :D
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.