Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: Extreme - 19 Ekim 2014, 12:39:14

Başlık: 2pici usart ile asenkron seri haberleştirme
Gönderen: Extreme - 19 Ekim 2014, 12:39:14
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 ?
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Kabil ATICI - 19 Ekim 2014, 13:08:41
https://320volt.com/aciklamali-pic16f877-uygulama-kodlari-cod-asm-c/ (https://320volt.com/aciklamali-pic16f877-uygulama-kodlari-cod-asm-c/)

Ha bilgisayarla haberleşme sağlamışın ha iki işlemci arasında ne fark eder?
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Extreme - 01 Kasım 2014, 00:51:47
;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.
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Kabil ATICI - 01 Kasım 2014, 01:00:48
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.
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Extreme - 01 Kasım 2014, 10:04:27
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.
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: otomasyon - 01 Kasım 2014, 11:19:50
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.
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Extreme - 01 Kasım 2014, 23:07:08
(http://s15.postimg.cc/6tk4v9kzr/PIC16_F877_A_USART.jpg) (http://postimg.cc/image/6tk4v9kzr/)

max232 gereklimidir ?

Benim kullanacağım pic 16f887

biraz araştırma yapayım sonuçlarını yazarım.
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Kabil ATICI - 01 Kasım 2014, 23:09:15
İki işlemci arasında bağlantı kullanacaksan gerek yok.
Sadece bilgisayar ile işlemci arasında bağlantı kuracaksan RS232 seviye çevirici gerekir.
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: F493 - 02 Kasım 2014, 10:42:16
Mesafe uzunsa max232 kullanmak faydalı olabilir.
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Kabil ATICI - 02 Kasım 2014, 11:41:02
Mesafe uzunsa doğrudan RS485 olur.

İki işlemci arasında yarım metreye kadar 9600baud'da haberleşebiliyor.
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Extreme - 02 Kasım 2014, 12:24:03
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 ?

(http://s28.postimg.cc/qatscwcnt/ayg_ty_neticisi.jpg) (http://postimg.cc/image/qatscwcnt/)

(http://s28.postimg.cc/53q1ow00p/proteus.jpg) (http://postimg.cc/image/53q1ow00p/)

;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 (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...
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Kabil ATICI - 02 Kasım 2014, 13:19:34
Virtual Instrument içindeki
virtual teminal 'i kullan.
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Extreme - 14 Kasım 2014, 21:15:57
Merhaba,

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


(http://s22.postimg.cc/wmy6groa5/image.jpg) (http://postimg.cc/image/wmy6groa5/)


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 (http://www.youtube.com/watch?v=4pP_yol8T0Y#ws)

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 )
Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Extreme - 16 Kasım 2014, 03:01:10
;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 ?

Başlık: Ynt: 2pici usart ile asenkron seri haberleştirme
Gönderen: Extreme - 24 Kasım 2014, 12:21:48
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.