Program stannar vid initiering av EUSART
Postat: 6 augusti 2009, 21:21:16
Jag har ett problem som jag inte hittar en lösning på. När programmet körs så stannar det i den del av koden som skall initiera EUSART (SERIAL_INIT). Jag kan bygga hex-koden i MPLAB 8.3 utan problem. Det går att ladda in den i PIC16F886 och om jag kommenterar bort CALL SERIAL_INIT i INIT-delen så fungerar allt annat som det skall dvs PIC initieras, display initieras och text skrivs ut.
Jag har en led kopplad på RC1 vilken sätts till hög dvs leden tänds när programmet "kör förbi". Där den (BSF PORTC,1) nu sitter i SERIAL_INIT så tänds den när kretsen startas. Men om jag flyttar den längre ned i SERIAL_INIT så tänds den inte dvs programmet verkar ha stannat. Och det verkar som den stannar redan vid BANKSEL SPBRG. Ser någon vad det kan bero på?
Jag har en led kopplad på RC1 vilken sätts till hög dvs leden tänds när programmet "kör förbi". Där den (BSF PORTC,1) nu sitter i SERIAL_INIT så tänds den när kretsen startas. Men om jag flyttar den längre ned i SERIAL_INIT så tänds den inte dvs programmet verkar ha stannat. Och det verkar som den stannar redan vid BANKSEL SPBRG. Ser någon vad det kan bero på?
Kod: Markera allt
LIST p=16f886 ; List directive to define processor
#INCLUDE <p16f886.inc> ; Processor specific variable definitions
ERRORLEVEL -302 ; Remove error message
__CONFIG _CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__CONFIG _CONFIG2, _WRT_OFF & _BOR21V
;***** VARIABLE DEFINITIONS *****
;
TEMP EQU H'70' ; Used for different tasks
W_TEMP EQU H'71' ; Used for context saving
STATUS_TEMP EQU H'72' ; Used for context saving
PCLATH_TEMP EQU H'73' ; Used for context saving
TIM1 EQU H'74' ; Used in delay routines
TIM2 EQU H'75' ; -"-
TIM3 EQU H'76' ; -"-
TIM4 EQU H'77' ; -"-
MEM1 EQU H'78' ; Used when writing to Display
MEM3 EQU H'79' ; Used in test
WRTEMP EQU H'7A' ; Used when writing PC mirror
;
RS EQU H'04' ;RS Display at PORTC
E EQU H'05' ;Enable Display at PORTC
IN1 EQU H'00' ;Input no 1 at PORTA
IN2 EQU H'01' ;Input no 2 at PORTA
IN3 EQU H'02' ;Input no 3 at PORTA
IN4 EQU H'03' ;Input no 4 at PORTA
OUT1 EQU H'00' ;Output no 1 at PORTC
OUT2 EQU H'01' ;Output no 2 at PORTC
OUT3 EQU H'02' ;Output no 3 at PORTC
OUT4 EQU H'03' ;Output no 4 at PORTC
BUT_UP EQU H'05' ;Button Up at PORTB
BUT_DOWN EQU H'04' ;Button Down at PORTB
BUT_ENTER EQU H'03' ;Button Enter at PORTB
BUT_BACK EQU H'02' ;Button Back at PORTB
;
;
;***** VECTORS *****
;
ORG 0x000 ; Processor reset vector
GOTO INIT ; Go to beginning of program
;
ORG 0x004 ; Interrupt vector location
GOTO INTERRUPT ; Go to interrupt routine
;
;
;***** INITIATE *****
;
INIT CALL PIC_INIT ; Initiate PIC
CALL DISP_INIT ; Initiate Display
CALL WELCOME ; Print welcoming text
CALL SERIAL_INIT ; Initiate serial port
GOTO MAIN
;
;***** INITIATE PIC *****
;
PIC_INIT
BANKSEL INTCON ; Select bank
CLRF INTCON ; Disable interupts
BANKSEL ANSEL ; Select bank
CLRF ANSEL ; Digital ports
CLRF ANSELH ; -"-
BANKSEL OSCCON ; Select bank
BSF OSCCON,4 ; Set internal osc to 8 MHz
BSF OSCCON,5 ; -"-
BSF OSCCON,6 ; -"-
BANKSEL ADCON0 ; Select bank
BCF ADCON0,0 ; Disabel ADC
BANKSEL TRISA ; Select bank
MOVLW B'00001111' ; RA<7:4> as output, RA<3:0> as input
MOVWF TRISA ; -"-
MOVLW B'10000000' ; RB<7> as input, RB<6:0> as output
MOVWF TRISB ; -"-
MOVLW B'10000000' ; RC<7> as input, RC<6:0> as output
MOVWF TRISC ; -"-
BANKSEL PORTA ; Select bank
CLRF PORTA ; Clear port A
CLRF PORTB ; Clear port B
CLRF PORTC ; Clear port C
CLRF W
CLRF MEM1
CLRF MEM3
CLRF TEMP
RETURN
;
;
;***** INITIATE DISPLAY *****
;
DISP_INIT CALL DELL
BCF PORTC,RS
MOVLW H'30' ; Wake up, Set 8bit mode
MOVWF PORTA
CALL PULSE_E
CALL DELS
CALL PULSE_E
CALL DELS
CALL PULSE_E
CALL DELS
MOVLW H'20' ; Set 4bit mode
MOVWF PORTA
CALL PULSE_E
BCF PORTC,RS
MOVLW H'28' ; 2 line disp
MOVWF TEMP
CALL PORTNIBBLE
CALL PULSE_E
SWAPF TEMP,W
CALL PORTNIBBLE
CALL PULSE_E
BCF PORTC,RS
MOVLW H'0C' ; Display on. No cursor, no blinking
MOVWF TEMP
CALL PORTNIBBLE
CALL PULSE_E
SWAPF TEMP,W
CALL PORTNIBBLE
CALL PULSE_E
CALL CURSORRET
RETURN
;
;
;***** INITIATE SERIAL PORT *****
;
SERIAL_INIT BSF PORTC,1
BANKSEL SPBRG ; Select bank
MOVLW d'207' ; 9600 baud @ 8 Mhz, +0.16% err
MOVWF SPBRG
MOVLW b'00100100' ; TXEN=1, BRGH=1
MOVWF TXSTA ; Enable Async Transmission, set brgh
BANKSEL RCSTA ; Select Bank 0
MOVLW b'10010000' ; SPEN=1, CREN=1
MOVWF RCSTA ; Enable Async Reception
BANKSEL BAUDCTL ; Select bank
MOVLW b'00001000' ; BRG16=1
MOVWF BAUDCTL ; Enable BRG16
RETURN
;