View previous topic :: View next topic |
Author |
Message |
Angus Guest
|
Even more obscure PCM compiler behaviour! |
Posted: Fri Jan 30, 2009 7:49 am |
|
|
Hi all (again)
I am now tearing out what little hair I have left on this strange problem with the PCM compiler (Version 4.013), compiling code for a PIC16F876A. The section in question is below; the line marked 'This runs once' only runs once during execution, but the line marked 'This runs twice', quite obviously, is executed twice! I cannot see how the PIC can possibly run the end of a function twice, but the start only once (which is correct; this function is only called a single time), unless something funky is happening with the program counter. Can anyone shed some light on this? Please?
Code: |
tone(down); // This code runs once!
DS1337_set_datetime(&dt);
putc(0xCC);
get_bst_data(&dt);
current_state = asleep;
uart_power(off);
tone(up); // This runs twice!
|
Any suggestions incredibly gratefully received!
Angus |
|
|
Angus Guest
|
Re: Even more obscure PCM compiler behaviour! |
Posted: Fri Jan 30, 2009 7:58 am |
|
|
OK, quick update!
I have tried commenting out each of the 3 function calls in between these 2 points in the code in turn. When any single function is commented out the code still does not run correctly (with the repeated call to tone(up)) but with all 3 commented out, it does run correctly. Go figure.
The code is pretty big (it uses almost 75% ROM) which is why I haven't posted a full listing. Am happy to if that helps with diagnosis!
Hairline is still receding nicely.
Angus |
|
|
Ttelmah Guest
|
|
Posted: Fri Jan 30, 2009 8:15 am |
|
|
Look at the sticky thread at the top of this forum about V4.
I'm afraid, that 4.013, is _not_ a working compiler.
Best Wishes |
|
|
Angus Guest
|
|
Posted: Fri Jan 30, 2009 8:33 am |
|
|
My apologies; I had not read this thread. Thanks for pointing it out!
Ttelmah wrote: | Look at the sticky thread at the top of this forum about V4.
I'm afraid, that 4.013, is _not_ a working compiler.
Best Wishes |
|
|
|
Angus Guest
|
|
Posted: Fri Jan 30, 2009 10:20 am |
|
|
OK, further update! I am now using version 4.085 of the compiler. Unfortunately I still have the same problem. I am now incredibly desperate to find a solution to this as it is a work project that is going to be demo'ed on Monday!
A prize in the post to the person who can find a solution! (Honestly, I'm not joking!) |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jan 30, 2009 11:10 am |
|
|
Post a short test program. Here's an example. Post as little code as
possible, while still putting in enough code to demonstrate the problem.
From your code, it looks like you're probably doing something with the
PIC's "sleep" mode. Maybe you've got a problem with waking it up.
Post a short program (don't post 100 lines). It must be compilable
without errors.
Code: |
#include <16F876A.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
//======================================
void main()
{
printf("Hello World\n\r");
while(1);
} |
Post something similar to this, except that it incorporates your code. |
|
|
John P
Joined: 17 Sep 2003 Posts: 331
|
|
Posted: Fri Jan 30, 2009 12:54 pm |
|
|
Examine the LST file. You don't need to be fluent in assembly language to get an idea of what's happening, and it probably isn't going to be very much code anyway. Does any function leave the processor in a wacky state which will affect subsequent operation?
Try substituting one function for another. If executing the same code more than once won't cause failure, try the effect of running the same function five times instead of five different ones. Is the problem the result of just executing any function, or does it have to be a particular one? |
|
|
Angus Guest
|
|
Posted: Sat Jan 31, 2009 8:01 am |
|
|
Well firstly, thanks for the replies so far. I am in the middle of examining the LST file now, though the code is 1320 lines long so it's taking a while!
However, I have temporarily solved the problem by removing a fairly large block of code from the main() function (thankfully a non-essential bit), that was only run once at startup. The code consisted of several printf statements so presumably would have taked up quite a bit of ROM. The code is not related to the faulty area but removing it has fixed the problem.
It seems to my (unscientific) mind that as soon as CCS' code goes over a certrain point in size, strange things start to happen. Has anyone else had similar faults when compiling programs over approx. 6000 bytes of ROM?
Again, thanks for the replies so far; I am in the process of trying all your suggestions!
Angus 'almost bald' Thomson |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sat Jan 31, 2009 9:20 am |
|
|
To add another suggestion, I would always use a debugger to trace program execution and itentify the cause of unexpected behaviour. |
|
|
|