Sida 1 av 1
PCL och PCLATCH (PIC)
Postat: 1 mars 2006, 17:00:32
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?
Postat: 1 mars 2006, 17:06:13
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...
Postat: 1 mars 2006, 17:11:36
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?
Postat: 1 mars 2006, 17:23:46
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...
Postat: 1 mars 2006, 19:52:09
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.