View previous topic :: View next topic |
Author |
Message |
lukyluke
Joined: 18 Feb 2011 Posts: 7
|
Strange compilation problem |
Posted: Fri Feb 18, 2011 1:32 pm |
|
|
Hello!
I'm working on a very simple project with a 12F629 but I'm stuck in a problem I can't understand...
C Code:
Code: | #include "C:\ServoDecoder_PIC\servodecoder.h"
void main() {
while(1) {
output_bit(PIN_A0, !input(PIN_A0));
delay_ms(500);
}
} |
H Code:
Code: | #include <12F629.h>
#use delay(clock=4000000)
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES BANDGAP_HIGH |
When I compile, here's the ASM:
Code: | 0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 004
0003: NOP
0004: CALL 3FF |
As you can see, it calls the last (3FF) address of program memory and stops... do you see any mistakes in my H file?
If I remove #FUSES declarations, the assembly is ok:
Code: | 0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 018
0003: NOP
.................... void main() {
0018: CLRF 04 |
Thanks! |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Feb 18, 2011 1:41 pm |
|
|
What's your compiler version ? |
|
![](templates/subSilver/images/spacer.gif) |
lukyluke
Joined: 18 Feb 2011 Posts: 7
|
|
Posted: Fri Feb 18, 2011 1:44 pm |
|
|
Hello
4.057, with a further investigation it seems INTRC_IO is the problem, if I change to XT (for example) the ASM generated is correct... |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Feb 18, 2011 1:57 pm |
|
|
It works for me. I installed vs. 4.057, and took your code and pasted it
into an MPLAB project as one program (no separate servodecoder.h file).
The .LST file doesn't stop at 0004.
Code: |
CCS PCM C Compiler, Version 4.057, xxxxx 18-Feb-11 11:55
Filename: 12F629_Test.lst
ROM used: 55 words (5%)
Largest free fragment is 969
RAM used: 6 (9%) at main() level
7 (11%) worst case
Stack: 1 locations
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 004
0003: NOP
0004: CALL 3FF
0005: BSF 03.5
0006: MOVWF 10
0007: MOVLW 00
0008: MOVWF 0A
0009: GOTO 01E
|
Code: |
#include <12F629.h>
#use delay(clock=4000000)
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES BANDGAP_HIGH
void main() {
while(1) {
output_bit(PIN_A0, !input(PIN_A0));
delay_ms(500);
}
} |
|
|
![](templates/subSilver/images/spacer.gif) |
lukyluke
Joined: 18 Feb 2011 Posts: 7
|
|
Posted: Fri Feb 18, 2011 2:03 pm |
|
|
thanks for your support... very strange I've just copy&paste your source code in my C file, and here's the result:
Code: | CCS PCM C Compiler, Version 4.057, xxxxx 18-feb-11 21.01
Filename: C:\ServoDecoder_PIC\servodecoder.lst
ROM used: 55 words (5%)
Largest free fragment is 969
RAM used: 6 (9%) at main() level
7 (11%) worst case
Stack: 1 locations
*
0000: MOVLW 00
0001: MOVWF 0A
0002: GOTO 004
0003: NOP
0004: CALL 3FF
0 |
|
|
![](templates/subSilver/images/spacer.gif) |
lukyluke
Joined: 18 Feb 2011 Posts: 7
|
|
Posted: Fri Feb 18, 2011 2:11 pm |
|
|
mmm maybe I wasn't clear in my explanation: my ASM source doesn't stop at 0004, but the instruction at that address make a CALL to the last memory address (CALL 3FF) and the program stops (with a simulator or with a "real" circuit the led doesn't blink) |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19375
|
|
Posted: Fri Feb 18, 2011 3:44 pm |
|
|
And to explain 'why'. The chip's come from the factory, with a single instruction at address 0x3FF, 'preprogrammed' by the manufacturer. The instruction is a RETLW, returning a value designed to calibrate the internal oscillator. This is called the 'OSCCAL' (oscillator calibration) value.
Yours has had this value erased.
The thread PCM programmer points you to, shows how to put a 'mid range' value back into this location, but understand that the calibration will have been lost, so frequencies won't be that good.
For 'future reference', look into your programmer settings. there should be an option to 'save OSCCAL', or 'preserve calibration', and you need to select this, otherwise you will do the same to the next chip you try....
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
lukyluke
Joined: 18 Feb 2011 Posts: 7
|
|
Posted: Sat Feb 19, 2011 4:55 am |
|
|
Friends,
Thanks for your suggestion and the explanation (very interesting, I never investigated about the OSCCAL feature): it worked fine and I was able to find - in my software - the flag to preserve the value at 0x3FF address when programming my HEX. |
|
![](templates/subSilver/images/spacer.gif) |
|