CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Simple circuit but something wrong?
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
GoldServe



Joined: 27 Jun 2005
Posts: 10

View user's profile Send private message

Simple circuit but something wrong?
PostPosted: Tue Jun 28, 2005 9:36 am     Reply with quote

Hi, I'm new to PIC programming but this circuit and program is too simple but it doesn't work. Below is the circuit I'm working with:



And code:

Code:

#include <12F675.h>
#device adc=8
#use delay(clock=4000000)
#fuses NOWDT,INTRC_IO, NOCPD, NOPROTECT, NOMCLR, PUT, BROWNOUT
#rom 0x3FF = {0x3480}

// Global Variables
int16 w_millisecond = 0;
boolean flag_done1000ms = FALSE;

#int_TIMER0
TIMER0_isr()
{
   if (++w_millisecond == 1000)
   {
       w_millisecond = 0;
       flag_done1000ms = true;
   }
}

void main()
{
   int8  led1 = 0;

   // Disable ADC and set digital ports
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);

   // Setup timer 0 - 1000000 / 4 / 256 = 1ms
   setup_counters(RTCC_INTERNAL,RTCC_DIV_4);
   setup_timer_1(T1_DISABLED);

   // Disable comparator and set digital ports
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // Enable interrupts
   clear_interrupt(INT_TIMER0);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);

   // Set all pins output and output to 0
   #use fast_io(a)
   set_tris_a(0x0a);   //GPIO3 as input, GPIO1 as input
   output_a(0x00);

   while(1)
   {

      if (flag_done1000ms)
      {
         flag_done1000ms = false;   // Clear second timer

         led1 = led1 ^ 1;

         output_bit(PIN_A2, led1);
         output_bit(PIN_A5, led1);
      }

   }  // End while(1)

}


The behaviour I am seeing is that after ~2-3sec, the votage and the output of the LDO drivers (TPS73601) goes to 3V as expected, but does not drop back down to 0V after 1sec as programmed.

The circuit simulates fine, with the output toggling ever 1 second but voltages aren't toggling.

The only other thing I can think of is that I'm programming the chip with everything connected but no power is supplied to the other components so it shouldn't affect anything right? The programmer says it is programming fine.

I'm soooooo lost so any help would be grateful! Thanks.


Last edited by GoldServe on Wed Jun 29, 2005 6:31 am; edited 3 times in total
rwyoung



Joined: 12 Nov 2003
Posts: 563
Location: Lawrence, KS USA

View user's profile Send private message Send e-mail

PostPosted: Tue Jun 28, 2005 3:45 pm     Reply with quote

May not fix your problem but you shouldn't need to manually clear the timer 0 interrupt. The CCS ISR exit code should do that for you. Check the LST file.
_________________
Rob Young
The Screw-Up Fairy may just visit you but he has crashed on my couch for the last month!
GoldServe



Joined: 27 Jun 2005
Posts: 10

View user's profile Send private message

PostPosted: Tue Jun 28, 2005 4:08 pm     Reply with quote

Thanks for any help you can give me. I simulated the circuit using a simulator and the pin is toggling every 1 second so that seems to work. The problem I might be having is something to do with the circuit hooked onto the PIC.

It should be very simple, driving the enable pin low to disable LDO and high to enable LDO.

?????
Ttelmah
Guest







PostPosted: Wed Jun 29, 2005 3:01 am     Reply with quote

First comment: Well done, on posting readable code!. Far better than most questioners. :-)
What are the components to the right of the PIC?. The top right pin is labelled apparently as some form of output, and is connecting back to a pin on the PIC that you have configured as an output. However also note that you have not specified #use fast_io for the PIC port, so the compiler will still be generating it's own TRIS control.
Remember that since you have set the pins as 'output', and the GPIO output register will be 'undefined' on boot up, the other pins may be high or low. Personally, if I was setting the TRIS register, I'd ensure that I set the output register to a 'known' state at the same point.
Realistically, it sounds as if there is a hardware fault of some sort in the circuit. What happens if you remove the PIC, and pull the lines up/down with a resistor?.

Best Wishes
asmallri



Joined: 12 Aug 2004
Posts: 1634
Location: Perth, Australia

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Wed Jun 29, 2005 5:44 am     Reply with quote

You are modifying a multibyte variable (w_millisecond++;) both inside and outside the interrupt handler. Similarly you are testing the same multibyte variable that is being modified by the interrupt handler. (Naughty naughty) There are a couple of ways around this problem. Disable the timer interrupt in the mainline before you test/modify w_millisecond++;

The other way to is use flags.

Code:

#int_TIMER0
TIMER0_isr()
{
   if (++w_millisecond == 1000)
       {
       w_millisecond = 0;
       flag_done1000ms = true;
       }
}

   // global variable
   boolean flag_done1000ms;


    // somewhere in the initialisation phase in main before enabling interrupts
   flag_done1000ms = false;

    .....

   while(1)
   {
      if (flag_done1000ms)
      {
         flag_done1000ms = false;   // Clear timer flag
         led1 = led1 ^ 1;
         output_bit(PIN_A5, led1);
      }

_________________
Regards, Andrew

http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!!


Last edited by asmallri on Wed Jun 29, 2005 6:10 am; edited 1 time in total
GoldServe



Joined: 27 Jun 2005
Posts: 10

View user's profile Send private message

PostPosted: Wed Jun 29, 2005 5:57 am     Reply with quote

Ttelmah wrote:
First comment: Well done, on posting readable code!. Far better than most questioners. :-)


Thanks!

Ttelmah wrote:
What are the components to the right of the PIC?. The top right pin is labelled apparently as some form of output, and is connecting back to a pin on the PIC that you have configured as an output.


The components are LDO regulators, TPS73601 and TPS73201. This isn't my circuit and I do wonder why the output is connected back to the pic. It doesn't make sense that the pic must know about the output state of the drivers right? I've configured the port as output so if i connect something to it, it shouldn't matter am I correct?

Ttelmah wrote:
However also note that you have not specified #use fast_io for the PIC port, so the compiler will still be generating it's own TRIS control.

Remember that since you have set the pins as 'output', and the GPIO output register will be 'undefined' on boot up, the other pins may be high or low. Personally, if I was setting the TRIS register, I'd ensure that I set the output register to a 'known' state at the same point.


Point taken, will modify the program to reflect that.


Ttelmah wrote:
Realistically, it sounds as if there is a hardware fault of some sort in the circuit. What happens if you remove the PIC, and pull the lines up/down with a resistor?.


I haven't gone down this route yet. I have on order a SMT soic8 to dip8 adapter coming. I can do further testing when it comes. Otherwise, I don't want to rip off the IC.

The circuit seems so simple yet it refuses to behave. I'll update the first post with the modified program.
Ttelmah
Guest







PostPosted: Wed Jun 29, 2005 7:12 am     Reply with quote

GoldServe wrote:
Ttelmah wrote:
First comment: Well done, on posting readable code!. Far better than most questioners. :-)


Thanks!

Ttelmah wrote:
What are the components to the right of the PIC?. The top right pin is labelled apparently as some form of output, and is connecting back to a pin on the PIC that you have configured as an output.


The components are LDO regulators, TPS73601 and TPS73201. This isn't my circuit and I do wonder why the output is connected back to the pic. It doesn't make sense that the pic must know about the output state of the drivers right? I've configured the port as output so if i connect something to it, it shouldn't matter am I correct?

Ttelmah wrote:
However also note that you have not specified #use fast_io for the PIC port, so the compiler will still be generating it's own TRIS control.

Remember that since you have set the pins as 'output', and the GPIO output register will be 'undefined' on boot up, the other pins may be high or low. Personally, if I was setting the TRIS register, I'd ensure that I set the output register to a 'known' state at the same point.


Point taken, will modify the program to reflect that.


Ttelmah wrote:
Realistically, it sounds as if there is a hardware fault of some sort in the circuit. What happens if you remove the PIC, and pull the lines up/down with a resistor?.


I haven't gone down this route yet. I have on order a SMT soic8 to dip8 adapter coming. I can do further testing when it comes. Otherwise, I don't want to rip off the IC.

The circuit seems so simple yet it refuses to behave. I'll update the first post with the modified program.



You have the first bit wrong. If something unknown is connected 'back' to a processor pin, that pin _must_ be configured as an _input_. As an output, it'll be trying to drive the signal either high or low, and if the regulator output is trying to drive it to a different voltage a relatively high current will be being drawn, possibly even shutting the circuit down. This is why the pins by default 'wake up' as inputs, since this is the 'safe' configuration...
Remove your 'TRIS' line completely. If you leave the processor in it's default state, it'll wake up with the pins as inputs. The compiler default will automatically change the pin you toggle to an 'output', as soon as you drive it, so this may well then work.

Best Wishes
GoldServe



Joined: 27 Jun 2005
Posts: 10

View user's profile Send private message

PostPosted: Wed Jun 29, 2005 9:25 am     Reply with quote

Thanks. That makes sense. I'll give it a try.

All I will do now is not use the directive #use_fastio and not set the trisio register. Just use the bits (output them high or low). That sounds correct right?
GoldServe



Joined: 27 Jun 2005
Posts: 10

View user's profile Send private message

PostPosted: Wed Jun 29, 2005 5:03 pm     Reply with quote

Can someone tell me why i'm getting a 3sec delay instead of a 1second delay using:

// Setup timer 0 - 1000000 / 4 / 256 = 1ms
setup_counters(RTCC_INTERNAL,RTCC_DIV_4);
setup_timer_1(T1_DISABLED);

Someone on another forum said I was getting this:

Quote:
Also note that your toggling frequency should be around 1000000/256/1000 -> 3.905Hz and not 1Hz as you are expecting ...
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Thu Jun 30, 2005 1:57 am     Reply with quote

GoldServe wrote:
Can someone tell me why i'm getting a 3sec delay instead of a 1second delay using:

// Setup timer 0 - 1000000 / 4 / 256 = 1ms
setup_counters(RTCC_INTERNAL,RTCC_DIV_4);
setup_timer_1(T1_DISABLED);

Someone on another forum said I was getting this:

Quote:
Also note that your toggling frequency should be around 1000000/256/1000 -> 3.905Hz and not 1Hz as you are expecting ...
Your timer0 should fire every 1ms as expected. My guess is the person in the other forum missed your RTCC_DIV_4 parameter.

How did you meassure your 3sec. delay? Please note that your led is toggled every second, so 1 second on and 1 second off, a total off 2 seconds for a complete period.
GoldServe



Joined: 27 Jun 2005
Posts: 10

View user's profile Send private message

PostPosted: Thu Jun 30, 2005 6:21 am     Reply with quote

How i'm measuring it is from the time I turn the PIC on, I count 3 seconds and the output from the LDO goes high to ~3V. When I count another 3 seconds, I'll see the voltage try to dip to 2.8V and then go back to 3V.
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Thu Jun 30, 2005 8:37 am     Reply with quote

Which compiler version are you using?

I compiled your first version in v3.226 and the configuration looks ok. I don't have the hardware so couldn't confirm a correct timing.

Quote:
When I count another 3 seconds, I'll see the voltage try to dip to 2.8V and then go back to 3V.
This is strange, why is the voltage not dropping to 0V? Are you sure GP1 is now configured as an input?
Ttelmah
Guest







PostPosted: Thu Jun 30, 2005 8:46 am     Reply with quote

GoldServe wrote:
How i'm measuring it is from the time I turn the PIC on, I count 3 seconds and the output from the LDO goes high to ~3V. When I count another 3 seconds, I'll see the voltage try to dip to 2.8V and then go back to 3V.

Count?...
Have you tried a watch?.
A lot of people can count quite reasonably for reasonable intervals, but go '1', 'and2', 'and3' etc., And are a good half second 'early' on the first few counts. If you are 'counting' time, you need to use something like 'thousandand1', 'thousandand2' etc..
How has the internal timing 'tweak' value been stored/kept during reprogramming?. The internal RC oscillator, is normally pretty accurate, but this tweak value must be maintained if the oscillator is going to be reasonably accurate.

Best Wishes
djpark



Joined: 02 Mar 2004
Posts: 49

View user's profile Send private message

PostPosted: Thu Jun 30, 2005 8:51 am     Reply with quote

I have no objection on someone trying to put his own program on a piece of the hardware I designed.

However, he should at least keep his ethic of not removing the copyright notice from the original circuit diagram.

The original is found here and it looks clearer and it may help you to better idea of what it is supposed to do.



Anyway, it is outdated and the new version is using different GPIO to drive.

Thanks.

-- dj
GoldServe



Joined: 27 Jun 2005
Posts: 10

View user's profile Send private message

PostPosted: Thu Jun 30, 2005 8:17 pm     Reply with quote

Sorry DJ, I didn't mean to take credit or not give you credit. I just didn't want people e-mailing you thinking it was me or something! Sorry again!
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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