Steve, but
1)INTHAND is not a variable, in fact it is mentioned in the statement2)What is the basic purpose of loading value in PCLATHCode:define INTHAND _ISR
cheers
Steve, but
1)INTHAND is not a variable, in fact it is mentioned in the statement2)What is the basic purpose of loading value in PCLATHCode:define INTHAND _ISR
cheers
Yes, you are right. But I didn't say it was a variable.
The PCLATH is used (along with PCLATU) to make changes to the Program Counter, which is akin to directing the the program to a new location in the code: a "Computed GOTO."2)What is the basic purpose of loading value in PCLATH
I am confused, you saidWhere is the constant here?Shift the constant (literal) 8 bits right (equivalent to dividing by 256) then put the value in WREG
I really suck at assembly programming but I'm going to say (write) what I think, then hopefully someone will correct me if I'm wrong.
The constant in this case is called INTHAND which is defined to contain the adress, in program memory, where the routine _ISR is located. What happens is that PCLATH (the high byte of the program counter) gets loaded with the 8 high bits of the adress of _ISR. I suspect there's also code to take the low 8 bits and put them in PCLATU. All in all, that would cause the program to jump to _ISR.
After reading SteveB's other posts that's my understanding of it but again I might very well be wrong.
/Henrik.
Ok it has started making sense now. But 1 weird thought is there still, this line itself is part of the ISR routine, then what do you mean byAll in all, that would cause the program to jump to_ISR.
In PBP, the label "ISR" will be annotated in assembly as "_ISR" as a literal (i.e. constant). It represents the address of the first instruction following the label in PBP. The address is a 21 bit address. The bottom 8 bits (low byte, bits 0-7) are directly readable/writeable. The high byte (bits 8-15) and upper byte (bits 16-20) can only be read/written through the registers PCLATH and PCLATU respectively
So... You will likely see something like this as well:
movlw ((INTHAND) >> 16)
movwf PCLATU
movlw INTHAND
movwf PCL
When PCL is written to, the contents of PCLATH and PCLATU are written to the Program Counter along with the value to the PCL. This will cause the instruction found at that address to be the next instruction executed.
One other thing. Since INTHAND is a constant, ((INTHAND) >> 16) and ((INTHAND) >> 8) will be evaluated when the program is compiled. So, the actual assembly will only see an 8 bit value.
Last edited by SteveB; - 14th June 2012 at 18:14. Reason: typos, clarification
Thanks for all the replies. Though I somewhat understood what you have said above.
I just to finally confirm what you have advised still applies as the following is the whole context saving code for PIC 16F676:
There is no PCL related statement in the context saving. Correct me if I am wrong, does INTHAND has address 4 stored in it?Code:define INTHAND _ISR ' The main program starts here goto main ISR: asm movwf wsave ; Save WREG swapf STATUS, W clrf STATUS ; Point to bank 0 movwf ssave ; Save STATUS movf FSR,w movwf fsave ; save FSR movf PCLATH, W ; Save PCLATH movwf psave ; No problems in understanding up to here ; get ready to jump within the ISR page movlw ((INTHAND) >> 8) ; Set PCLATH for jump movwf PCLATH
Bookmarks