asenkron seri iletişim problemi

Başlatan picman, 23 Ekim 2009, 13:37:31

picman

arkadaşlar hayırlı günler. bişey yapayım dedim ama beceremedim. asm ile pc nin rs232 portundan veri alıp göndermeye çalışıyorum veriyi gönderiyorum ama veri alma işini beceremedim bir türlü. veri laırken sürekli 255 değeri okunuyor. ne gönderirsem göndereyim pic 255 değeri okuyor. minik bir problem var ama bir türlü göremedim o sorunu.
aşağıda kodları verdim. vakti olan bir arkadaşımız ilgilenirse çok memnun olurum.
LIST P=16F877A
#INCLUDE <P16F877A.INC>

#DEFINE RX PORTB,1
#DEFINE TX PORTB,2

__CONFIG _HS_OSC &_WDT_OFF &_LVP_OFF

VERI EQU 0X20
SAYAC EQU 0X21
SAYAC2 EQU 0X22

ORG 0X00
GOTO BASLA 
ORG 0X04
	BCF INTCON,INTF
	CALL VERI_GONDER
RETFIE

BASLA 
	BSF STATUS,RP0
	MOVLW B'11111011'
	MOVWF TRISB
	MOVLW 0XFF
	MOVWF TRISA
	CLRF TRISC
	MOVLW 0X07
	MOVWF ADCON1
	BCF STATUS,RP0
	BSF INTCON,GIE
	BSF INTCON,INTE
	CLRF OPTION_REG
	BSF OPTION_REG,INTEDG
	
	CLRF PORTC
	BSF TX
	
DONGU
	BTFSC RX
	GOTO DONGU
	CALL VERI_AL
	GOTO DONGU

VERI_GONDER
	MOVLW 0X08
	MOVWF SAYAC
	MOVLW 'E'
	MOVWF VERI
	
	BCF TX ; START BİTİ
	CALL GECIKME1 

TEKRAR
	BTFSC VERI,0
	GOTO HIGH_GONDER
LOW_GONDER
	BCF TX
	CALL GECIKME1
	GOTO CIK
HIGH_GONDER
	BSF TX
	CALL GECIKME1
CIK
	RRF VERI,F
	DECFSZ SAYAC,F
	GOTO TEKRAR

	BSF TX
RETURN

;-----------------------------------------------------------------

VERI_AL
	CALL GECIKME2
	MOVLW 0X08
	MOVWF SAYAC
	CLRF VERI
	CLRF PORTC
TEKRAR2
	CALL GECIKME1
	BCF STATUS,C
	BTFSC PORTB,1
	BSF STATUS,C
	RRF VERI,F
	DECFSZ SAYAC,F
	GOTO TEKRAR2

	MOVF VERI,W
	MOVWF PORTC
	
RETURN


GECIKME1
	MOVLW .171
	MOVWF SAYAC2
DONGU2  
	DECFSZ SAYAC2,F
	GOTO DONGU2
	NOP
RETURN

GECIKME2
	MOVLW .81
	MOVWF SAYAC2
DONGU3
	DECFSZ SAYAC2,F
	GOTO DONGU3
	NOP
RETURN 

END


----iletişim kuralları-----
baut rate 9600
bit sayısı 8
parity yok
stop biti 1
kristal 20mhz

şimdiden teşekkürler.....
Bilgi paylaştıkça artar..

xenix

Hocam kodunu ayrıntılı incelemedim ama gözüme takılan büyük bir problem var. Kesmeye gittiğinde W, STATUS ve PCLATH registerlarını kaydetmen ve kesmeyi durdurman lazım, yoksa kesme dönüşü ana programındaki değişkenler bozulmuş olur. Kesmeye aşağıdakileri kodları eklemelisin.

Bir de yazılımsal seri portu yerine donanımsal olanı kullan.

WSAVE	EQU	0X20
	WSAVE1	EQU	0X80 ; diğer bankları da kullanıyorsan onların da ilk registerini WSAVE için ayır (WSAVE2 şeklinde devam et)
	SSAVE	EQU	0X21
	PSAVE	EQU	0X22

	ORG		004H 

ISR
	BCF     INTCON,7
	BTFSC   INTCON,7 ;kesme kapanmış mı?
	GOTO    ISR          ;kesme kapanana kadar uğraş

	MOVWF   WSAVE
	SWAPF   STATUS, W
	CLRF    STATUS
	MOVWF   SSAVE
	MOVF    PCLATH, W
	MOVWF   PSAVE
    
    ;KESME KODLARI
    ;KESME KODLARI
    ;KESME KODLARI

	MOVF    PSAVE, W
	MOVWF   PCLATH
	SWAPF   SSAVE, W
	MOVWF   STATUS
	SWAPF   WSAVE, F
	SWAPF   WSAVE, W
	RETFIE

picman

hocam ilgin için teşekkürler. ben dün akşam programı en baştan yeniden yazdım minik diğişiklikler yaptım şimdi sorunsuz çalıştı. yeni yaptığım program da yine önceki gibi kesme alt programında pclath status ve w nin yedeğini almadan yaptım sorunsuz çalıştı. ama senin de dediğin gibi yukarıdaki işlemleri programın sağlıklı çalışması açısından yapmak lazım.  arkadaşım ilgin için teşekkür ederim. hayırlı günler.
Bilgi paylaştıkça artar..

xenix

Sevindim çalıştığına, bu 3 değişkenin kaydedilmesi kesin gerekli. Kaydetmediğimiz durumu düşünelim, örneğin W ye 10 yükledik, ve bunu sayac1 içine atıcaz, ama atmadan önce kesme geldi, kesmeye gittik, kesme dönüşünde W içinde 10 değeri olmayacak, ve bu yanlış değeri sayac1 e atmış olucaz, herşey sapıtacak. O yüzden kaydetmeliyiz.

picman

ben aslında 16F877 nin donanımsal özelliklerini öğrenmeye çalışıyorum. elimde altaş yayınlarının 16f877 yi anlatan bir kitabı var orada sfr siz ve pic in kendi donanımını kullanarak seri iletişim konusu var. şimdilik oraya kadar geldim. yazılımsal olarak seri iletişim örneği yapmış olduk. mssp modulu ile spi modunda seri iletişimi denedim ama onu yapamadım. bu konu hakkında bilginiz var mı acaba. programda SSPSTAT ve SSPCON
kaydedicilerini ayarladıktan sonra (spi master modu) SSPBUF kaydedicisine bilgi yazıldıktan sonra bilgi gönderilmesine başlanması lazım değilmi . program içinde de SSPTAT kaydedicisinin BF bitini test ediyorum ama hiçbir zaman 1 olmuyor program orda takılı kalıyor. halbuki kitaptaki verilen programın aynısını yaptım. olmadı. bu konu hakkında bilginiz mı acaba. mssp modülü hakkında bilgi içeren bir döküman da olabilir. bu kitapta anlatılanlardan pek bişey anlamadım.
Bilgi paylaştıkça artar..

picman

arkadaşlar mssp modülünü spi modundsa nasıl kullanıldığını basitçe anlata bilirseniz sevinirim...
Bilgi paylaştıkça artar..