18f25k22 İki Uart Portunu Kullanma

Başlatan Elektronikprojem, 18 Haziran 2018, 08:52:17

Elektronikprojem

Merhaba,
18f25k22 nin 2 uart portunu aynı anda kullanmak istiyorum. Datasheetten anladığım kadarıyla eusart2 portunu Pıe3 ve Pır3 registerlerinden ayarlıyoruz. Burdan sonrasında iki port için de haberleşmöe hızları ayrı ayrı ayarlanabiliyormu.
Birde gelen veri de ayrıştırmak için hserin komutu nasıl kullanılıyor. Bu konuda kısa bir örneği olan varsa paylaşabilirmi.


ASM
    __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H       
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L & _BORV_285_2L
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H                                                                                     
;    __CONFIG _CONFIG3H, _CCP2MX_PORTB3_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
     __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L   
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H 
    __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L
    __CONFIG _CONFIG7H, _EBTRB_ON_7H
endasm
DEFINE OSC 16
ANSELA=0
ANSELB=0
ANSELC=0
OSCCON =%01111000;DAHILI OSC 16 MHZ   
CCP1CON=0:CCP2CON=0:CCP3CON=0
;-------------------------------------------------------------------------------
TRISA=0         :PORTA=0
TRISB=%00000111 :PORTB=0
TRISC=%10000000 :PORTC=0       
;-------------------------------------------------------------------------------
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 160 ' 9600 Baud @ 16MHz, -0,08%
SPBRGH = 1
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator
BAUDCTL.3 = 1         ' Enable 16 bit baudrate generator
SYMBOL GIE =INTCON.7 'genel interruptları açıyor
SYMBOL PEIE =INTCON.6 'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bit
SYMBOL RC2IE =PIE3.5 'USART Recive interrupt enable bit
SYMBOL RC2IF =PIR3.5 'USART Receive interrupt flag bit
PIE1.5=1
PIE3.5=1
temp  var BYTe
TEMP2 VAR BYTE
ON INTERRUPT GOTO INT
;-------------------------------------------------------------------------------
GELEN VAR BYTE
;-------------------------------------------------------------------------------
INTCON=%11100000;GENEL,PRIPHERAL,TMR0 KESMELERI AKTIF
INTCON2.7=0
PIR1=%00010000
;-------------------------------------------------------------------------------
ACILIS:
HSEROUT ["SELAMSANAPORT1"]
HSEROUT2["SELAMSANAPORT2"]
GOTO ACILIS
;-------------------------------------------------------------------------------
DISABLE
INT:
HSERIN,10,ZIPLA,[WAIT("n"),dec GELEN]
ZIPLA:
TEMP=RCREG
RESUME
ENABLE
ATLA:
RESUME
ENABLE

Elektronikprojem

sorunu aşağıdaki kodlar ile çözdüm gerçekte denemedim ama sanal seri port oluşturup proteusta denedim şu an çalışmaktadır.

ASM
    __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H       
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L & _BORV_285_2L
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H                                                                                     
;    __CONFIG _CONFIG3H, _CCP2MX_PORTB3_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
     __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L   
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H 
    __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L
    __CONFIG _CONFIG7H, _EBTRB_ON_7H
endasm
DEFINE OSC 16
ANSELA=0
ANSELB=0
ANSELC=0
OSCCON =%01111000;DAHILI OSC 16 MHZ   
CCP1CON=0:CCP2CON=0:CCP3CON=0
;-------------------------------------------------------------------------------
TRISA=0         :PORTA=0
TRISB=%10000111 :PORTB=0
TRISC=%10000000 :PORTC=0     
;-------------------------------------------------------------------------------
INTCON=%11110110
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 160 ' 9600 Baud @ 16MHz, -0,08%
DEFINE HSER_RCSTA2 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA2 24h ' Enable transmit, BRGH = 1
DEFINE HSER_CLROERR2 1 ' Clear overflow automatically
DEFINE HSER_SPBRG2 160 ' 9600 Baud @ 16MHz, -0,08%
SPBRGH = 1
BAUDCON.3 = 1         ' Enable 16 bit baudrate generator
BAUDCON2.3 = 1         ' Enable 16 bit baudrate generator
SYMBOL GIE =INTCON.7 'genel interruptları açıyor
SYMBOL PEIE =INTCON.6 'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bit
PIE1.5=1
PIE3.5=1
temp var BYTe
temp2 var byte
ON INTERRUPT GOTO INT
;-------------------------------------------------------------------------------
GELEN VAR BYTE
GELEN2 VAR BYTE
GELEN=0
GELEN2=0
;-------------------------------------------------------------------------------
ACILIS:
IF GELEN!=0 THEN
HSEROUT ["1. PORTA VERI GELDI=",dec GELEN]
GELEN=0
ENDIF

IF GELEN2!=0 THEN
HSEROUT2 ["2. PORTA VERI GELDI=",dec GELEN2]
GELEN2=0
ENDIF

GOTO ACILIS
;-------------------------------------------------------------------------------
DISABLE
INT:
IF PIR1.5=1 THEN
HSERIN,10,ZIPLA,[WAIT("s"),dec GELEN]
ZIPLA:
PIR1.5=0
TEMP=RCREG
GOTO ATLA
ENDIF
IF PIR3.5=1 THEN
HSERIN2,10,HOPLA,[WAIT("n"),dec GELEN2]
HOPLA:
PIR3.5=0
TEMP2=RCREG2
GOTO ATLA
ENDIF
ATLA:
RESUME
ENABLE

Analog

İki sorum olacaktı
IF GELEN!=0 THEN ==> satırında ünlem işaretinin  "!"  fonksiyonu nedir.
HSEROUT ["1. PORTA VERI GELDI=",dec GELEN] ==> satırında neden dec GELEN fonksiyonunu kullandın.
GELEN=0
ENDIF

Elektronikprojem

IF GELEN!=0 THEN ==> demek gelen değişkeni 0 dan farklı ise demektir.

HSEROUT ["1. PORTA VERI GELDI=",dec GELEN] ==> burada dec gelen demek gelen veriyi decimal formatta görmek içindir

ete

#4
! işareti orada değilleme yapar. Yani Şayet GELEN=0 değil ise demektir.
Bu komut ile,
-  IF DEGIL <>0 THEN
- IF NOT DEGIL=0
- IF DEGIL!=0
komut satırları hepsi aynı işi görür.

DEC GELEN ile GELEN arasındaki fark veri almada şudur.
GELEN=45 olduğunu varsayalım.
GELEN kullanırsanız bu 2 byte halinde yollanır. İlk byte 52 dir (4 saysının ASCII karşılığıdır) , 2 ci byte ise 53 olup 5 sayısının ASCII karşılığıdır.
DEC GELEN kullanılır ise direk 45 yollanır ve bu rakamsal olarak 45 sayısının karşılığıdır.  Sorun değişken değerinin Byte yada word olma sorumluluğunun programcıya ait olmasıdır. Diğerinde sayı ne olursa olsun ASCII karşılıkları yollandığı için sorun çıkmaz. Ama DEC kullanılırsa mutlaka Byte sınırları içinde olmalıdır. Word için 2 byte kullanırmı sistem onu test etmedim doğrusu. Denemek lazım.

Ete

Analog

Sayın Ete hocam ve Updating kardeşim ayrıntılı bir şekilde bilgilendirdiğiniz için çok teşekkür ederim. Çok faydalı oldu. İşlerinizde başarılar dilerim.

Powered by EzPortal