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
; Bäst är att aldrig förutsätta
 Bäst är att aldrig förutsätta . Men jag brukar ju använda MOVLW så varför jag inte gjorde det denna gång är en gåta... Fort men fel, helt enkelt. Så nu får det bli lite "gör om, gör rätt".
 . Men jag brukar ju använda MOVLW så varför jag inte gjorde det denna gång är en gåta... Fort men fel, helt enkelt. Så nu får det bli lite "gör om, gör rätt".