"Halted due to PC incrementing" - Error, PIC 12F629

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

"Halted due to PC incrementing" - Error, PIC 12F629

Inlägg av PopUnoNkoK »

Jag är riktigt irriterad på mig själv att jag måste posta en fråga om detta. :)

Sodjan har skrivit ett svar i en annan tråd där svaret löd:
Ja men då så. Fixa det. Det är ju bara att stega igenom och se var PC'n "skenar"...
http://www.elektronikforumet.com/forum/ ... he+Maximum

Men jag lyckas inte hitta problemet.
Error meddelande lyder alltså:
CORE-W0014: Halted due to PC incrementing over the Maximum PC address and wrapping back to Zero
Koden är innan detta är bara en mainloop som inte gör någonting. Detta i väntan på interrupt.
Om jag sätter prescalern till 0 (Alltså b'xxxxx000') och stegar fram manuellt steg för steg så får jag inget felmeddelande när jag kommer till interrupten. Alltså då är allt OK.

Men om jag sätter prescalern till b'xxxxx011' så blir det problem. Efter som jag inte orkar stega fram manuellt när preascalern är i detta "läge" så har jag satt en "break" point i första raden i Interrupten. Om jag nu väljer att köra "RUN" i simulatorn så stannar den förståss i första raden i interrupten som jag bett den, men jag får också ovannämnda errormeddelande.

De två skillnader jag gör här mellan är alltså:
Jag väljer "RUN" i simulatorn istället för "Step Into". (Tycker jag inte ska spela någon roll)
Ändrar TMR0 prescaler från 000 till 011. (Tycker jag inte heller ska spela någon roll)

Så några frågor.

Vart kan jag hålla koll på ProgramCountern? PCL i watch fönstret?
Någon som har några andra förslag vad det kan bero på?

Koden funkar galant när jag kör den "skarpt" i PICen. Alltså det ser inte ut att vara några problem där men jag vill ändå att det ska funka "rent" i simulatorn.

MVH Peter
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av bearing »

I den andra tråden finns kod med instruktionen "addwf PCL,f". Den instruktionen kan orsaka att PCL hamnar på okänt ställe ifall W innehåller ett oväntat värde. Jag tycker att man bör lägga in några instruktioner som ser till att W inte är större än tabellens storlek innan addwf-instruktionen körs.

Min gissning är att du har samma problem, d.v.s att PC hoppar förbi tabellen, och hamnar någonstans i FLASH där det inte finns några instruktioner, vilket gör att PC bara rullar på och till slut hamnar i slutet av FLASH och börjar om från 0. Detta kanske inte sker när du kör programmet i kretsen, det beror på vad tabellhoppet baseras på, eller så märks det kanske inte ifall programmet startar om då och då.

För att kolla ifall PC är på väg att slå runt skulle du kunna lägga in en död loop i slutet av FLASH, som gör att PC fastnar där istället för att börja om från början.

Kod: Markera allt

org 1023
PCoverflow:
  goto PCoverflow
Senast redigerad av bearing 12 april 2012, 16:39:43, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av sodjan »

En kod som innebär att programräknaren "snurrar runt" kan mycket
väl ändå fungera helt OK. Felet du får är från simulatorn, det finns inte
samma "larm" i PIC processorn i sig.

Det är svårt att säga så mycket mer utan koden.

Jag utgår från att du har sett och läst t.ex :
http://www.microchip.com/forums/m515127.aspx
och andra Google-träffar på "CORE-W0014" på samma tema.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av PopUnoNkoK »

Koden skulle förståss vara med i första inlägget, men det glömdes försås bort.

Kod: Markera allt

;******************************************************************************
;   This file is a basic code template for object module code                 *
;   generation on the PIC12F629. This file contains the                       *
;   basic code building blocks to build upon.                                 *
;                                                                             *
;   Refer to the MPASM User's Guide for additional information on             *
;   features of the assembler and linker (Document DS33014).                  *
;                                                                             *
;   Refer to the respective PIC data sheet for additional                     *
;   information on the instruction set.                                       *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Filename:      xxx.asm                                                   *
;    Date:                                                                    *
;    File Version:                                                            *
;                                                                             *
;    Author:                                                                  *
;    Company:                                                                 *
;                                                                             *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Files required: P12F629.INC                                              *
;                                                                             *
;                                                                             *
;                                                                             *
;******************************************************************************
;                                                                             *
;    Notes:                                                                   *
;                                                                             *
;******************************************************************************

;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------

     LIST      P=12F629              ; list directive to define processor
     #INCLUDE <P12F629.INC>          ; processor specific variable definitions

;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the 
; .asm file. The lables following the directive are located in the respective 
; .inc file.  See the data sheet for additional information on configuration 
; word settings.
;
;------------------------------------------------------------------------------

    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT 

;------------------------------------------------------------------------------
; VARIABLE DEFINITIONS
;------------------------------------------------------------------------------

;Konstanta variabler
TMRO_EXTRA_COUNT	EQU		.120	;229




; example of using Shared Uninitialized Data Section
INT_VAR     UDATA_SHR   0x20   
W_TEMP      RES     1             ; variable used for context saving 
STATUS_TEMP RES     1             ; variable used for context saving

TMRO_EXTRA	RES		1				;TMROs extraräknare
STEP_COUNTER RES	1				;

;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 12F629 has 128 bytes of non-volatile EEPROM, starting at address 0x2100
; 
;------------------------------------------------------------------------------

DATAEE    CODE  0x2100
    DE    "MCHP"          ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3

;------------------------------------------------------------------------------
; OSCILLATOR CALIBRATION VALUE
;------------------------------------------------------------------------------

OSC       CODE    0x03FF

; Internal RC calibration value is placed at location 0x3FF by Microchip as
; a 0xADDLW K instruction, where the K is a literal value to be loaded into 
; the OSCCAL register.  

;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------

RESET_VECTOR  CODE      0x0000 ; processor reset vector
        GOTO    START          ; go to beginning of program

;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------

INT_VECTOR    CODE    0x0004  ; interrupt vector location
        MOVWF   W_TEMP        ; save off current W register contents
        MOVF    STATUS,w      ; move status register into W register
        MOVWF   STATUS_TEMP   ; save off contents of STATUS register

; isr code can go here or be located as a call subroutine elsewhere

		BCF		INTCON, T0IF	;Rensa TMRO Interruptflaggan

		BTFSS	GPIO, 5			;Kolla om knappen är intryckt
		GOTO	intryckt
		
		BANKSEL	TMRO_EXTRA		;Hantera Extraräknaren
		DECFSZ	TMRO_EXTRA,1
		GOTO	ISR_SLUT		;Om den inte är noll än, skippa resten av ISRen.
		MOVLW	TMRO_EXTRA_COUNT;Annars, återställ extraräknaren och fortsätt
		MOVWF	TMRO_EXTRA
intryckt			
		NOP
;laggutbit 	MACRO
		BANKSEL	STEP_COUNTER
		MOVFW	STEP_COUNTER		;Kolla vilken "steg" vi är på
		CALL	rulla_bitar			;Hämta rätt bitar från LookUpTable
		BANKSEL	GPIO
		MOVWF	GPIO				;Lägg ut till världen

		BANKSEL	STEP_COUNTER
		INCF	STEP_COUNTER		;Öka så vi är redo för nästa "steg"
	
		NOP

		MOVLW	.8					;KOlla om vi är vid det sista "steget"
		BSF		STATUS,C
		SUBWF	STEP_COUNTER, 0		;Ta bort antalet steg från Step_Counter
		BTFSC	STATUS,C			;Blev det noll, alltså sista steget.
		CLRF	STEP_COUNTER		;Rensa Step_Counter så att vi börjar om från början
	;	ENDM

		NOP




ISR_SLUT
        MOVF    STATUS_TEMP,w ; retrieve copy of STATUS register
        MOVWF   STATUS        ; restore pre-isr STATUS register contents
        SWAPF   W_TEMP,f
        SWAPF   W_TEMP,w      ; restore pre-isr W register contents
        RETFIE                ; return from interrupt

;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------

MAIN_PROG     CODE

START

;------------------------------------------------------------------------------
; OSCCAL RESTORE (not required if internal OSC is not used)
;------------------------------------------------------------------------------

        errorlevel -302
        BSF     STATUS,RP0    ; set file register bank to 1 
        CALL    0x3FF         ; retrieve factory calibration value
        MOVWF   OSCCAL        ; update register with factory cal value 
        BCF     STATUS,RP0    ; set file register bank to 0
        errorlevel +302
        
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------

SETUP

		BANKSEL	INTCON
		MOVLW	b'10100000'		;Slå på Global interrupt OCH TMRO Interuppt.
		MOVWF	INTCON

		BANKSEL	OPTION_REG
		MOVLW	b'00000000'		;Här sätter vi prescaler på de sista 3 bitarna
		MOVWF	OPTION_REG

		BANKSEL	TRISIO
		MOVLW	b'00100000'			
		MOVWF	TRISIO			;Sätter alla I/O till utgångar, Utom MCLR
		BANKSEL	CMCON
		MOVLW	07h
		MOVWF	CMCON

		BANKSEL	TMRO_EXTRA		;rensa extraräknaren
		MOVLW	TMRO_EXTRA_COUNT
		MOVWF	TMRO_EXTRA

		BANKSEL	STEP_COUNTER
		CLRF	STEP_COUNTER





		BANKSEL	GPIO
		MOVLW	b'00000001'
		MOVWF	GPIO			;Sätter första pinnen hög
		


MAIN_LOOP
		NOP
		GOTO	MAIN_LOOP



;---------------------------------------------------------------------------------

rulla_bitar		ADDWF PCL,1                  ; Hoppa till rätt "Steg" med värdet i w.
				RETLW b'00000001'			;Halvsteg      
				RETLW b'00000011' 
				RETLW b'00000010' 
				RETLW b'00000110' 
				RETLW b'00000100'                
				RETLW b'00010100' 
				RETLW b'00010000' 
				RETLW b'00010001'                 



;---------------------------------------------------------------------------------


;---------------------------------------------------------------------------------		



        END                       ; directive 'end of program'


Alltså, i den del jag kallar "setup" så rensas STEP_COUNTER.

Kod: Markera allt

		BANKSEL	STEP_COUNTER
		CLRF	STEP_COUNTER
Sedan där jag ropar på tabellen så laddas W med värdet i STEP_CONTER.

Kod: Markera allt

		BANKSEL	STEP_COUNTER
		MOVFW	STEP_COUNTER		;Kolla vilken "steg" vi är på
		CALL	rulla_bitar
Sedan fins det en "if sats" som kollar så att STEP_COUNTER inte blir större än tabellen och om den är det så hoppar den tillbak till noll.

Kod: Markera allt

		MOVLW	.8					;KOlla om vi är vid det sista "steget"
		BSF		STATUS,C
		SUBWF	STEP_COUNTER, 0		;Ta bort antalet steg från Step_Counter
		BTFSC	STATUS,C			;Blev det noll, alltså sista steget.
		CLRF	STEP_COUNTER		;Rensa Step_Counter så att vi börjar om från början


Sodjan: Jo jag har letat och läst, just den där så hade trådskaparen använt sig av C vilket jag inte begriper ett skvatt av så den hoppade jag över. Trots att problemet kanske är samma känns det för mig svårt att tolka då jag inte förstår det språket. Har läst andra dock men ingen som har hjälp mig.

MVH Peter

EDIT: När jag får error meddelandet så har koden inte enns hunnit ropa på tabellen. Alltså det är innan man kommer dit.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av sodjan »

OK.
Jag kan ladda koden och testa när jag hinner...

> EDIT: När jag får error meddelandet så har koden inte enns hunnit ropa på tabellen.

Du har alltså en breakpoint på "CALL rulla_bitar" ?
D.v.s så att du är *helt* säkert på det ?
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av PopUnoNkoK »

Näe, jag har en BreakPoint på första raden i ISRen, och call Rulla_bitarna är långt ner i ISRen. Alltså, breakpointen är långt före anropet på rulla bitarna.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av sodjan »

OK, ja det bör ju ha samma effekt...

Du kan ju lägga in någon kod på en hög adress som
aldrig anropas från den ordinare koden. Och sedan
sätter du en breakpoint *där*...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av sodjan »

Har du läst "2.3.1 COMPUTED GOTO" ? Du kan även gärna kolla AN556 :
http://ww1.microchip.com/downloads/en/A ... 00556e.pdf
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av PopUnoNkoK »

Nu har jag tagit mig tid att läsa dina tips Sodjan.

Det känns defenitivt som om det är där problemet ligger.

Den delen i AN556 där det pratas om den höga delen av Programcountern verkar inte vara nåt problem i detta fall eftersom 12f629an inte har fler än 1024k ord i programminnet.

Jag ska absolut inte säga att jag förstår riktigt allt som står i AN556 men jag skulle vilja kolla i vilka olika "Pages" som mina olika delar kod ligget. Så frågan är, vart kollar jag vart kompilatorn "lägger" de olika delarna? (Är inte säker på att jag skriver heöt rätt nu men det är så jag har fattat det).

Alltså CALL instruktionen kommer ju från ISRen och tabellen ligger juh på ett annat ställe. Frågan är om de är i samma Pages.

Det är i alla fall det första jag skulle vilja kolla up. För att sedan kunna testa att använda ORG "Kommandot" i MpLab för att få dem till samma Page.

MVH Peter
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av sodjan »

Nej, CALL är inget problem!
Det är ADDWF PCL,1 som eventuellt är problemet.

ADD hanterar bara 8 bitar (256 bytes "block"), och om man
inte ser till att tabellen hamnar inom samma 256 bytes block
så har man problem. Enklast är att lägga till en extra CODE med
en fast adress direkt före "rulla_bitar" så att tabellen inte delas...

T.ex tabellen i början på fjärde 256 bytes delen av minnet:

Kod: Markera allt

;---------------------------------------------------------------------------------

table_section  CODE      0x0300               ; tables on start of 256 byte block

rulla_bitar
            ADDWF PCL,1                       ; Hoppa till rätt "Steg" med värdet i w.
            RETLW b'00000001'                 ;Halvsteg     
            RETLW b'00000011'
            RETLW b'00000010'
            RETLW b'00000110'
            RETLW b'00000100'               
            RETLW b'00010100'
            RETLW b'00010000'
            RETLW b'00010001'                 
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av sodjan »

> Alltså CALL instruktionen kommer ju från ISRen och tabellen ligger juh på ett annat ställe. Frågan är om de är i samma Pages.

Ja, eftersom en 12F629 har 1 K words så har den bara en page (en *halv* page, för att vara exakt).
En page på en "midrange" PIC är alltid 2 K word.

> För att sedan kunna testa att använda ORG "Kommandot" i MpLab för att få dem till samma Page.

ORG används inte i "relocatable mode", använd CODE.
Och det kallas direktiv/directive. Rätt namn på saker och ting underlättar. :-)
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av PopUnoNkoK »

Ok, Call instruktionen är inte problemet. Det är jag med på nu åxå, För det är en vanlig CALL till ett annat ställe, helt fristående från den del där jag "manipulerar" programcountern. (ADDWF PCL).

Din lösning med CODE är precis den jag ville prova när jag skrev ORG, dock hade jag inte koll på att det var CODE man skulle använda i relocatable mode, skrev ORG pga att det stod så i exemplen i AN556.

Tyvärr så blev det ingen skillnad när jag la till raden:

Kod: Markera allt

table_section  CODE      0x0300 
Och då har jag tyvärr ingen ide om vad jag ska testa nu.


Sodjan skrev:Och det kallas direktiv/directive. Rätt namn på saker och ting underlättar.
Jo, jag håller med till fullo. Jag är glad att jag lyckades skilja det från processorns instruktioner. :)
Jag ska försöka komma ihåg det som att det är ett direktiv till kompilatorn. (Visst är det så man ska se det?) :?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av sodjan »

Visst är det så, det styr hur MPASM fungerar. Ibland skapar det ett eller
flera kommandon (som direktivet BANKSEL som skapar BCF/BSF kommnandon)
men ibland ställer det bara om någonting som inte skapar några komando direkt.

Men OK, det hjälpte alltså inte.

Har du testat det där andra jag föreslog? Att skapa en liten kodsnutt
på slutet av minnet som man kan sätta en breakpoint på får att kolla
hur det ser ut när/om den hamnar där och kolla STEP_COUNTER o.s.v.

Jag skulle prova att ändra så att rulla_bitar anropas med olika hårdkodade
värden för att se om det alls har något med det att göra.

*Något* får koden att skena iväg efter den riktiga koden och när
programräknaren "slår runt" så larmar MPSIM.

> INT_VAR UDATA_SHR 0x20

Ta bort "0x20" där, det gör ingen nytta och förtar meningen med automatiskt
allokering av minne. UDATA_SHR används för att allokera minne i "shared bank".
Nu så är 12F675/629 lite speciella eftersom allt minne är "shared". Det betyder
också att man aldrig behöver BANKSEL för vanliga variabler i minnet. Så alla
BANKSEL före TMRO_EXTRA och STEP_COUNTER kan tas bort.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av bearing »

Finns det möjlighet att se stacken i simulatorn?
i så fall kan man se vad de senaste anropen varit fram till "krashen".

Jag tycker också att du ska testa med att lägga kod i slutet av FLASH, gärna en loop, för då kommer felet synas även när du kör programmet i kretsen.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: "Halted due to PC incrementing" - Error, PIC 12f629

Inlägg av bearing »

Den här raden orsakar felmeddelandet i simulatorn

Kod: Markera allt

CALL    0x3FF
Skriv svar