how to remap interrupt vector - pic18f4550
hi
can any one tell me how to remap interrupt vector in pbp or assembly? i have written a bootloader which loads new firmware with help of external eeprom. when interrupt occurs in the new firmware it then jumps to bootloader interrupt vector and gets hang/reset. to solve this problem i need to remap interrupt vector in my bootloader
please help me
thank you
Re: how to remap interrupt vector - pic18f4550
It depends what you mean by "remap".
If you are writing a bootloader, it is likely that you will have to deal with a variety of devices, so you will have only one interrupt level. When a PIC gets an interrupt, it jumps to location 0x08. Put a jump to whatever you want in that location.
Re: how to remap interrupt vector - pic18f4550
Quote:
Originally Posted by
Charles Linquis
It depends what you mean by "remap".
If you are writing a bootloader, it is likely that you will have to deal with a variety of devices, so you will have only one interrupt level. When a PIC gets an interrupt, it jumps to location 0x08. Put a jump to whatever you want in that location.
thanks for your reply.
but how to put jump instruction at 0x0008? i tried using this asm code but i got error "overwriting previous address content"
Code:
asm
org 0x0008
goto 0x2008
endasm
also if i am putting jump at 0x0008 then if in bootloader interrupts (usb rx interrupts) occur then it will also jump to 0x0008 and then to 0x2008?
thanks
Re: how to remap interrupt vector - pic18f4550
It would appear that you already have an INT assigned. As a result, there is something in that location already and you are over-writing it.
ALL high priority interrupts go to 0x08. You are responsible for deciding what generated the interrupt by reading PIR(x.x and others) and doing the correct things.
Re: how to remap interrupt vector - pic18f4550
Hi Charles,
i created this simple program and tried to run but it didn't worked. it should blink led and remap high priority interrupt vector
Quote:
adcon1 = 15
DEFINE OSC 48
asm
org 0x0008
goto 0x2008
endasm
i var byte
j var byte
main:
high porta.0
for i = 0 to 254
for j = 0 to 254
high porta.0
next j
next i
for i = 0 to 254
for j = 0 to 254
low porta.0
next j
next i
goto main
but if i comment out the goto 0x2008 line it starts to blink led. since i am not using any interrupt then why its not blinking led?
can you please help me
thank you
Re: how to remap interrupt vector - pic18f4550
I hope there is more to your program that you show. The PIC jumps to the interrupt vector location (0x08) when some peripheral (timer, serial port, etc) generates an interrupt, at which time the program counter gets reset to 0x08.
Just use Darrel's Instant Interrupts.
Re: how to remap interrupt vector - pic18f4550
I should add that the program counter jumps to 0x08 whenever both the a particular interrupt ENABLE and interrupt FLAG are both set. The program counter won't
jump around location 0x08 unless you tell it to. So at location 0x00, you need a jump to a location AFTER 0x08
I currently use a technique where I get data in an RS-232 input buffer at 230Kbaud, and the data must not be blocked (must be able to receive at all times), and the data must be processed
and a response given very quickly. Receiving the data in an ISR was no trouble, but processing and responding inside that ISR would block the next bytes, if they came immediately
after the first.
Processing and sending the data in the main loop (which was long), didn't work either because that would sometimes delay the response by up to .5 sec.
So, I set up the RX_INT as high priority, and just before the INT_RETURN, I set the TMR3 interrupt flag. But I don't have Timer3 running! Timer 3 interrupt is turned on, but is low priority.
The Timer 3 ISR jumps to the "process and send" routine".
If a packet comes in (I'm using an Ethernet to RS-232 converter, and I don't have flow control connected), it always gets captured. As soon as the packet is received, it triggers
the "process and send" routine. If another packet comes in immediately, the recieve ISR is entered again, since it is at a higher priority. Pointers insure that new data doesn't over-write old data.
Now the latency is 4-7 mSec, since it doesn't have to wait for the main loop to complete.