PCL och PCLATCH (PIC)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Perrx
Inlägg: 176
Blev medlem: 15 december 2003, 21:43:41
Ort: Göteborg
Kontakt:

PCL och PCLATCH (PIC)

Inlägg av Perrx »

Kod: Markera allt

	list		p=16f767		; list directive to define processor
	#include	<p16f767.inc>	; processor specific variable definitions

	
		org h'0000'
		nop
		nop
		goto Main

				
		
		
		org h'00FB'
Main	
            nop    ;FB
            nop    ;FC
            nop    ;FD
            nop    ;FE   
            nop    ;FF    
            nop    ;00    
            nop    ;01  
            nop            
            nop
	
inf		goto inf	
		
		END
När jag simulerar koden ovan i MPLAB så körs hela koden och programmet fastnar i inf-loopen, inget konstigt. Det som är konstigt är att när PCL går från FF till 00 så ändras inget register, inte ens PCLATCH. Om man däremot testar denna kod:

Kod: Markera allt

	list		p=16f767		; list directive to define processor
	#include	<p16f767.inc>	; processor specific variable definitions

	
		org h'0000'
		nop
		nop
		goto Main

				
		
		
		org h'00FB'
Main	
		MOVLW d'4'		;FB
;		INCF PCLATH		;FC
		ADDWF PCL,F		;FD
		nop				;FE
		nop				;FF
		nop				;00
		nop				;01
		nop				;...
		nop
		nop	
		nop
	
inf		goto inf	
		
		END
Nu kommer ju PCLen att "owerflowa" vilket resulterar i att programmet hoppar till 0000 (inte till 0100). Om man använder raden INCF PCLATCH så funkar allt som den ska.

Hur funkar det i det första fallet då PCLen går från 00FF till 0100 utan att ändra PCLATCH? En bugg i MPLAB?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

PCLATH används bara då en instruktion inte innehåller
en hel adress (t.ex GOTO, CALL och, som i ditt exemepl,
ADDWF PCL,F). Inte annars.

> En bugg i MPLAB?

Nej.

"INCF PCLATH" fungerar i ditt specificka fall, men är naturligtvis inte
ett genrellt sätt att hantera PCLATH...
Användarvisningsbild
Perrx
Inlägg: 176
Blev medlem: 15 december 2003, 21:43:41
Ort: Göteborg
Kontakt:

Inlägg av Perrx »

Men hur vet PICen vilken adress PCLen pekar på? Om den pekar på 00FF, 01FF eller 02FF, vart sparas 00, 01 och 02?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Du får läsa ditt datablad bättre !

PC (d.v.s "Program Counter") är *inte* 8 bitar !

PCL är bara de 8 lägsta bitarna av PC, d.v.s de du "fipplar" med via din ADDWF.

Men som sagt, detta är tydligt i databladet...
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Det fanns faktiskt en bugg i MPLAB V7.00 som gör att den hoppar till fel ställe i programmet i vissa fall när man använder PCLATH.

Jag uppgraderade från V7.00 till V7.11 och då var buggen borta.
Skriv svar