EUSART på 16F887 jävlas
Postat: 30 april 2010, 23:03:05
Begriper inte vad jag gör för fel.
Jag får inte in några tecken med EUSART Asynchronus reception
RCREG är konstant tomt, men trots detta går interupten hög (RCIF).
Dessutom får jag OERR för varje tecken som går in.
Det känns som baudrate problem, men jag har kollat värdena upprepade gånger och
kör jag Transmit med samma riggning av baudgeneratorn funkar det fint.
uC'n går i 8 MHz
Snälla !
Jag får inte in några tecken med EUSART Asynchronus reception
RCREG är konstant tomt, men trots detta går interupten hög (RCIF).
Dessutom får jag OERR för varje tecken som går in.
Det känns som baudrate problem, men jag har kollat värdena upprepade gånger och
kör jag Transmit med samma riggning av baudgeneratorn funkar det fint.
uC'n går i 8 MHz
Snälla !
Kod: Markera allt
list p=16f887
#include <p16F887.inc>
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
errorlevel -302
;############## Definitioner ###############################
#define E PORTC,7
w_temp EQU 0x7D ; variable used for context saving
status_temp EQU 0x7E ; variable used for context saving
pclath_temp EQU 0x7F ; variable used for context saving
;################# Gå till start ###########################
ORG 0x000 ; processor reset vector
goto start ; go to beginning of program
;################# ISR #####################################
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movfw STATUS ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movfw PCLATH ; move pclath register into W register
movwf pclath_temp ; save off contents of PCLATH register
banksel PIR1
bcf PIR1,5 ; Clear RCIF flag
movfw RCREG
retfie ; return from interrupt
;############## Konfigurera PIC ############################
cblock 0x20
d1
d2
d3
dataL
endc
start:
banksel PORTC
clrf PORTC
banksel TRISC
movlw b'10111111' ;Sätter PORTC till output
movwf TRISC
;######## Interrupt på RECIEVE ########
banksel INTCON
movlw b'00000000'
movwf INTCON
banksel PIE1
movwf b'00100000'
movwf PIE1
;######### BAUD 2400 #########
banksel SPBRGH
movlw b'00000000' ; brgh = 0
movwf SPBRGH
banksel SPBRG
movlw b'00110011' ; 51 = 2,403.85 (2400 -0.1%)
movwf SPBRG
banksel TXSTA
bcf TXSTA,2 ; Sätt BRGH
banksel BAUDCTL
bsf BAUDCTL,3 ; Sätt BRG16
;######### Enable #########
banksel RCSTA
movlw b'10010000'
movwf RCSTA
clrf dataL
settle:
decfsz dataL,F
goto settle
movf RCREG,W
movf RCREG,W
movf RCREG,W ; flush receive buffer
Main:
call Delay1000
banksel RCSTA
btfsc RCSTA,1
goto rcv_err
goto Main
rcv_err:
bcf RCSTA,4
bcf RCSTA,1
bsf RCSTA,4
goto Main
Delay1000:
;19998 cycles
movlw 0x9F
movwf d1
movlw 0x10
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0
;2 cycles
goto $+1
return
END