2pici usart ile asenkron seri haberleştirme

Başlatan Extreme, 19 Ekim 2014, 12:39:14

Extreme

Merhaba forum üyeleri,

2pici (16f877 gibi) tx ve rx pinleriyle haberleştirmeye çalışıyorum.

3-4 gündür arıyorum sağlam bir örnek bulamadım .

Elinde olan varsa yardımcı olabilir mi ?

Kabil ATICI

ambar7

Extreme

;Dosya Adı		: 6_7.asm

;	Programın Amacı		: USART Modülü İle Asenkron Seri Veri

;				  İletişimi.

;	PIC DK 2.1 		: PORTC<6:7> RS232 kablosuyla PC'ye

;				: XT ==> 20 Mhz

 

	list p=16F877A	 

	include "p16F877A.inc"	

	__config H'3F3A' 		;Tüm program sigortaları kapalı, 

					;Osilatör HS ve 20 Mhz.



; Değişken tanımları



RS232_Data	equ	0x20

	org	0

	clrf	PCLATH

	goto	Ana_program

	org	4



; Kesme alt programı: Varsa istenen kesmelerin işlenmesinde 

; kullanılabilir.



interrupt

	;Bu kısımda gerekirse usart modülünden veri alma ya da 

	;gönderme kesmeleri, A/D kesmesi, TRM0, TMR1, TMR2, CCP1IF, 

	;CCP2IF kesmeleri işlenebilir. Kesmelerin işlenmesindeki 

	;öncelik sıraları belirlenebilir. Örneğimizde veri gönderme 

	;ve almada kesme alt programına girmeden yalnızca kesme 

	;bayrakları kontrol edilerek usart birimine ait asenkron veri 

	;iletişimi gerçekleştirilmiştir.

	retfie				;Kesmeden çıkış



; RS232 portunda 1 byte veri yazar. Yazılacak veri RS232_Data 

; değişkenine yüklenmelidir.



RS232_Karakter_Gonder

	banksel PIR1

	btfss	PIR1, TXIF

	goto	$ - 1			;Daha önceden bir veri gönderilmiş 

					;ise aktarılana kadar bekle.

	bcf	PIR1, TXIF		;Veri gönderme kesme bayrağını sil.

	movf	RS232_Data, W	

	banksel TXREG

	movwf	TXREG			;RS232_Data değişkenindeki veriyi 

					;TXREG kaydedicisine yükle. Böylece 

					;veri çıkış buffer'ına yazılmış olur.	

	return				;Alt programdan çıkış.



; RS232 portundan 1 byte veri alır.



RS232_Karakter_Al

	banksel PIR1

	btfss	PIR1, RCIF	;Bilgi alındı ise bir komut atla.

	goto	$ - 1		;Bir komut geriye gel.

	bcf	PIR1, RCIF	;Alma gerçekleşti kesme bayrağını sil.

	movf	RCREG, W	;RCREG seri bilgi alış buffer'ındaki 

				;veriyi W'ye yükle.

	return			;RS232_Karakter_Al alt programından çıkış.



; Usart modülünün asenkron iletişimi için ilk ayarları 

; gerçekleştirir.



RS232_ilk_islemler

	banksel TRISC		;BANK1 seçildi. TRISC bu bankta

	bcf	TRISC, 6	;TX çıkışa

	bsf	TRISC, 7	;RX girişe yönlendirildi

	movlw	0x81		;SPBRG = 129 Fosc = 20 MHz'de 9600 baud 

				;hız için.

	movwf	SPBRG

	movlw	0x26

	movwf	TXSTA		;USART mod: asenkron, high speed, 8 bit 

				;iletişim, TXEN set edildi.

	movlw	0x90

	bcf	STATUS, RP0	;BANK0 seçildi RCSTA için.

	movwf	RCSTA		;Seri port etkin, 8 bit veri alış, CREN 

				;set : sürekli alış. 

	bsf	STATUS, RP0

	bsf	PIE1, TXIE	;TXIE set edildi.

	bsf	PIE1, RCIE	;RCIE set edildi.

	bsf	INTCON, PEIE	;Çevresel kesmelere izin verildi.

	return			;RS232_ilk_islemler alt programından çıkış



; Ana program: RS232 seri portttan aldığı verileri tekrar seri porta

; gönderir.



Ana_program

	call	RS232_ilk_islemler	;RS232 iletişimi için ilk işlemler.

	bcf	INTCON, GIE		;Kesme alt programı kullanılmadığı 

					;için GIE = 0 yap.

Ana_j1

	call	RS232_Karakter_Al	;RS232 portundan 1 byte veri al.

	movwf	RS232_Data		;Alınan veriyi RS232_Data 

					;değişkenine aktar.

	call	RS232_Karakter_Gonder	;RS232'deki veriyi RS232 

					;portuna gönder.

	goto	Ana_j1			;Aynı işlemleri tekrarla.

	END


Hocam oradaki kod sadece bunu vermiş.
Yani asenkron bağlantının pc ile nasıl olcağını anlatmış.
ben bu yazılıma lcd eklemeyi başarsam bile çalışma ihtimali az.

Kabil ATICI

burada senin ihtiyacın olan her şey anlatılmış.
1-uart başlangıç ayarı,  "call   RS232_ilk_islemler"
2- Verini alınması "call   RS232_Karakter_Al"
3- verinin gönderilmesi "call   RS232_Karakter_Gonder"
-veri alma ve göndermede kullanılan veri alanı "RS232_Data"
-baud 9600 olarak ayarlanmış.

programında sadece buradaki gibi gelen veriyi geri göndermeyeceksin. Gelen veriyi alıp değerlendireceksin.
ambar7

Extreme

#4
hocam benim yapmak istediğim proje çift taraflı pic to pic asenkron seri haberleşme

yani iki picdede input ve output işlemleri olacak.

Buradaki bilgilerle haftasonumu bu projeye ayırıcam.

otomasyon

Selam,

    16F877A  ile PC arasında iletişim kurabiliyormusunuz?. Once bu sorunun cevabı önemli. Eger bu işlemi yapabiliyorsanız şu şekilde yapın, PIC ile RS232(PC) arasında gonderme alma yapin, daha sonra az önce yaptıgınız işlemi ikinci pic devresi içinde yapın yani onuda pc ile haberleştirin.

Daha sonra 2 pic devresini birbirine bağlayın ve yazılımda hiçbir degişiklik yapmadan ikisini haberleştirin.
Boylece 2 adet pic'i kendi arasında haberleştireceksiniz. Aslında pic devresi karşıdakinin pc mi yoksa başka bir pic devresi mi oldugunu bilmiyor, sadece RS232 standart protokolünü kullanıyorlar.


PIC_1_DEVRESI->MAX232  -> PC
PIC_2_DEVRESI->MAX232  -> PC

PIC_1_DEVRESI->MAX232  --------   MAX232<-PIC_2_DEVRESI

Esen kalın.

Extreme

#6


max232 gereklimidir ?

Benim kullanacağım pic 16f887

biraz araştırma yapayım sonuçlarını yazarım.

Kabil ATICI

İki işlemci arasında bağlantı kullanacaksan gerek yok.
Sadece bilgisayar ile işlemci arasında bağlantı kuracaksan RS232 seviye çevirici gerekir.
ambar7

F493

#8
Mesafe uzunsa max232 kullanmak faydalı olabilir.

Kabil ATICI

Mesafe uzunsa doğrudan RS485 olur.

İki işlemci arasında yarım metreye kadar 9600baud'da haberleşebiliyor.
ambar7

Extreme

#10
Evet bir yerden başladım öncelikle
pic den pcye veri aktarmaya çalışıyorum.
Laptop üzerinden çalışıyorum . rs232 portu yok . rs232tousb kablo v.s. gerek yok . simülasyon üzerinde mantığını anlasam şimdilik yeter diye düşünüyorum.

Proteusda simülasyon aşamasında sorun yaşıyorum.
Kodu proteusa yükleyince aygıt yöneticisinde yeni cihaz gözükmüyor. Bunun için ne yapmam lazım ?





;Program-37) USART arabirimi ile PIC16F628A'dan bilgisayara veri gönderme 
;işlemine örnek program. Şekil 16-15'deki görülen devreye göre RA0 butonuna 
;her basıldığında önceden tanımlanan 8 bit'lik veri paketleri ardı ardına 
;gönderilerek bilgisayar ekranında "ALTAS" yazdırır.  

;===PROG37.ASM====12/09/2005================================
	errorlevel -302
	LIST	P=16F628A
	INCLUDE	"P16F628A.INC"     
	__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF
	 
;-----------------------------------------------------------


	ORG 		h'0000'

SAYAC		EQU	h'20'

SAYAC1		EQU	h'21'

SAYAC2		EQU	h'22'

	MOVLW		H'07'		;PortA'nın uçları sayısal I/O
	MOVWF		CMCON		;CMCON saklayıcısına yaz
	CLRF		PORTA		;PORTA uçlarını sıfırla
	CLRF		PORTB		;PORTB uçlarını sıfırla
	
	
	BANKSEL	TRISA		;BANK1'e geç
	MOVLW	h'FF'		;PORTA'nın tüm uçları giriş
	MOVWF	TRISA		
	MOVWF	b'11111011'	;RB1/RX=giriş, RB2/TX=çıkış
	MOVWF	TRISB
	MOVLW	d'25'		;9600 baud rate'lik hız için
	BANKSEL SPBRG
	MOVWF	SPBRG		;25 desimal sayısı yükle
	BANKSEL TXSTA
	MOVLW	b'00100100'	;BRGH=1, TXEN=1 (gönderme aktif)
	MOVWF	TXSTA
	BANKSEL	PORTB		;BANK0'e geç
	BSF		RCSTA,SPEN	;SPEN=1 (seri iletişim aktif)
	CLRF		SAYAC
	
	
DONGU		;--------Kısa bir süre bekletme döngüsü------
	DECFSZ	SAYAC,F
	GOTO		DONGU
TEST_RA0		;-------- RA0 ucuna basma kontrolü döngüsü----
	BTFSS	PORTA,0	;RA0 butonuna basıldı mı?
	CALL		MESAJ	;Evet, MESAJ alt programına git.
	CALL		GECIKME	;Buton arkının sönmesini bekle
	GOTO		TEST_RA0	;Hayır, RA0 butonunu tekrar test et.
MESAJ	;--------Mesaj gönderme alt programı--------------
	BSF		PORTB,2	;RB2/TX ucunu start "1" durumunda.
	MOVLW	'A'		;"A" harfinin ASCII karşılığı h'65'
	CALL 	GONDER   ;8 bit'lik b'01000001' sayısını gönder 
	MOVLW	'L'		; h'76' sayısını W'ye yükle.
	CALL 	GONDER   ;8 bit'lik b'01001100' sayısını gönder
	MOVLW	'T'		;h'84' sayısını W'ye yükle.
	CALL 	GONDER
	MOVLW	'A'		;h'65' sayısını W'ye yükle.
	CALL 	GONDER
	MOVLW	'S'		;h'83' sayısını W'ye yükle.
	CALL 	GONDER
	MOVLW	h'0D'	;Satır sonu işareti W'ye yükle.
	CALL 	GONDER
	MOVLW	h'0A'	;Satır başına geç işareti W'ye yükle.
	CALL		GONDER
	RETURN			;Alt programdan dön.
GONDER ;------TXREG'den STA'ya veri yükleme alt programı-----
	MOVWF	TXREG	; W'deki sayıyı TXREG'e yükle
	BANKSEL	TXSTA	; BANK1'e geç
VERI_SONU_TEST
	BTFSS	TXSTA,TRMT	;STA'ya veri gönderme bitti mi?
	GOTO		VERI_SONU_TEST		;Hayır, tekrar test et
	BANKSEL	PORTB			;Evet, BANK0'a geç ve 
	RETURN					;Alt programdan dön.
GECIKME	;Gecikme alt programı
	MOVLW	h'FF'
	MOVWF	SAYAC1
DONGU1
	MOVLW	h'FF'
	MOVWF	SAYAC2
DONGU2
	DECFSZ	SAYAC2, F
	GOTO	DONGU2
	DECFSZ	SAYAC1, F
	GOTO	DONGU1
	RETURN
	END
;-----------------------------------------------------------


sanırım benim bilgisayarım seri portları algılamıyor

http://pinouts.ru/Converters/usb_serial_adapter_pinout.shtml

eğer buna benzer bir devreyi proteusda ek olarak yapmam gerekiyorsa

simülasyon kısmını atlamam gerekiyor diye düşünüyorum...

Kabil ATICI

Virtual Instrument içindeki
virtual teminal 'i kullan.
ambar7

Extreme

#12
Merhaba,

Direkt olarak pic to pic uygulaması yapmaya karar verdim.
Picleri master ve slave olarak isimlendirdim.





Buton master picine bağlı
buton basılı olmadığı durumlarda kendi içinde bulunan led ve slave picin ledi yanıyor.
buton basılı olduğu durumlarda butona bağlı bit 0 oluyor. kendi ledi ve slave ledi sönüyor

debug moddada çalıştırdım fakat sorunu bir türlü bulamadım.

İstediğim durum breadboard üzerinde gerçekleşti fakat istediğim kod olmadı ayrıca proteusda çalışmadı.

2014 11 14 20 51 52

master kod (burda bir sorun yok )
;---------------------------configuration
ERRORLEVEL	-203,-205,-302
INCLUDE "P16F887.INC"
LIST P=16F887

	__CONFIG	_CONFIG1,	_XT_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_ON & _FCMEN_ON & _LVP_OFF 
 	
 	__CONFIG	_CONFIG2,	_BOR40V & _WRT_OFF

;================================================================================
;=====================Variables==================================================
DelayCounter1	EQU 20H
DelayCounter2	EQU 21H
DelayCounter3	EQU	22H

status_temp		EQU 23H
w_temp			EQU 24H
pclath_temp		EQU	25H

CLedCounter1	EQU	26H
CLedCounter2	EQU	27H

;portd
Button0 		EQU 2
;Button1 		EQU 2 
CheckLed 		EQU 1
;Led0  			EQU 2
;Led1  			EQU 3
;**********************************************************************
;*****					     Program Baslangici 			  	 ****
;**********************************************************************
		   ORG     0x0000       		; processor reset vector
		  GOTO    baslangic         	; go to beginning of program
;**********************************************************************
;*****						  Interrupt bölümü 					*****
;**********************************************************************
			ORG     	0x0004             ; interrupt vector location
			MOVWF   	w_temp             ; copy w to temp register
			MOVF	  	STATUS,w           ; move status to be saved into W
		   	CLRF    	STATUS          	 ; Bank0, reagardless of current bank, Clears IRP,RP0,RP1
			MOVWF	  	status_temp        ; save status to bank 0 register
			MOVF    	PCLATH,w           ; only required if using pages 1, 2 or 3
			MOVWF   	pclath_temp        ; save pclath
			CLRF    	PCLATH          	 ; page 0
;***** 	Interrupt rutini baslangici  	*****
			BANKSEL 	PIR1
			BTFSS   	PIR1,TMR1IF       ; timer 1 interrupt geldi kontrolü
			GOTO	  	interrupt_sonu
			BCF     	PIR1,TMR1IF       ; interrupt flagını temizle
			MOVLW   	0xFC 
			MOVWF   	TMR1H             ;Set timer 1 to 312,5us timeout period (315,6)
			MOVLW   	0xFD
			MOVWF   	TMR1L

;-------------------------------ANA PROGRAM
DECFSZ 		CLedCounter1
GOTO	 	test_1
DECFSZ 		CLedCounter2
GOTO	 	test_1
	
MOVLW		D'1'
MOVWF		CLedCounter2
BTFSS PORTD,CheckLed
goto check_hayir
goto check_evet

check_evet
BCF PORTD,CheckLed
GOTO test_1

check_hayir
BSF PORTD,CheckLed
GOTO test_1 

;======================================
test_1
call 	Delay1
BTFSS 	PORTD,Button0  ; doğru şekilde giriyor.
goto 	NO_1
GOTO	NO_2
BSF		PORTD,3
goto 	interrupt_sonu

NO_1
	BTFSS	PIR1,TXIF
	GOTO	interrupt_sonu
	BCF		PORTD,3
	MOVLW	'A'	
	MOVWF	TXREG	; W'deki sayıyı TXREG'e yükle
	goto interrupt_sonu

NO_2	
	BTFSS	PIR1,TXIF
	GOTO	interrupt_sonu
	BSF		PORTD,3
	MOVLW	D'00'	
	MOVWF	TXREG	; W'deki sayıyı TXREG'e yükle
	goto interrupt_sonu

interrupt_sonu
;======================================================================
;=====================  Interrupt rutini sonu =========================
;======================================================================
		   	BANKSEL 	pclath_temp			;1,8us
			MOVF    	pclath_temp,w      ; restore pclath
			MOVWF	  	PCLATH             ;
		   	MOVF    	status_temp,w   	; to set to original bank state
			MOVWF	  	STATUS             ; restore STATUS
			MOVF    	w_temp,w           ; restore pre-isr W register contents
			RETFIE    

;======================================================================

baslangic
;PORT SETUP ===========================================================
			BANKSEL 	ANSEL
			MOVLW	  	B'00000000'	     ;All digital IO
			MOVWF	  	ANSEL  

			BANKSEL 	ANSELH
			MOVLW	  	B'00000000'	     ;All digital IO
			MOVWF	  	ANSELH  

			BANKSEL 	TRISA
			MOVLW	 	B'11111111'
			MOVWF	  	TRISA             ;port A all input
		   	MOVLW   	B'11111111'       ;
		   	MOVWF	  	TRISB			  ;port b all input
			MOVLW	  	B'00000000'	      ;
			MOVWF	  	TRISC			  ;port c all output
			MOVLW	  	B'00000100'       ;
			MOVWF	  	TRISD	
			MOVLW	  	B'00000000'       ;
			MOVWF	  	TRISE			  ;port d all output

			BANKSEL	PORTA
			BSF		PORTD,Button0			;
		;	BSF		PORTD,Button1			;başlangıçta butonları 1 kabul et.
			
			BSF		PORTD,CheckLed			;checkled başlangıçta yansın

		;	BSF		PORTD,Led0				;led0 başlangıçta yansın	
		;	BCF		PORTD,Led1				;led1 başlangıçta sönsün

			CALL	Delay1
;REGISTER SETUP ===========================================================
			BANKSEL 	OPTION_REG
			MOVLW	  	B'11011111'  	  ;WDT ON timer0 off
			MOVWF	  	OPTION_REG		  ;prescaler assigned to WDT,rate 1:128 ;süresi yazılacak.

			BANKSEL 	WPUB
			MOVLW	  	B'00000000'	     ;weak pull-ups enabled.
			MOVWF	  	WPUB   

			BANKSEL 	IOCB
			MOVLW	  	B'00000000'	     ;No Any INTERRUPT-ON-CHANGE PORTB REGISTER
			MOVWF	  	IOCB      	  					

		;	BANKSEL 	ADCON1				;adc registerı kullanmadım.
		;	MOVLW	  	B'00000000'	     
		;	MOVWF	  	ADCON1        	  

			BANKSEL 	PIE1
		   	MOVLW   	B'00000001'       ;timer1 enabled
			MOVWF		PIE1

			BANKSEL 	PIR1
		   	BCF     	PIR1,TMR1IF       ;CLR timer1 interrupt flag

			BANKSEL 	INTCON
			MOVLW   	B'11000000'       ;General int enable and Peripheral int enable
		   	MOVWF   	INTCON			
			
			BANKSEL 	PCON
			MOVLW   	B'00000000'       ;Ultra Low-Power Wake-up,BOR,Power-on Reset,Brown-out Reset disabled
		   	MOVWF   	PCON			

			BANKSEL		T1CON
		   	MOVLW		B'00000000'			;1/1 prescaler value
		   	MOVWF		T1CON

			BANKSEL		SPBRG
			MOVLW		D'64'					;2400 baudrate
			MOVWF		SPBRG
		
			BANKSEL		SPBRGH
			MOVLW		D'0'					;2400 baudrate
			MOVWF		SPBRGH

			BANKSEL		TXSTA
			MOVLW   	B'10100010'       ;Asynchronous mode,Transmit enabled
		   	MOVWF   	TXSTA			  ;SREN/CREN overrides TXEN in Sync mode.

		   	BANKSEL 	RCSTA
		   	MOVLW   	B'10010000'       ;Enables receiver,NO FERR ERROR, NO OERR ERROR
		   	MOVWF   	RCSTA
;=====================================================================
			CALL		DEGISKEN_ILKLENDIR
;SETUP TIMER1 ========================================================
			MOVLW   	0xFC		
		   	MOVWF   	TMR1H            		;Set timer 1 to (315,6) timeout period
		  	MOVLW   	0xFD
			MOVWF   	TMR1L
			BSF     	T1CON,0          		;Timer1'i çalistir
;MAIN PROGRAM LOOP ===================================================
TIMER1_RB0_INT_BEKLE
			CLRWDT
			NOP
			NOP
			NOP
			GOTO		TIMER1_RB0_INT_BEKLE

;==============================================================
DEGISKEN_ILKLENDIR
CLRF		DelayCounter1	
CLRF		DelayCounter2	
CLRF		DelayCounter3

CLRF		CLedCounter1
MOVLW		D'1'
MOVWF		CLedCounter2	

return
;===================================200 MIKROSANIYE BEKLEME
Delay1	MOVLW 	D'150'		
			MOVWF 	DelayCounter3
	LOOP3	NOP
			DECFSZ	DelayCounter3,F
			GOTO 	LOOP3
		RETURN


;============================================
Delay2		
	movlw	0x08
	movwf	DelayCounter1
	movlw	0x2F
	movwf	DelayCounter2
	movlw	0x03
	movwf	DelayCounter3
Delay_0
	decfsz	DelayCounter1, f
	goto	$+2
	decfsz	DelayCounter2, f
	goto	$+2
	decfsz	DelayCounter3, f
	goto	Delay_0

			;3 cycles
	goto	$+1
	nop
		RETURN
;============================================================================		
END


slave kod( burda sorun var )

;---------------------------configuration
	ERRORLEVEL	-302,-203
	INCLUDE "P16F887.INC"
	LIST P=16F887

	__CONFIG	_CONFIG1,	_XT_OSC & _WDT_ON & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_ON & _FCMEN_ON & _LVP_OFF 
 	
 	__CONFIG	_CONFIG2,	_BOR40V & _WRT_OFF

;================================================================================
;=====================Variables==================================================
DelayCounter1	EQU 20H
DelayCounter2	EQU 21H
DelayCounter3	EQU	22H

status_temp		EQU 23H
w_temp			EQU 24H
pclath_temp		EQU	25H

CLedCounter1	EQU	26H
CLedCounter2	EQU	27H

;portd
;Button0 		EQU 2
;Button1 		EQU 2 
CheckLed 		EQU 1
Led0  			EQU 2
;Led1  			EQU 3
;**********************************************************************
;*****					     Program Baslangici 			  	 ****
;**********************************************************************
		   ORG     0x0000       		; processor reset vector
		  GOTO    baslangic         	; go to beginning of program
;**********************************************************************
;*****						  Interrupt bölümü 					*****
;**********************************************************************
			ORG     	0x0004             ; interrupt vector location
			MOVWF   	w_temp             ; copy w to temp register
			MOVF	  	STATUS,w           ; move status to be saved into W
		   	CLRF    	STATUS          	 ; Bank0, reagardless of current bank, Clears IRP,RP0,RP1
			MOVWF	  	status_temp        ; save status to bank 0 register
			MOVF    	PCLATH,w           ; only required if using pages 1, 2 or 3
			MOVWF   	pclath_temp        ; save pclath
			CLRF    	PCLATH          	 ; page 0
;***** 	Interrupt rutini baslangici  	*****
			BANKSEL 	PIR1
			BTFSS   	PIR1,TMR1IF       ; timer 1 interrupt geldi kontrolü
			GOTO	  	interrupt_sonu
			BCF     	PIR1,TMR1IF       ; interrupt flagını temizle
			MOVLW   	0xFC 
			MOVWF   	TMR1H             ;Set timer 1 to 312,5us timeout period (315,6)
			MOVLW   	0xFD
			MOVWF   	TMR1L

;-------------------------------ANA PROGRAM
	DECFSZ 		CLedCounter1
			GOTO	 	test_1
	DECFSZ 		CLedCounter2
			GOTO	 	test_1
	
MOVLW		D'1'
MOVWF		CLedCounter2
BTFSS PORTD,CheckLed
goto check_hayir
goto check_evet

check_evet
BCF PORTD,CheckLed
GOTO test_1

check_hayir
BSF PORTD,CheckLed
GOTO test_1 

;-------------------------------------------
test_1
BTFSC   	RCSTA,FERR   
GOTO		interrupt_sonu

;BTFSC 		RCSTA,OERR   ;Bu kodun olması lazım fakat  
;GOTO 		A1			 ;ekleyince bozuluyor 

;BTFSS  	PIR1,RCIF 	;Bu kodun olması lazım fakat 
;Goto 		hayır_0 	;ekleyince bozuluyor 

BCF			PIR1,RCIF
A2
MOVLW		'A'		;Evet, RCREG'i W'ye yükle
SUBWF		RCREG,w
BTFSS		STATUS,Z
Goto hayır_0
BCF PORTD,Led0
goto interrupt_sonu

hayır_0
BSF PORTD,Led0
goto interrupt_sonu

A1
bcf 		RCSTA,CREN
nop
nop
bsf 		RCSTA,CREN
goto interrupt_sonu


interrupt_sonu
;======================================================================
;=====================  Interrupt rutini sonu =========================
;======================================================================
		   	BANKSEL 	pclath_temp			;1,8us
			MOVF    	pclath_temp,w      ; restore pclath
			MOVWF	  	PCLATH             ;
		   	MOVF    	status_temp,w   	; to set to original bank state
			MOVWF	  	STATUS             ; restore STATUS
			MOVF    	w_temp,w           ; restore pre-isr W register contents
			RETFIE    



;======================================================================

baslangic
;PORT SETUP ===========================================================
			BANKSEL 	ANSEL
			MOVLW	  	B'00000000'	     ;All digital IO
			MOVWF	  	ANSEL  

			BANKSEL 	ANSELH
			MOVLW	  	B'00000000'	     ;All digital IO
			MOVWF	  	ANSELH  

			BANKSEL 	TRISA
			MOVLW	 	B'11111111'
			MOVWF	  	TRISA             ;port A all input
		   	MOVLW   	B'11111111'       ;
		   	MOVWF	  	TRISB			  ;port b all input
			MOVLW	  	B'00000000'	      ;
			MOVWF	  	TRISC			  ;port c all output
			MOVLW	  	B'00000000'       ;
			MOVWF	  	TRISD	
			MOVLW	  	B'00000000'       ;
			MOVWF	  	TRISE			  ;port d all output

			BANKSEL	PORTD
;			BSF		PORTD,Button0			;
		;	BSF		PORTD,Button1			;başlangıçta butonları 1 kabul et.
			
			BSF		PORTD,CheckLed			;checkled başlangıçta yansın

			BSF		PORTD,Led0				;led0 başlangıçta yansın	
		;	BCF		PORTD,Led1				;led1 başlangıçta sönsün

			CALL	Delay1
;REGISTER SETUP ===========================================================
			BANKSEL 	OPTION_REG
			MOVLW	  	B'11011111'  	  ;WDT ON timer0 off
			MOVWF	  	OPTION_REG		  ;prescaler assigned to WDT,rate 1:128 ;süresi yazılacak.

			BANKSEL 	WPUB
			MOVLW	  	B'00000000'	     ;weak pull-ups enabled.
			MOVWF	  	WPUB   

			BANKSEL 	IOCB
			MOVLW	  	B'00000000'	     ;No Any INTERRUPT-ON-CHANGE PORTB REGISTER
			MOVWF	  	IOCB      	  					

		;	BANKSEL 	ADCON1				;adc registerı kullanmadım.
		;	MOVLW	  	B'00000000'	     
		;	MOVWF	  	ADCON1        	  

			BANKSEL 	PIE1
		   	MOVLW   	B'00000001'       ;timer1 enabled
			MOVWF		PIE1

			BANKSEL 	PIR1
		   	BCF     	PIR1,TMR1IF       ;CLR timer1 interrupt flag

			BANKSEL 	INTCON
			MOVLW   	B'11000000'       ;General int enable and Peripheral int enable
		   	MOVWF   	INTCON			
			
			BANKSEL 	PCON
			MOVLW   	B'00000000'       ;Ultra Low-Power Wake-up,BOR,Power-on Reset,Brown-out Reset disabled
		   	MOVWF   	PCON			

			BANKSEL		T1CON
		   	MOVLW		B'00000000'			;1/1 prescaler value
		   	MOVWF		T1CON

			BANKSEL		SPBRG
			MOVLW		D'64'					;2400 baudrate
			MOVWF		SPBRG
		
			BANKSEL		SPBRGH
			MOVLW		D'0'					;2400 baudrate
			MOVWF		SPBRGH

			BANKSEL		TXSTA
			MOVLW   	B'10100010'       ;Asynchronous mode,Transmit enabled
		   	MOVWF   	TXSTA			  ;SREN/CREN overrides TXEN in Sync mode.

		   	BANKSEL 	RCSTA
		   	MOVLW   	B'10010000'       ;Enables receiver,NO FERR ERROR, NO OERR ERROR
		   	MOVWF   	RCSTA
;=====================================================================
			CALL		DEGISKEN_ILKLENDIR
;SETUP TIMER1 ========================================================
			MOVLW   	0xFC		
		   	MOVWF   	TMR1H            		;Set timer 1 to (315,6) timeout period
		  	MOVLW   	0xFD
			MOVWF   	TMR1L
			BSF     	T1CON,0          		;Timer1'i çalistir
;MAIN PROGRAM LOOP ===================================================
TIMER1_RB0_INT_BEKLE
			CLRWDT
			NOP
			NOP
			NOP
			GOTO		TIMER1_RB0_INT_BEKLE
;=================================================================
DEGISKEN_ILKLENDIR
CLRF		DelayCounter1	
CLRF		DelayCounter2	
CLRF		DelayCounter3

CLRF		CLedCounter1
MOVLW		D'1'
MOVWF		CLedCounter2	

return
;===================================200 MIKROSANIYE BEKLEME
Delay1	MOVLW 	D'150'		
			MOVWF 	DelayCounter3
			LOOP3	NOP
			DECFSZ	DelayCounter3,F
			GOTO 	LOOP3
		RETURN


;============================================
Delay2		
	movlw	0x08
	movwf	DelayCounter1
	movlw	0x2F
	movwf	DelayCounter2
	movlw	0x03
	movwf	DelayCounter3
Delay_0
	decfsz	DelayCounter1, f
	goto	$+2
	decfsz	DelayCounter2, f
	goto	$+2
	decfsz	DelayCounter3, f
	goto	Delay_0

			;3 cycles
	goto	$+1
	nop
		RETURN
;============================================================================		
	END



;BTFSC       RCSTA,OERR   ;Bu kodun olması lazım fakat 
;GOTO       A1          ;ekleyince bozuluyor

;BTFSS     PIR1,RCIF    ;Bu kodun olması lazım fakat
;Goto       hayır_0    ;ekleyince bozuluyor

ben ısrarla slave pic kodunda bunun olması gerektiğini düşünüyorum ( lütfen ilgili koda bakınız )

Extreme

;BTFSC       RCSTA,OERR   ;Bu kodun olması lazım fakat 

;BTFSS     PIR1,RCIF    ;Bu kodun olması lazım fakat

incelediğim profesyonel bir yazılımda bunlar var.

rcsta,oerr okuma hatası var mı sorusu bunun 0 olması lazım 1 se zaten döngüyü atlayacak

pır1,rcıf ise bilgi geldiğinde 1 oluyor. bununda 1 olarak incelenmesi lazım.

fakat ben bunları ekleyince bozuluyor.

usart haberleşmeden anlayanlar yardımcı olabilir mi ?


Extreme

Yardım eden herkese teşekkürler.

Yukarıdaki kod çalışıyor fakat istemediğim şekilde.

Bu şekilde çalıştırmaya devam edicem. sorunun çözümüne sonra bakarım.