Program stannar vid initiering av EUSART

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Program stannar vid initiering av EUSART

Inlägg av Tjille »

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å?

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
;
bearing
Inlägg: 11674
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Program stannar vid initiering av EUSART

Inlägg av bearing »

Prova att simulera koden och se om du kan dra någon slutsats av det. Jag har inte tittat på koden.

EDIT: kikade kort nu och ser "goto main", fast någon main verkar inte finnas.
Jag minns inte helt hur det var med bankerna, men jag tror BSF PORTC,1 bara fungerar om programmet ligger i banken med PORTC i.
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Re: Program stannar vid initiering av EUSART

Inlägg av Tjille »

Jag kanske var lite knapphändig med information. Den kod som visas är den inledande koden. Main finns längre ned. Jag ansåg att denna inte behövde visas eftersom allt stannar innan den kommer till "GOTO MAIN". Att skriva till PORTC skall kunna göras oavsett vilken bank man ligger i. Jag har testat att byta plats på kodsnuttar, använt mig av "det gamla sättet" att välja banker, bytt namn på subrutinen men inget tycks hjälpa. Jag bytte plats på CALL WELCOME (det som skriver ut en text) och SERIAL_INIT i INIT och då blir det tydligt att det inte fungerar eftersom det inte skrivs ut ngt på displayen, vilket det gör om CALL WELCOME ligger före SERIAL_INIT.

Jag skall testa med att simulera.

Jag blir inte klok på detta...
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Program stannar vid initiering av EUSART

Inlägg av sodjan »

> Att skriva till PORTC skall kunna göras oavsett vilken bank man ligger i.

Var i jösse namn har du fått det ifrån ?

Jag har inte kollat koden och ser inte att det behövs om du har skrivit den
med så tokiga uppfattningar om hur det fungerar. Om du tror att PORTC kan
skrivas oavsett vilken bank du är i så är det ju ganska självklart att det går fel.
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Re: Program stannar vid initiering av EUSART

Inlägg av Tjille »

Jag missförstod bara vad som avsågs. Men det är nog trots allt ett Bank-problem även i huvudfrågan eftersom programmet ligger i Bank03 när rutinen SERIAL_INIT lämnas och går via INIT till MAIN. I MAIN skall återigen displayen matas med information via portarna vilka ligger i Bank0. Det skulle i så fall kunna betyda att initieringen av EUSART har gått rätt trots allt. Kollas i kväll.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Program stannar vid initiering av EUSART

Inlägg av sodjan »

Precis så är det.

Sen finns det två "skolor" för hur subrutiner ska lämna bankerna efter sig.
En menar att det inte spelar någon roll, utan all annan kod får själv se till
att bankerna är rätt valda. En annan menar att alla subrutiner ska gör
RETURN med bankerna satta till Bank0 som någon slags default värde.

I ditt fall gör du verken eller, du lämner SERIAL_INIT med Bankbitarna satta
till Bank3, och de andra rutinerna börjar med att sätta PORTC som om
Bank0 hade varit vald. Klart det går fel... :-) Bäst är att aldrig förutsätta
något om bankbitarna, om det inte är inom ett löpande kodsegment där
man har full koll genom hela sekvensen.

Grundproblemet verkar dock vara att du tror (trodde?) att PORTC kan skrivas
oberoende på vilken bank som råkar vara vald. Och du behöver inte vänta
till ikväll, det är ju uppenbart från koden att du har "bankproblem"... :-)

En annan sak som jag såg.
Jag undrar vad du tror att "CLRF W" faktiskt gör. Det den *inte*
gör är i alla fall att sätta registret W till h'00'... :-)
Använd "MOVLW h'00'" till det.

Och ett litet tips.

Kod: Markera allt

; Istället för :
RS        EQU      H'04'
...
          BCF      PORTC,RS
;
; så kan du göra :
;
#define   RS       PORTC, 4
...
          BCF      RS
då får du bara ett ställe att ändra både port och pinne för RS.
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Re: Program stannar vid initiering av EUSART

Inlägg av Tjille »

Tack för bra information.

Med att kolla i kväll menar jag att testa i realiteten. Att det finns ett banking-problem är uppenbart.

Jo, i ett svagt ögonblick så trodde jag att jag satte W till 00 med CLRF :oops: . 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".
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Program stannar vid initiering av EUSART

Inlägg av sodjan »

Det som "CLRF W" faktiskt gör är att nolla det register som FSR råkar peka på.
Och eftersom FSR är "undefined" efter power-on eller reset så kan det peka
vart som helst och ge väldigt konstiga fel...

(Symbolen "W" = h'00' så "CLRF W" är detsamma som "CLRF INDF").

Nu visste du ju att det var fel, men annars är det inget ovanligt nybörjarfel... :-)
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Re: Program stannar vid initiering av EUSART

Inlägg av Tjille »

Då var det testat och det visade sig naturligtvis att felet var att jag inte ändrar från Bank03 till rätt bank (Bank00) när subrutinen lämnades. Väl tillrättat så fungerar det vilket betyder att PIC, Display och seriekommunikationen initieras, välkomstmeddelande skrivs och visas på displayen. Dessutom tar den emot tecken från PC:n via RS232, replikerar det samt skriver ut det på displayen. Och det var det första delmålet dvs få igång en seriekommunikationen. :P

Nu är det bara resten kvar...

Tack för hjälpen!
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Program stannar vid initiering av EUSART

Inlägg av sodjan »

> ...felet var att jag inte ändrar från Bank03 till rätt bank (Bank00) när subrutinen lämnades.

Var det så du fixade det ?
Eller la du till BANKSEL före dina BCF/BSF mot PORTC ?
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Re: Program stannar vid initiering av EUSART

Inlägg av Tjille »

Ja, genom den förändringen så löstes det stora felet dvs att programmet fastnade. Men dessutom hade jag glömt bankingen för min testled. Det var inte det egentliga felet, men gjorde inte det lättare att felsöka. Sedan så har jag nu snyggat till koden lite bl a genom att skippa EQU helt och hållet för att i stället använda Define resp Cblock.

Jag gör ju det här på fritiden och väldigt sporadiskt så man har inte allt i ryggmärgen...

Målet med det här bygget är att styra en mobiltelefon via rs232. Jag har fuskat med det tidigare genom att med reläer styra några knappar på en mobil vilket fungerar som larm för elavbrott, pannfel, pellets snart slut och temp. Det fungerar kanon men är väldigt statiskt uppbyggt (det går ju t ex inte att byta mobil så enkelt med inlödda kablar...). Den gången använde jag en PIC16F628A. Nu skall jag kunna styra det på ett mer flexibelt sätt. Bla skall all information kunna matas in via ett menysystem. En av utmaningarna är att omvandla inmatad information till PDU-format. Det gäller både det som skall sändas iväg men även det som tas emot (jag skall kunna få status samt styra på och avstängning av saker på distans via sms).
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Program stannar vid initiering av EUSART

Inlägg av sodjan »

> genom att skippa EQU helt och hållet för att i stället använda Define resp Cblock.

Igentligen inte så mycket vunnet med CBLOCK istället för EQU.
Det stora uppsnyggningen blir när du börjar använda RES... :-)

Se t.ex http://www.jescab.se/Relocmode.html och http://www.jescab.se/abs_reloc.html
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Program stannar vid initiering av EUSART

Inlägg av sodjan »

> Ja, genom den förändringen......

Men frågan var ju vad "den förändingen" faktiskt var...

Sätter du om bankbiaternba i slutet av subrutinen ?
Eller i innan dina BCF/BSF mot PORTC ?
Tjille
Inlägg: 43
Blev medlem: 4 februari 2007, 14:33:00
Ort: Göteborg

Re: Program stannar vid initiering av EUSART

Inlägg av Tjille »

Jag valde att byta till bank0 innan subrutinen lämnades eftersom jag visste att jag i nästa steg behövde ligga i bank0. Jag kunde lika gärna ha gjort det i ett senare skede men kände att jag ville ha det så den här gången eftersom det var det sista som hände i initeringen. Jag ville alltså lämna initieringen med bank0 vald. Jag väljer att (åtminstonde framöver... :) ha koll på vilken bank jag redan ligger i i stället för att regelmässigt alltid välja bank så fort man skall göra ngt med portarna
Skriv svar