View previous topic :: View next topic |
Author |
Message |
dima2882
Joined: 13 Jul 2005 Posts: 25 Location: Maryland
|
PCD: Problem calling functions inside infinite loop |
Posted: Sun Mar 21, 2010 4:59 pm |
|
|
I'm hoping this is something silly, 'cause I'm stumped. I'm using 4.099, have the following test project:
Code: |
#include <24F04KA200.h>
// Do some configuration
#fuses NOPROTECT, FRC, OSCIO, NOWDT, NOBROWNOUT, NOMCLR, NODSBOR, NODSWDT, NOWRT, NOWINDIS, NOPUT
#use delay(internal=8MHz)
#use fast_io(ALL)
// Function prototypes
void doDelay(void);
// Function does nothing
void doDelay(void)
{
output_low(PIN_B9);
output_low(PIN_B15);
output_low(PIN_A6);
delay_us(20);
output_high(PIN_B9);
output_high(PIN_B15);
output_high(PIN_A6);
delay_us(20);
return;
}
void main() {
// Disable all analog pins as they are unneccessary for this application
setup_adc_ports(NO_ANALOGS);
// Set up the I/O lines
set_tris_a(0x32);
set_tris_b(0x4000);
//output_high(PIN_B9);
//output_high(PIN_B15);
//output_high(PIN_A6);
do {
doDelay();
output_low(PIN_B9);
output_low(PIN_B15);
output_low(PIN_A6);
delay_us(20);
output_high(PIN_B9);
output_high(PIN_B15);
output_high(PIN_A6);
delay_us(20);
} while (TRUE);
return;
}
|
When the doDelay function is commented out of the do-while loop, things work fine, I see a square wave on the three output pins. When I leave it in, like above, nothing works - the lines stay low. What could be the problem?
Some more weirdness: if I uncomment the code that sets the three lines high BEFORE going into the infinite do-while, then what I see on the scope is almost a square wave with a very high duty cycle... It's as if the MCU reboots continuously, causing the lines to go low momentarily. |
|
|
dima2882
Joined: 13 Jul 2005 Posts: 25 Location: Maryland
|
|
Posted: Mon Mar 22, 2010 9:19 am |
|
|
Anybody? Bueller?
Plz, I really got to have this app working! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Mar 22, 2010 12:56 pm |
|
|
There are only a couple people on this forum that normally answer PCD
questions. If they're not on here, you won't get a quick reply.
I don't have the PCD compiler, but the first thing I would do is to reduce
the program size.
1. Functions automatically return. You don't need a 'return' statement
at the end, unless the function is declared to return a value, and yours
don't. Remove the returns. Also, there is no Operating System for
main() to return to. Just put a continuous while(1) loop at the end of
main() or in your program. Delete the 'return'.
2. Get rid of #fast_io mode and the set_tris_x() statements, and let
the compiler set the TRIS.
3. Just toggle one pin, for example, Pin B9. See what happens. |
|
|
dima2882
Joined: 13 Jul 2005 Posts: 25 Location: Maryland
|
|
Posted: Mon Mar 22, 2010 1:06 pm |
|
|
Do I need a #use standard_io statement for the port I want to use? That's now the way I changed it. Going to go try it now... |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Mar 22, 2010 1:16 pm |
|
|
Quote: |
Do I need a #use standard_io statement for the port I want to use? |
The PCD manual says:
Quote: |
Standard_io is the default I/O method for all ports.
|
So, you don't need one. |
|
|
dima2882
Joined: 13 Jul 2005 Posts: 25 Location: Maryland
|
|
Posted: Mon Mar 22, 2010 6:34 pm |
|
|
Reinstalled the compiler... Everything worked the way it is written in the listing of my original post. I guess something in Windows went to hell :( |
|
|
|