|
|
View previous topic :: View next topic |
Author |
Message |
dgoldman
Joined: 24 Aug 2010 Posts: 7
|
What is this default interrupt handler? |
Posted: Tue Dec 21, 2010 9:40 am |
|
|
My 18F452 code has no interrupt service routines for this project. I transitioned from PCH 3.218 to 4.114. On v3, the interrupt vectors were left NOPs. In v4, I get code there (see below). The reset vector looks ok but the other stuff is new. It is a high priority ISR, yes?
It reads like an ISR to wait for the USART transmit buffer to empty before returning. The thing is that I enable no interrupts in my code. This shouldn't ever be call-able. No? Should have no effect if I don't enable interrupts. So why is the compiler adding it for me?
Anyone got a clue what this is? Having serial port issues and I suspect this is related.
Code: | Line Address Opcode Label Disassembly
1 0000 EFF3 GOTO @cinit
2 0002 F02F NOP
3 0004 FFFF NOP
4 0006 FFFF NOP
5 0008 A89E @PUTCHARI_BIU_1 BTFSS PIR1, 0x4, ACCESS
6 000A D7FE BRA @PUTCHARI_BIU_1
7 000C 6EAD MOVWF TXREG, ACCESS
8 000E 0C00 RETLW 0
9 0010 FFFF NOP |
Thank you!
Last edited by dgoldman on Tue Dec 21, 2010 10:08 am; edited 1 time in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Tue Dec 21, 2010 10:07 am |
|
|
The forum won't strip CR/LF, if you use the 'code' tags.
Not an interrupt handler. Just one of the standard 'service' routines.
The 08 address, is the location for a high priority handler _if priorities are enabled_, or for the low priority handler, in all other cases where interrupts are enabled. If interrupts are not used, it is just an 'ordinary' area of memory. the compiler is just using it since it is not otherwise needed.
Looks like putc.
Slightly surprised by your comment that the compiler doesn't put anything there in your older version. Have not got anything that old easily 'to hand', but tried a simple routine in 3.226, and 3.249, and both put the delay timing code starting at address 4. If you are looking in the .LST file, remember that internal code _won't_ be shown, unless you remove the 'nolist' option from the processor's .h file.
On your problems upgrading, classic difficulty is with pointers if used, since V4 switches to 'normal' C syntax, and increments a pointer by the size of the object it addresses, while V3, increments them by 1. This causes a lot of pointer code to stop working.....
Best Wishes |
|
|
dgoldman
Joined: 24 Aug 2010 Posts: 7
|
Thanks |
Posted: Tue Dec 21, 2010 10:18 am |
|
|
Just figured out the code quoting thing just before reading your reply. Thanks anyway. Yes, it does look like a putc() and the label would agree. Good insight. Still makes no sense why it isn't added on my old compiler.
I got this code segment by compiling and viewing program memory in MPLAB IDE. It is repeatable that v3.218 fills in the reset vector but leaves the ISR areas NOP. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19538
|
|
Posted: Tue Dec 21, 2010 11:12 am |
|
|
Have just compiled a basic program on 3.191, and 3.226 (the nearest versions I have archived to 3.218), and both are writing code over the INT areas.
The only reason they won't, is if they see an interrupt handler defined. Stick a #int_global definition in, even if no interrupts are used, and the area becomes reserved.
Code: |
#include <18F452.h>
#device adc=8
#FUSES NOWDT, WDT128, HS, NOPROTECT, NOOSCSEN, NOBROWNOUT, BORV20, NOPUT, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
#int_global
void dummy(void) {
delay_cycles(1);
}
void main() {
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
putc('T');
while (TRUE);
}
//
|
Gives the area with NOP's.
Remove the int_global definition, and the main code starts at address 4.....
Best Wishes |
|
|
dgoldman
Joined: 24 Aug 2010 Posts: 7
|
|
Posted: Tue Dec 21, 2010 3:25 pm |
|
|
Thanks for the insight. I got my bootloaders working (or so it seems).
The problem is that despite my #orgs in my code, the linker put the putc up near the top of memory. This is new behavior. I still don't know why it shows up there.
The solution was to assure my #org covers ALL memory I want reserved, not just the area right above where I want to go. This forces the putc() to go with the rest. Being bootloaders, the code then is in my designated areas and not overwritten by the second bootloader or the main code.
All is good in the world, it only took me a little head bashing to do the right thing. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|