PIC16F877A a PIC16F627A zlobí UART
Moderátor: Moderátoři
A koukám, že jsem opět přehodil testování TXIF až za naloadování TXREG .. bože jak je člověk blbej když civí půl dne na tu samou věc ... S 627 si pohraji zítra, prozatím mnohokrát děkuji za pomoc, občasné nakopnutí a inspiraci. Zítra dám dohromady 627 snad to bude běhat ..
Kód: Vybrat vše
MOVLW konstanta
XORWF reg,w
BTFSC STATUS,z
GOTO Zhoda
funguje ....
niekedy je vhodnejší tento inokedy so SUBWF... podľa toho či je potrebné o výsledku vedieť viac ( nastavuje c,dc,z ), alebo stačí z a c,dc zostáva nezmenené.
- vyšleš 0X55
-naplň pocitadlá na hoci aj na 50ms
- kontrola prijímačaFERR,OERR
-test RCIF? ak je... príjem a kontrola na 0XAA ak OK skoncil synchro
---ak nie je dekrementuj pocitadlá o 1
-----vynulonané pocitadlá? Ak áno ides znova synchto
-----este nevynulované vrát sa na test testRCIF vyssie
skoncil synchro
tu sa ide klasicky pošleš kod
naplň pocitadlá na hoci aj na 50ms
kontrola prijímačaFERR,OERR pri chybe oprav a ide "Synchro"
čakáš príjem podobne ako pri synchro
v čakacej slučke je testRCIF?
ak neprídu data do uplynutia času ide "synchro"
prisli data ide sa ďalej na nové data
Kód: Vybrat vše
Synchro
MOVLW 0x55
BTFSS PIR1,TXIF ;
GOTO $-1 ;
MOVWF TXREG ;
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;
BTFSC RCSTA,FERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CykSynchro
BTFSC PIR1,RCIF
GOTO TestujNa0XAA
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO Synchro ; podol čas
GOTO CykSynchro ; ešte nepadol
TestujNa0XAA
movf RCREG,0
movwf DATA
movlw 0XAA
subwf DATA,0
btfss STATUS,Z
goto Synchro
SynchroSkoncilo
.
.
.
.
.
PocitadloMinusJedna
DECFSZ TMP0,F
RETLW 0XFF ;este nepadol cas
DECFSZ TMP1,F
RETLW 0XFF ; este nepadol
RETLW 0 ;je zle padol cas
Kód: Vybrat vše
LIST P=16F627
INCLUDE<P16F627.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _HS_OSC
TEMP EQU 23H
TEMP1 EQU 24H
K0L EQU 25H
K0H EQU 26H
K1L EQU 27H
K1H EQU 28H
TMP0 EQU 29H
TMP1 EQU 30H
ORG 00H
GOTO INIT
;----------------------------------------------------------------------------------------
DELAY1mS
MOVLW 0x07 ;7 DEC
MOVWF TMP1
MOVLW 0x7D ;125 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-3
RETURN
DELAY5mS
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-3
RETURN
PocitadloMinusJedna
DECFSZ TMP0,F
RETLW 0XFF ;este nepadol cas
DECFSZ TMP1,F
RETLW 0XFF ; este nepadol
RETLW 0 ;je zle padol cas
;------------------------------------------------------------------------------------------
INIT
MOVLW B'00000111'
MOVWF CMCON
BSF STATUS,RP0 ;BANKA1
MOVLW B'00000000' ;VYSTUPNI PORT A
MOVWF TRISA
MOVLW B'00000000' ;REZERVACE PORTU B,1,2 PRO SERIOVY PRENOS
MOVWF TRISB
CLRF PORTB
MOVLW D'129' ;KONSTANTA PRO VYPOCET BAUD RATE
MOVWF SPBRG
MOVLW B'00100000' ;zapnuti TXEN
MOVWF TXSTA ;
CLRF PIE1 ;Vypnout preruseni na periferiich
BCF STATUS,RP0 ;BANKA0
BSF RCSTA,SPEN ;POVOLENI SERIOVEHO PORTU
BSF RCSTA,CREN ;POVOLENÍ PRIJMU
;--------------------------------------------------------------------------------------------
MOVF RCREG
MOVF RCREG
SYNCHRO
MOVLW 0x55
BTFSS PIR1,TXIF ;
GOTO $-1 ;
MOVWF TXREG ;
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CykSynchro
BTFSC PIR1,RCIF
GOTO TestujNa0XAA
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CykSynchro ; ešte nepadol
TestujNa0XAA
movf RCREG,0
movwf TEMP
movlw 0XAA
subwf TEMP,0
btfss STATUS,Z
goto SYNCHRO
goto PRENOSK0
RESTARTPRIJMU
BCF RCSTA,4
BSF RCSTA,4
GOTO SYNCHRO
CHYBASTOPBITU
MOVF RCREG
GOTO SYNCHRO
;-------------------------------------------------------------------------------------------------------------------------
PRENOSK0
MOVLW B'00000001' ;ve W je ulozena informace a MCU ji odesila pres UART ven (KANAL 0)
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CYKPRIJEM1
BTFSC PIR1,RCIF
GOTO PRIJEM1
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM1 ; ešte nepadol
PRIJEM1
MOVF RCREG,0
MOVWF K0L ;DAT A JEJICH ULOZENI
CYKPRIJEM2
BTFSC PIR1,RCIF
GOTO PRIJEM2
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM2 ; ešte nepadol
PRIJEM2
MOVF RCREG,0
MOVWF K0H ;DAT A JEJICH ULOZENI
;-------------------------------------------------------------------------------------------------------------------------
PRENOSK1
MOVLW B'00000010' ;ve W je ulozena informace a MCU ji odesila pres UART ven (KANAL 0)
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CYKPRIJEM3
BTFSC PIR1,RCIF
GOTO PRIJEM3
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM3 ; ešte nepadol
PRIJEM3
MOVF RCREG,0
MOVWF K1L ;DAT A JEJICH ULOZENI
CYKPRIJEM4
BTFSC PIR1,RCIF
GOTO PRIJEM4
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM4 ; ešte nepadol
PRIJEM4
MOVF RCREG,0
MOVWF K1H ;DAT A JEJICH ULOZENI
GOTO PRENOSK0
END
Kód: Vybrat vše
TestujNa0XAA aj do PRIJEM1 aj do PRIJEM2
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
pred inštruciu "prečítania" RCREG ... čo je samotné spracovanie prijatého znaku. Takto to bude "kóšer", tak sa to správne má urobiť.
Kód: Vybrat vše
MOVF RCREG,0
.
.
lebo RCIF sa vygeneruje aj pri obidvoch chybách prenosu
Kód: Vybrat vše
LIST P=16F627
INCLUDE<P16F627.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _HS_OSC
TEMP EQU 23H
TEMP1 EQU 24H
K0L EQU 25H
K0H EQU 26H
K1L EQU 27H
K1H EQU 28H
K2L EQU 29H
K2H EQU 30H
ZNAMENKO EQU 31H
TMP0 EQU 32H
TMP1 EQU 33H
#DEFINE RXTX PORTB,3
#DEFINE ENABLE PORTB,0
ORG 00H
GOTO INIT
;-------------------------------ZACATEK PODPROGRAMU---------------------------------------------------------
PocitadloMinusJedna
DECFSZ TMP0,F
RETLW 0XFF ;este nepadol cas
DECFSZ TMP1,F
RETLW 0XFF ; este nepadol
RETLW 0 ;je zle padol cas
;--------------------------------------------------------------------
RXTOTX
BSF RXTX
CALL WAIT400uS
RETURN
;---------------------------------------------------------------------
TXTORX
BSF STATUS,RP0 ;BANKA1 ;CEKA DOKUD TSR NENI PRAZDNY ABYCHOM SI NEUFIKLI ODCHOZI DATA
BTFSS TXSTA,TRMT ; -,,-
GOTO $-1 ; -,,-
BCF STATUS,RP0 ;BANKA0 ; -,,-
CALL WAIT400uS
BCF RXTX
CALL WAIT40uS
BCF ENABLE
CALL WAIT20uS
BSF ENABLE
CALL WAIT200uS
CALL WAIT200uS
RETURN
;----------------------------------------------------------------------
WAIT20uS
MOVLW 0x22 ;34 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
RETURN
;----------------------------------------------------------------------
WAIT40uS
MOVLW 0x43 ;67 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
RETURN
;------------------------------------------------------------------------
WAIT200uS
MOVLW 0x04 ;4 DEC
MOVWF TMP1
MOVLW 0x52 ;82 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
;----------------------------------------------------------------------
WAIT400uS
MOVLW 0x03 ;3 DEC
MOVWF TMP1
MOVLW 0x0DD ;221 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
;-------------------------------KONEC PODPROGRAMU-----------------------------------------------------------
INIT
MOVLW B'00000111'
MOVWF CMCON
BSF STATUS,RP0 ;BANKA1
MOVLW B'00000000' ;VYSTUPNI PORT A
MOVWF TRISA
MOVLW B'00000110' ;REZERVACE PORTU B,1,2 PRO SERIOVY PRENOS
MOVWF TRISB
MOVLW D'129' ;KONSTANTA PRO VYPOCET BAUD RATE
MOVWF SPBRG
MOVLW B'00100000' ;zapnuti TXEN
MOVWF TXSTA ;
CLRF PIE1 ;Vypnout preruseni na periferiich
BCF STATUS,RP0 ;BANKA0
BSF RCSTA,SPEN ;POVOLENI SERIOVEHO PORTU
BSF RCSTA,CREN ;POVOLENÍ PRIJMU
;INICIAKZACE BEZDRATOVEHO MODULU
BSF ENABLE
CALL WAIT20uS
BSF RXTX
CALL WAIT400uS
;--------------------------------------------------------------------------------------------
MOVF RCREG
MOVF RCREG
;---------------------------------SYNCHRONIZACE S DRUHYM PROCESOREM---------------------------
SYNCHRO
CALL RXTOTX
MOVLW 0x55 ;POSLI 55H, TESTUJ NECHTENE PREPSANI TXREG
BTFSS PIR1,TXIF ; -,,-
GOTO $-1 ; -,,-
MOVWF TXREG ; -,,-
CALL TXTORX
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC ;CEKEJ 50MS
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CykSynchro
BTFSC PIR1,RCIF ;
GOTO TestujNa0XAA ;PRISLO ZPET AAH ?
CALL PocitadloMinusJedna ;ODECTI 1 Z INTERVALU 50MS
ANDLW 0XFF ;test W, NA RETLW
BTFSC STATUS,Z
GOTO SYNCHRO ;ČAS UPLYNUL
GOTO CykSynchro ;ČAS NEUPLYNUL
TestujNa0XAA
movf RCREG,0
movwf TEMP
movlw 0XAA
subwf TEMP,0
btfss STATUS,Z
goto SYNCHRO
call RXTOTX
goto PRENOSK0
RESTARTPRIJMU
BCF RCSTA,4
BSF RCSTA,4
GOTO SYNCHRO
CHYBASTOPBITU
MOVF RCREG
GOTO SYNCHRO
;-------------------------------------------------------------------------------------------------------------------------
PRENOSK0
MOVLW B'00000001' ;ve W je ulozena informace a MCU ji odesila pres UART ven (KANAL 0)
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
CALL TXTORX
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CYKPRIJEM1
BTFSC PIR1,RCIF
GOTO PRIJEM1
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM1 ; ešte nepadol
PRIJEM1
MOVF RCREG,0
MOVWF K0L ;DAT A JEJICH ULOZENI
CYKPRIJEM2
BTFSC PIR1,RCIF
GOTO PRIJEM2
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM2 ; ešte nepadol
PRIJEM2
MOVF RCREG,0
MOVWF K0H ;DAT A JEJICH ULOZENI
CALL RXTOTX
;-------------------------------------------------------------------------------------------------------------------------
PRENOSK1
MOVLW B'00000010' ;ve W je ulozena informace a MCU ji odesila pres UART ven (KANAL 0)
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
CALL TXTORX
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CYKPRIJEM3
BTFSC PIR1,RCIF
GOTO PRIJEM3
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM3 ; ešte nepadol
PRIJEM3
MOVF RCREG,0
MOVWF K1L ;DAT A JEJICH ULOZENI
CYKPRIJEM4
BTFSC PIR1,RCIF
GOTO PRIJEM4
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM4 ; ešte nepadol
PRIJEM4
MOVF RCREG,0
MOVWF K1H ;DAT A JEJICH ULOZENI
CALL RXTOTX
;-------------------------------------------------------------------------------------------------------------------------------
PRENOSK2
MOVLW B'00000100' ;ve W je ulozena informace a MCU ji odesila pres UART ven (KANAL 0)
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
CALL TXTORX
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CYKPRIJEM5
BTFSC PIR1,RCIF
GOTO PRIJEM5
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM5 ; ešte nepadol
PRIJEM5
MOVF RCREG,0
MOVWF K2L ;DAT A JEJICH ULOZENI
CYKPRIJEM6
BTFSC PIR1,RCIF
GOTO PRIJEM6
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM6 ; ešte nepadol
PRIJEM6
MOVF RCREG,0
MOVWF K2H ;DAT A JEJICH ULOZENI
CYKPRIJEM7
BTFSC PIR1,RCIF
GOTO PRIJEM7
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM7 ; ešte nepadol
PRIJEM7
MOVF RCREG,0
MOVWF ZNAMENKO ;DAT A JEJICH ULOZENI
CALL RXTOTX
GOTO PRENOSK0
END
Kód: Vybrat vše
LIST P=16F877A
INCLUDE<P16F877A.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _BODEN_OFF & _LVP_OFF & _HS_OSC & _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF
TMP0 EQU 22H
TMP1 EQU 23H
VYBER EQU 24H
ZNAMENKO EQU 25H
#DEFINE ENABLE PORTC,1
#DEFINE RXTX PORTC,2
ORG 00H
GOTO INIT
;----------------------------ZACATEK PODPROGRAMU--------------------------------------------------
ADPREVOD
MOVLW 0x05 ;CEKANI 750uS PRED ZAHAJENIM PREVODU
MOVWF TMP1
MOVLW 0x0DD ;
MOVWF TMP0
DECFSZ TMP0,1 ;
GOTO $-1
DECFSZ TMP1,1 ;
GOTO $-3
BSF ADCON0,2 ;zahejni prevodu
BTFSC ADCON0,2 ;zjistovani dokonceni prevodu
GOTO $-1 ;...
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VYSILEJL
BSF STATUS,RP0 ;BANKA1 (ADRESL JE V BANCE 1 !!! )
MOVF ADRESL,W ;do W je ulozena informace a MCU ji nasledne odesila pres UART ven
BCF STATUS,RP0 ;BANKA0
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VYSILEJH
MOVF ADRESH,W ;do W je ulozena informace a MCU ji nasledne odesila pres UART ven
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
RETURN
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VYSILEJZNAMENKO
MOVF ZNAMENKO,W
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RXTOTX
BSF RXTX
CALL WAIT400uS
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TXTORX
BSF STATUS,RP0 ;BANKA1 ;CEKA DOKUD TSR NENI PRAZDNY ABYCHOM SI NEUFIKLI ODCHOZI DATA
BTFSS TXSTA,TRMT ; -,,-
GOTO $-1 ; -,,-
BCF STATUS,RP0 ;BANKA0 ; -,,-
CALL WAIT400uS
BCF RXTX
CALL WAIT40uS
BCF ENABLE
CALL WAIT20uS
BSF ENABLE
CALL WAIT200uS
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WAIT20uS
MOVLW 0x22 ;34 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WAIT40uS
MOVLW 0x43 ;67 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
RETURN
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WAIT200uS
MOVLW 0x04 ;4 DEC
MOVWF TMP1
MOVLW 0x52 ;82 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WAIT400uS
MOVLW 0x03 ;3 DEC
MOVWF TMP1
MOVLW 0x0DD ;221 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
;+++++++++++++++++++++++++++++++++++KONEC PODPROGRAMU++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------INICIALIZACE PERIFERII--------------------------------------------
INIT
BCF STATUS,RP0 ;BANKA0
BCF STATUS,RP1 ;BANKA0
CLRF PORTA
CLRF PORTE
CLRF PORTC
CLRF PORTB
BSF STATUS,RP0 ;BANKA 1
MOVLW B'00000111' ;INICIALZICAZE PORTU
MOVWF CMCON ;
MOVLW B'10000000' ;INICIALIZACE AD PREVODNIKU
MOVWF ADCON1 ;
MOVLW B'00111111' ;INICIALIZACE PORTUA RA0-RA5 AD VSTUPY
MOVWF TRISA ;
MOVLW B'00000111' ;INICIALIZACE PORTUE RE0-RE2 AD VSTUPY
MOVWF TRISE ;
MOVLW B'00000000' ;INICIALIZACE PORTUB VSE VYSTUP
MOVWF TRISB ;
CLRF TRISC ;PortC 7,6 pro USART, 0 pro detekci zaporneho napeti cidla teploty
MOVLW B'11000001' ;
MOVWF TRISC ;
MOVLW D'129' ;konstanta pro vypocet BAUD RATE
MOVWF SPBRG ;
;
MOVLW B'00100000' ;zapnuti TXEN
MOVWF TXSTA ;
CLRF PIE1 ;Vypnout preruseni na periferiich
BCF STATUS,RP0 ;BANKA0
MOVLW B'10010000' ;zapnuti UART portu a prijmu
MOVWF RCSTA
;INICIALIZACE BEZDRATOVEHO MODULU
BSF ENABLE
CALL WAIT20uS
BSF RXTX
CALL WAIT200uS
BCF RXTX
CALL WAIT40uS
BCF ENABLE
CALL WAIT20uS
BSF ENABLE
CALL WAIT200uS
;------------------------------------------------KONEC INICIALIZACE-------------------------------------------------------------------------
START BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;
BTFSC RCSTA,FERR ;TEST CHYBY PRIJMU
GOTO CHYBARAMEC ;
BTFSS PIR1,RCIF ;ceka na prichozi data (dokud neni naplnen RCREG)
GOTO START ;
MOVF RCREG,0
MOVWF VYBER
MOVWF PORTB ;zobrazeni prichozich dat na LED
GOTO MENU
RESTARTPRIJMU
BCF RCSTA,4
BSF RCSTA,4
GOTO START
CHYBARAMEC
MOVF RCREG,0
GOTO START
MENU
MOVLW 0X55
SUBWF VYBER,0 ;porovnaj ak W==VYBER>je zero v STATUS
BTFSC STATUS,Z ; Zero indikator
GOTO SYNCHRO ; nie call treba odpovedat 0xAA a ide START
MOVLW B'00000001'
SUBWF VYBER,0
BTFSC STATUS,Z
GOTO PRENOSK0
MOVLW B'00000010'
SUBWF VYBER,0
BTFSC STATUS,Z
GOTO PRENOSK1
MOVLW B'00000100'
SUBWF VYBER,0
BTFSC STATUS,Z
GOTO PRENOSK2
GOTO START
SYNCHRO ;SYNCHRONIZACE (POSLI ZPET 0xAA) (POKUD 0x55 PRIJATO A BEZ CHYB)
CALL RXTOTX
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI
GOTO $-1 ;
MOVLW 0xAA ;odpoved
MOVWF TXREG
CALL TXTORX
GOTO START ; bude sa cakat odznova povel alebo synchro
PRENOSK0
CALL RXTOTX
MOVLW B'11000001' ; vyber vstupniho kanalu (0) , vyber zdroje CLOCK (INTRC), zapnuti AD
MOVWF ADCON0 ;...
CALL ADPREVOD ;zavolej zahajeni AD prevodu
CALL VYSILEJL ;zavolej vysilani LsB
CALL VYSILEJH ;zavolej vysilani MsB
CALL TXTORX
GOTO START
PRENOSK1
CALL RXTOTX
MOVLW B'11001001' ; vyber vstupniho kanalu (1) , vyber zdroje CLOCK (INTRC), zapnuti AD
MOVWF ADCON0 ;...
CALL ADPREVOD ;zavolej zahajeni AD prevodu
CALL VYSILEJL ;zavolej vysilani LsB
CALL VYSILEJH ;zavolej vysilani MsB
CALL TXTORX
GOTO START
PRENOSK2
CALL RXTOTX
BTFSC PORTC,0 ;POKUD TEPLOTA KLADNA, TAK PREVOD S NORMALNIM VREF+. POKUD ZAPORNA TAK VREF+ -5V
GOTO MINUSHODNOTA
MOVLW B'11010001' ; vyber vstupniho kanalu (2) , vyber zdroje CLOCK (INTRC), zapnuti AD
MOVWF ADCON0 ;...
CALL ADPREVOD ;zavolej zahajeni AD prevodu
CALL VYSILEJL ;zavolej vysilani LsB
CALL VYSILEJH ;zavolej vysilani MsB
BCF ZNAMENKO,0 ;TEPLOTA JE KLADNA
CALL VYSILEJZNAMENKO
CALL TXTORX
GOTO START
MINUSHODNOTA
BSF STATUS,RP0 ;BANKA1
MOVLW B'10000001' ;NASTAVENI VREF+ RA3
MOVWF ADCON1
BCF STATUS,RP0
MOVLW B'11010001' ; vyber vstupniho kanalu (2) , vyber zdroje CLOCK (INTRC), zapnuti AD
MOVWF ADCON0 ;...
CALL ADPREVOD ;zavolej zahajeni AD prevodu
CALL VYSILEJL ;zavolej vysilani LsB
CALL VYSILEJH ;zavolej vysilani MsB
BSF ZNAMENKO,0 ;teplota je zaporna
CALL VYSILEJZNAMENKO
BSF STATUS,RP0 ;BANKA1
BCF ADCON1,0 ;NASTAVENI VREF+ +5V
BCF STATUS,RP0 ;BANKA0
CALL TXTORX
GOTO START
PRENOSK3
PRENOSK4
GOTO START
END
- Přílohy
-
tx-rx.JPG- (97.68 KiB) Staženo 104 x
-
rx-tx.JPG- (79.03 KiB) Staženo 127 x
-
pwrdn-tx.JPG- (78 KiB) Staženo 116 x
-
pwrdn-rx.jpg- (87.45 KiB) Staženo 123 x
-Vysielač musí vysielať NULU-BLANK aspoň 15-25bitov. To sa zaistí po prepnutí RXTOTX patričným čakaním npr. 25x400uS(podľa baude).
-Prijímač na druhej strane to musí vedieť identifikovať ( cca po 11.bite v blanku) povolí prijímač uartu príjem a čaká RCIF.
A v takejto aplikácii, je bezpodmienečne potrebné upraviť testovanie FERR/OVERR ako som napísal vyššie(skôr).
Prijímač by dáta skontroloval aj s kontrolným bytom a až ich potom použil. Inak by sa buď opäť vyžiadali, alebo zahodili. To závisí od aplikácie.
Takže po přepnutí RXTOTX následuje čekání 10ms.
Druhá strana:
Před přepnutím TXTORX je zakázán příjem UARTU, po přepnutí čeká 5ms (cca 13bitů), následně zapne příjem a čeká RCIF.
Vložil jsem detekce FERR a OERR.
Pro jistotu přikládám zdrojáky ...
Kód: Vybrat vše
LIST P=16F627
INCLUDE<P16F627.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _HS_OSC
TEMP EQU 23H
TEMP1 EQU 24H
K0L EQU 25H
K0H EQU 26H
K1L EQU 27H
K1H EQU 28H
K2L EQU 29H
K2H EQU 30H
ZNAMENKO EQU 31H
TMP0 EQU 32H
TMP1 EQU 33H
#DEFINE RXTX PORTB,3
#DEFINE ENABLE PORTB,0
ORG 00H
GOTO INIT
;-------------------------------ZACATEK PODPROGRAMU---------------------------------------------------------
PocitadloMinusJedna
DECFSZ TMP0,F
RETLW 0XFF ;este nepadol cas
DECFSZ TMP1,F
RETLW 0XFF ; este nepadol
RETLW 0 ;je zle padol cas
;--------------------------------------------------------------------
RXTOTX
BTFSC RXTX
RETURN
BSF RXTX
CALL WAIT400uS
CALL WAIT10mS
RETURN
;---------------------------------------------------------------------
TXTORX
BSF STATUS,RP0 ;BANKA1 ;CEKA DOKUD TSR NENI PRAZDNY ABYCHOM SI NEUFIKLI ODCHOZI DATA
BTFSS TXSTA,TRMT ; -,,-
GOTO $-1 ; -,,-
BCF STATUS,RP0 ;BANKA0 ; -,,-
BCF RCSTA,CREN
BCF RXTX
CALL WAIT40uS
BCF ENABLE
CALL WAIT20uS
BSF ENABLE
CALL WAIT200uS
CALL WAIT5mS
BSF RCSTA,CREN
RETURN
;----------------------------------------------------------------------
WAIT20uS
MOVLW 0x22 ;34 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
RETURN
;----------------------------------------------------------------------
WAIT40uS
MOVLW 0x43 ;67 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
RETURN
;------------------------------------------------------------------------
WAIT200uS
MOVLW 0x04 ;4 DEC
MOVWF TMP1
MOVLW 0x52 ;82 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
;----------------------------------------------------------------------
WAIT400uS
MOVLW 0x03 ;3 DEC
MOVWF TMP1
MOVLW 0x0DD ;221 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
WAIT10mS
MOVLW 0x50 ;80 DEC
MOVWF TMP1
MOVLW 0x0CF ;207 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
WAIT5mS
MOVLW 0x28 ;40 DEC
MOVWF TMP1
MOVLW 0x0CF ;207 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
;-------------------------------KONEC PODPROGRAMU-----------------------------------------------------------
INIT
MOVLW B'00000111'
MOVWF CMCON
BSF STATUS,RP0 ;BANKA1
MOVLW B'00000000' ;VYSTUPNI PORT A
MOVWF TRISA
MOVLW B'00000110' ;REZERVACE PORTU B,1,2 PRO SERIOVY PRENOS
MOVWF TRISB
MOVLW D'129' ;KONSTANTA PRO VYPOCET BAUD RATE
MOVWF SPBRG
MOVLW B'00100000' ;zapnuti TXEN
MOVWF TXSTA ;
CLRF PIE1 ;Vypnout preruseni na periferiich
BCF STATUS,RP0 ;BANKA0
BSF RCSTA,SPEN ;POVOLENI SERIOVEHO PORTU
BSF RCSTA,CREN ;POVOLENÍ PRIJMU
;INICIAKZACE BEZDRATOVEHO MODULU
BSF ENABLE
CALL WAIT20uS
BSF RXTX
CALL WAIT400uS
;--------------------------------------------------------------------------------------------
MOVF RCREG
MOVF RCREG
;---------------------------------SYNCHRONIZACE S DRUHYM PROCESOREM---------------------------
SYNCHRO
CALL RXTOTX
MOVLW 0x55 ;POSLI 55H, TESTUJ NECHTENE PREPSANI TXREG
BTFSS PIR1,TXIF ; -,,-
GOTO $-1 ; -,,-
MOVWF TXREG ; -,,-
CALL TXTORX
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC ;CEKEJ 50MS
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CykSynchro
BTFSC PIR1,RCIF ;
GOTO TestujNa0XAA ;PRISLO ZPET AAH ?
CALL PocitadloMinusJedna ;ODECTI 1 Z INTERVALU 50MS
ANDLW 0XFF ;test W, NA RETLW
BTFSC STATUS,Z
GOTO SYNCHRO ;ČAS UPLYNUL
GOTO CykSynchro ;ČAS NEUPLYNUL
TestujNa0XAA
movf RCREG,0
movwf TEMP
movlw 0XAA
subwf TEMP,0
btfss STATUS,Z
goto SYNCHRO
call RXTOTX
goto PRENOSK0
RESTARTPRIJMU
BCF RCSTA,4
BSF RCSTA,4
GOTO SYNCHRO
CHYBASTOPBITU
MOVF RCREG
GOTO SYNCHRO
;-------------------------------------------------------------------------------------------------------------------------
PRENOSK0
MOVLW B'00000001' ;ve W je ulozena informace a MCU ji odesila pres UART ven (KANAL 0)
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
CALL TXTORX
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CYKPRIJEM1
BTFSC PIR1,RCIF
GOTO PRIJEM1
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM1 ; ešte nepadol
PRIJEM1
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVF RCREG,0
MOVWF K0L ;DAT A JEJICH ULOZENI
CYKPRIJEM2
BTFSC PIR1,RCIF
GOTO PRIJEM2
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM2 ; ešte nepadol
PRIJEM2
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVF RCREG,0
MOVWF K0H ;DAT A JEJICH ULOZENI
CALL RXTOTX
;-------------------------------------------------------------------------------------------------------------------------
PRENOSK1
MOVLW B'00000010' ;ve W je ulozena informace a MCU ji odesila pres UART ven (KANAL 0)
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
CALL TXTORX
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CYKPRIJEM3
BTFSC PIR1,RCIF
GOTO PRIJEM3
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM3 ; ešte nepadol
PRIJEM3
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVF RCREG,0
MOVWF K1L ;DAT A JEJICH ULOZENI
CYKPRIJEM4
BTFSC PIR1,RCIF
GOTO PRIJEM4
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM4 ; ešte nepadol
PRIJEM4
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVF RCREG,0
MOVWF K1H ;DAT A JEJICH ULOZENI
CALL RXTOTX
;-------------------------------------------------------------------------------------------------------------------------------
PRENOSK2
MOVLW B'00000100' ;ve W je ulozena informace a MCU ji odesila pres UART ven (KANAL 0)
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
CALL TXTORX
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVLW 0x21 ;33 DEC
MOVWF TMP1
MOVLW 0x76 ;118 DEC
MOVWF TMP0
CYKPRIJEM5
BTFSC PIR1,RCIF
GOTO PRIJEM5
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM5 ; ešte nepadol
PRIJEM5
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVF RCREG,0
MOVWF K2L ;DAT A JEJICH ULOZENI
CYKPRIJEM6
BTFSC PIR1,RCIF
GOTO PRIJEM6
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM6 ; ešte nepadol
PRIJEM6
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVF RCREG,0
MOVWF K2H ;DAT A JEJICH ULOZENI
CYKPRIJEM7
BTFSC PIR1,RCIF
GOTO PRIJEM7
CALL PocitadloMinusJedna
ANDLW 0XFF ;test W
BTFSC STATUS,Z
GOTO SYNCHRO ; podol čas
GOTO CYKPRIJEM7 ; ešte nepadol
PRIJEM7
BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;jdi na opravu chyby prijmu
BTFSC RCSTA,FERR
GOTO CHYBASTOPBITU
MOVF RCREG,0
MOVWF ZNAMENKO ;DAT A JEJICH ULOZENI
CALL RXTOTX
GOTO PRENOSK0
END
Kód: Vybrat vše
LIST P=16F877A
INCLUDE<P16F877A.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _BODEN_OFF & _LVP_OFF & _HS_OSC & _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF
TMP0 EQU 22H
TMP1 EQU 23H
VYBER EQU 24H
ZNAMENKO EQU 25H
#DEFINE ENABLE PORTC,1
#DEFINE RXTX PORTC,2
ORG 00H
GOTO INIT
;----------------------------ZACATEK PODPROGRAMU--------------------------------------------------
ADPREVOD
MOVLW 0x05 ;CEKANI 750uS PRED ZAHAJENIM PREVODU
MOVWF TMP1
MOVLW 0x0DD ;
MOVWF TMP0
DECFSZ TMP0,1 ;
GOTO $-1
DECFSZ TMP1,1 ;
GOTO $-3
BSF ADCON0,2 ;zahejni prevodu
BTFSC ADCON0,2 ;zjistovani dokonceni prevodu
GOTO $-1 ;...
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VYSILEJL
BSF STATUS,RP0 ;BANKA1 (ADRESL JE V BANCE 1 !!! )
MOVF ADRESL,W ;do W je ulozena informace a MCU ji nasledne odesila pres UART ven
BCF STATUS,RP0 ;BANKA0
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VYSILEJH
MOVF ADRESH,W ;do W je ulozena informace a MCU ji nasledne odesila pres UART ven
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
RETURN
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
VYSILEJZNAMENKO
MOVF ZNAMENKO,W
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI vždy pred zápisom !
GOTO $-1 ;
MOVWF TXREG ;presunout 8-bit hodnotu do registru TXREG (Bank0) => nacteni dat zacina vysilani
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RXTOTX
BTFSC RXTX
RETURN
BSF RXTX
CALL WAIT400uS
CALL WAIT10mS
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TXTORX
BSF STATUS,RP0 ;BANKA1 ;CEKA DOKUD TSR NENI PRAZDNY ABYCHOM SI NEUFIKLI ODCHOZI DATA
BTFSS TXSTA,TRMT ; -,,-
GOTO $-1 ; -,,-
BCF STATUS,RP0 ;BANKA0 ; -,,-
BCF RCSTA,CREN
BCF RXTX
CALL WAIT40uS
BCF ENABLE
CALL WAIT20uS
BSF ENABLE
CALL WAIT200uS
CALL WAIT5mS
BSF RCSTA,CREN
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WAIT20uS
MOVLW 0x22 ;34 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
RETURN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WAIT40uS
MOVLW 0x43 ;67 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
RETURN
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WAIT200uS
MOVLW 0x04 ;4 DEC
MOVWF TMP1
MOVLW 0x52 ;82 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WAIT400uS
MOVLW 0x03 ;3 DEC
MOVWF TMP1
MOVLW 0x0DD ;221 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
WAIT10mS
MOVLW 0x50 ;80 DEC
MOVWF TMP1
MOVLW 0x0CF ;207 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
WAIT5mS
MOVLW 0x28 ;40 DEC
MOVWF TMP1
MOVLW 0x0CF ;207 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1
DECFSZ TMP1,F
GOTO $-5
RETURN
;+++++++++++++++++++++++++++++++++++KONEC PODPROGRAMU++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;-----------------------------------INICIALIZACE PERIFERII--------------------------------------------
INIT
BCF STATUS,RP0 ;BANKA0
BCF STATUS,RP1 ;BANKA0
CLRF PORTA
CLRF PORTE
CLRF PORTC
CLRF PORTB
BSF STATUS,RP0 ;BANKA 1
MOVLW B'00000111' ;INICIALZICAZE PORTU
MOVWF CMCON ;
MOVLW B'10000000' ;INICIALIZACE AD PREVODNIKU
MOVWF ADCON1 ;
MOVLW B'00111111' ;INICIALIZACE PORTUA RA0-RA5 AD VSTUPY
MOVWF TRISA ;
MOVLW B'00000111' ;INICIALIZACE PORTUE RE0-RE2 AD VSTUPY
MOVWF TRISE ;
MOVLW B'00000000' ;INICIALIZACE PORTUB VSE VYSTUP
MOVWF TRISB ;
CLRF TRISC ;PortC 7,6 pro USART, 0 pro detekci zaporneho napeti cidla teploty
MOVLW B'11000001' ;
MOVWF TRISC ;
MOVLW D'129' ;konstanta pro vypocet BAUD RATE
MOVWF SPBRG ;
;
MOVLW B'00100000' ;zapnuti TXEN
MOVWF TXSTA ;
CLRF PIE1 ;Vypnout preruseni na periferiich
BCF STATUS,RP0 ;BANKA0
MOVLW B'10010000' ;zapnuti UART portu a prijmu
MOVWF RCSTA
;INICIALIZACE BEZDRATOVEHO MODULU
BSF ENABLE
CALL WAIT20uS
BSF RXTX
CALL WAIT200uS
BCF RXTX
CALL WAIT40uS
BCF ENABLE
CALL WAIT20uS
BSF ENABLE
CALL WAIT200uS
;------------------------------------------------KONEC INICIALIZACE-------------------------------------------------------------------------
START BTFSC RCSTA,OERR ;TEST CHYBY PRIJMU
GOTO RESTARTPRIJMU ;
BTFSC RCSTA,FERR ;TEST CHYBY PRIJMU
GOTO CHYBARAMEC ;
BTFSS PIR1,RCIF ;ceka na prichozi data (dokud neni naplnen RCREG)
GOTO START ;
MOVF RCREG,0
MOVWF VYBER
MOVWF PORTB ;zobrazeni prichozich dat na LED
GOTO MENU
RESTARTPRIJMU
BCF RCSTA,4
BSF RCSTA,4
GOTO START
CHYBARAMEC
MOVF RCREG,0
GOTO START
MENU
MOVLW 0X55
SUBWF VYBER,0 ;porovnaj ak W==VYBER>je zero v STATUS
BTFSC STATUS,Z ; Zero indikator
GOTO SYNCHRO ; nie call treba odpovedat 0xAA a ide START
MOVLW B'00000001'
SUBWF VYBER,0
BTFSC STATUS,Z
GOTO PRENOSK0
MOVLW B'00000010'
SUBWF VYBER,0
BTFSC STATUS,Z
GOTO PRENOSK1
MOVLW B'00000100'
SUBWF VYBER,0
BTFSC STATUS,Z
GOTO PRENOSK2
GOTO START
SYNCHRO ;SYNCHRONIZACE (POSLI ZPET 0xAA) (POKUD 0x55 PRIJATO A BEZ CHYB)
CALL RXTOTX
BTFSS PIR1,TXIF ;TESTOVANI ABYCHOM SI TXREG NEPREPSALI
GOTO $-1 ;
MOVLW 0xAA ;odpoved
MOVWF TXREG
CALL TXTORX
GOTO START ; bude sa cakat odznova povel alebo synchro
PRENOSK0
CALL RXTOTX
MOVLW B'11000001' ; vyber vstupniho kanalu (0) , vyber zdroje CLOCK (INTRC), zapnuti AD
MOVWF ADCON0 ;...
CALL ADPREVOD ;zavolej zahajeni AD prevodu
CALL VYSILEJL ;zavolej vysilani LsB
CALL VYSILEJH ;zavolej vysilani MsB
CALL TXTORX
GOTO START
PRENOSK1
CALL RXTOTX
MOVLW B'11001001' ; vyber vstupniho kanalu (1) , vyber zdroje CLOCK (INTRC), zapnuti AD
MOVWF ADCON0 ;...
CALL ADPREVOD ;zavolej zahajeni AD prevodu
CALL VYSILEJL ;zavolej vysilani LsB
CALL VYSILEJH ;zavolej vysilani MsB
CALL TXTORX
GOTO START
PRENOSK2
CALL RXTOTX
BTFSC PORTC,0 ;POKUD TEPLOTA KLADNA, TAK PREVOD S NORMALNIM VREF+. POKUD ZAPORNA TAK VREF+ -5V
GOTO MINUSHODNOTA
MOVLW B'11010001' ; vyber vstupniho kanalu (2) , vyber zdroje CLOCK (INTRC), zapnuti AD
MOVWF ADCON0 ;...
CALL ADPREVOD ;zavolej zahajeni AD prevodu
CALL VYSILEJL ;zavolej vysilani LsB
CALL VYSILEJH ;zavolej vysilani MsB
BCF ZNAMENKO,0 ;TEPLOTA JE KLADNA
CALL VYSILEJZNAMENKO
CALL TXTORX
GOTO START
MINUSHODNOTA
BSF STATUS,RP0 ;BANKA1
MOVLW B'10000001' ;NASTAVENI VREF+ RA3
MOVWF ADCON1
BCF STATUS,RP0
MOVLW B'11010001' ; vyber vstupniho kanalu (2) , vyber zdroje CLOCK (INTRC), zapnuti AD
MOVWF ADCON0 ;...
CALL ADPREVOD ;zavolej zahajeni AD prevodu
CALL VYSILEJL ;zavolej vysilani LsB
CALL VYSILEJH ;zavolej vysilani MsB
BSF ZNAMENKO,0 ;teplota je zaporna
CALL VYSILEJZNAMENKO
BSF STATUS,RP0 ;BANKA1
BCF ADCON1,0 ;NASTAVENI VREF+ +5V
BCF STATUS,RP0 ;BANKA0
CALL TXTORX
GOTO START
PRENOSK3
PRENOSK4
GOTO START
END
Je tam upravené čakanie na zapnutie vysielača druhej strany. To sa robí priamo cez portc7 resp. portb1 čítaním.
Nie je to bohvie čo, ale možno to pôjde, ak som v tom nerobil nejaké chyby.
Najmä u 627 je potrebné na príjem čakať iba do nejakej doby, aby sa to nezaťalo. Po pretečení času sa musí nanovo rozbehnúť nadviazanie spojenia...synchro.
877 môže trčať v prijímacej slučke stále. Iba pri zapínaní prenosu sa musí rozpoznať začiatok, prvý PaZnak vyhodiť-preskočiť...ten znak je tam zákonite ak sa príjem zapne skôr ako 627 zapne vysielač.
Ak by to nestačilo takto detekovať zapnutý vysielač, potom s HW by sa dal urobiť RC obvod a snímať ho na voľnom pine 627/877
- Přílohy
-
PIC627a877a.txt- (26.06 KiB) Staženo 141 x