|
|
View previous topic :: View next topic |
Author |
Message |
vinniewryan
Joined: 29 Jul 2009 Posts: 154 Location: at work
|
12f508, INTRC problem |
Posted: Fri Sep 10, 2010 7:08 pm |
|
|
I'm using the 12F508 to send serial data, but I'm having a strange problem. The chip only functions when I connect a resistor from GP5 to V+, and depending on the ohms of the resistor, it changes my clock frequency. I need to use all 6 I/O pins of this chip so I'm trying to figure out why it only functions when I connect that resistor. It shouldn't require any external components to work. If there's no resistor, the chip does absolutely nothing. As soon as I connect the resistor, it functions just fine.
Compiler 4.033
Code: | #include "12f508.h"
#use delay(clock=4000000)
#Fuses LP,INTRC,NOWDT,NOPROTECT,NOMCLR
#use RS232(BAUD=9600,FORCE_SW,XMIT=pin_B4)
void main()
{
while(1)
{
if(input(pin_B2))
{
output_high(pin_B0);
putc(123);
}
else
{
output_low(pin_B0);
}
}
} |
Any ideas? _________________ Vinnie Ryan |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Sep 10, 2010 8:23 pm |
|
|
Quote: | #Fuses LP,INTRC,NOWDT,NOPROTECT,NOMCLR |
You have two oscillator fuses. Use only one. |
|
|
vinniewryan
Joined: 29 Jul 2009 Posts: 154 Location: at work
|
|
Posted: Fri Sep 10, 2010 9:29 pm |
|
|
oops that was a last minute mistake, forget the LP it's not supposed to be there, and it wasn't there when I did my testing. _________________ Vinnie Ryan |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Sep 10, 2010 11:54 pm |
|
|
Quote: |
The chip only functions when I connect a resistor from GP5 to V+, and
depending on the ohms of the resistor, it changes my clock frequency. |
The thing that most closely fits your description would be that you don't
have the PIC's Vdd pin connected directly to power. It's just floating.
Therefore, the pullup resistor on the GP5 i/o pin is supplying current
through the upper protection diode on that pin. As you change the
resistor value, you vary the (slight) amount of current, and you change
the operating voltage of the PIC, which then changes the frequency
of the internal oscillator.
Secondary possibilities are that the PIC is not really being programmed in
INTRC mode, and it's actually running in external RC oscillator mode.
This could possibly explain the symptoms. A final possibility is that you
clobbered the OSCCAL value at the end of ROM, and this is causing
strange problems.
My bet is on the first one. Vdd is floating. |
|
|
vinniewryan
Joined: 29 Jul 2009 Posts: 154 Location: at work
|
|
Posted: Sun Sep 12, 2010 9:30 pm |
|
|
PCM,
Here's my schematic.
I made sure my connections are correct, VDD is receiving 3.0V, all connections have been tested. In the schematic above, all (open) pins have been programmed as RS232 TX, but no matter which pin I use as TX, the problem persists. As soon as I connect a resistor from B5 to V+, the chip begins working properly, but again - depending on the resistor value, the oscillator changes frequency.
As for your other suggestions, I'm not quite sure how to check if the pic is being programmed in INTRC mode. I'm using the ICD-U64 programmer.
To be 100% correct, this is the program I'm running on the PIC:
Code: |
#include "12f508.h"
#Fuses INTRC,NOWDT,NOPROTECT,NOMCLR
#use delay(clock=4000000)
#use RS232(BAUD=9600,FORCE_SW,XMIT=pin_BX) //all pins have been tried
void main()
{
while(1)
{
//Setup_Timer_0(0); //tried with and without
if(input(pin_B2))
{
output_high(pin_B0); //LED
putc(123);
}
else
{
output_low(pin_B0); //LED
}
}
}
|
I'm using the 8 pin package, so I only have 6 I/O pins, and in the data sheet the pins are listed as GP0, GP1, GP2.. ~ GP5. In the compiler, they're listed as B0-B5. _________________ Vinnie Ryan |
|
|
vinniewryan
Joined: 29 Jul 2009 Posts: 154 Location: at work
|
|
Posted: Sun Sep 12, 2010 10:25 pm |
|
|
I did a little more testing, I tried the code above using LP, XT, RC, INTRC, and even not declaring an OSC fuse, and no matter what config I use, I have the exact same result. 10K resistor from B5 to 3V+ it functions, no resistor, no function.
Is there some way to manually set the osc fuse? It seems it's not being set so it's defaulting to RC, in the header file for the 12f508 it lists the osc calibration address as 05.
Thanks! _________________ Vinnie Ryan |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19518
|
|
Posted: Mon Sep 13, 2010 1:58 am |
|
|
Seriously, get rid of R1, and put a series resistor in line with the LED. You may well be getting a version of the RMW problem, overloading the B0 output. As such this could be resulting on almost anything happening, so fix this first.
Best Wishes |
|
|
vinniewryan
Joined: 29 Jul 2009 Posts: 154 Location: at work
|
|
Posted: Mon Sep 13, 2010 2:46 am |
|
|
I removed R1 and tried it with a series resistor of 1K, same problem. Then I tried removing the LED and resistor and left B0 floating, same. Then I tried re-programming it to not even output on the B0 pin, but that didn't change anything either. _________________ Vinnie Ryan |
|
|
vinniewryan
Joined: 29 Jul 2009 Posts: 154 Location: at work
|
|
Posted: Mon Sep 13, 2010 3:03 pm |
|
|
After a firmware and compiler update, the problem seems to be corrected. Thank you all for the help! _________________ Vinnie Ryan |
|
|
|
|
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
|