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 support@ccsinfo.com

Dual clocks from one PIC12F675
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
marcusayoung



Joined: 03 Jun 2009
Posts: 28

View user's profile Send private message

Dual clocks from one PIC12F675
PostPosted: Thu Jul 02, 2009 3:13 pm     Reply with quote

Hi All,

I'm pretty sure this is such a novice code question, but I can't seem to wrap my head around it.

I would like to generate two clocks from one PIC. The usual method I'm using is the delay function, where I turn on a GPIO on for some delay time and conversely for turning it off, all in a forever loop. The problem I'm having is I can't think of how to do this for two different frequencies (because I obviously can't use the aforementioned method twice in the same forever loop).

So, would I generate one clock and pass it back into the pic, then use some One Shot type algorithm (for a smaller freq. clock) and drive it out of another GPIO maybe (This seems to use too many pins)?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Jul 02, 2009 3:21 pm     Reply with quote

1. What are the two clock frequencies ?
2. What is the desired duty cycle for each one ?
3. What is the oscillator frequency of the PIC ?
marcusayoung



Joined: 03 Jun 2009
Posts: 28

View user's profile Send private message

PostPosted: Thu Jul 02, 2009 3:22 pm     Reply with quote

duty cycle = 50% for each.

One frequency should be 10KHz, the other should be 1Hz.
marcusayoung



Joined: 03 Jun 2009
Posts: 28

View user's profile Send private message

PostPosted: Thu Jul 02, 2009 3:23 pm     Reply with quote

sorry...PIC is running at 4.3MHz
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Jul 02, 2009 3:45 pm     Reply with quote

You could do it with a timer interrupt and set the interrupt rate for
20 KHz. Then toggle the 10 KHz pin each time there is an interrupt.
You can increment a 16-bit static counter inside the timer isr,
and when it counts up to 10K, you can toggle the 1 Hz pin.

The problem is that the interrupt handler takes too many instruction
cycles for it to be able to service the interrupt at a 20 KHz rate
with your 4.3 MHz oscillator frequency. A 20 KHz interrupt occurs
every 50 us. You could do it with an #int_global handler. That would
considerably shorten the overhead time for the interrupt. But it's more
complicated to write.
marcusayoung



Joined: 03 Jun 2009
Posts: 28

View user's profile Send private message

PostPosted: Thu Jul 02, 2009 3:54 pm     Reply with quote

Hmmm, sounds tricky.

I know the 4.3MHz is kinda strange, but i've found that it outputs a more accurate 1Hz square wave, so ideally i'd like to keep using the method i explained above for this signal.

Aside from that, the datasheet says GP4 is a CLKOUT, might it be possible to to set 10K_CLK = INTERNAL_OSC/CONSTANT? or am i looking at the same problem as before?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Jul 02, 2009 4:23 pm     Reply with quote

Quote:

I know the 4.3MHz is kinda strange, but i've found that it outputs a more
accurate 1Hz square wave,

That means you already have a existing method for outputting a 1 Hz
square wave. What is it ?


Quote:

might it be possible to to set 10K_CLK = INTERNAL_OSC/CONSTANT?

With an external crystal, the CLKOUT pin is part of the crystal oscillator
circuit. With the internal oscillator, the CLKOUT pin is Fosc/4 (1 MHz).
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

if space or a tiny bit more power is no problem
PostPosted: Fri Jul 03, 2009 6:50 pm     Reply with quote

This problem has other solutions - in my practice - designs are blend of hardware and PIC - letting each do what it does best.

If you want to accomplish anything ELSE with that PIC of yours - here is a way to do it with zero code space required.

You see, this problem is PERFECTLY solvable with maybe $3 worth of HARDWARE MAX- and with perfect results.


Unless your (PCB_Space|| budget) =0
you might check the data sheets for the cmos (CD) 4518 or the 74hc390
and several other similar parts - google "DUAL DECADE COUNTER" for many others.

Two of these - wired properly is under $1 @ purchase quan =1
and you can have your choice of synchronous or ripple divide by 10,000.

*Heck* add one MORE of these chips and a 1 mhz oscillator -
and here is your freq source
+ plus a bonus of every other divide by 10,2 and 5 - sub multiple
between 1 mhz and 1 hz.

In production this whole shooting match would run about $1.60 for 10K quantities.
marcusayoung



Joined: 03 Jun 2009
Posts: 28

View user's profile Send private message

PostPosted: Tue Jul 07, 2009 12:58 pm     Reply with quote

In a similar question, but now disregarding the 1Hz solution for now...

Is it possible to achieve a variable 10kHz-100kHz (50% duty cycle, amplitude irrelevant) through the use of a potentiometer/ADC or is there just WAY too much overhead involved? I am using a PIC12F675.

I know its possible to go that high, I achieved it using NOP statements (@4MHz clock). But to make it variable, combined with reading the ADC is seemingly impossible. Even if I used the available counters to reduce overhead I might not be saving much. Its not clear if the 20MHz available internal clock will be high enough.

thoughts?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Jul 07, 2009 1:18 pm     Reply with quote

If you use a PIC that has a hardware PWM module (i.e. a CCP), then it's
easy to do. Here's an example program:
http://www.ccsinfo.com/forum/viewtopic.php?t=26308&start=5

Do you have to use the 12F675 ?

Does the 12F675 program have to do anything else, other than
reading the ADC and bit-banging your output frequency ?
marcusayoung



Joined: 03 Jun 2009
Posts: 28

View user's profile Send private message

PostPosted: Tue Jul 07, 2009 1:40 pm     Reply with quote

The whole goal of the program is to produce the aforementioned variable clock based on one or the other of two registers: the ADC or a TIMERX. I was planning on working out the "one or the other" part using the Interrupt On Change register to determine which input to base the clock time constant off of. One pin will have a potentiometer (ADC), another will have a momentary switch (TIMERX). The timer will begin counting after one push of the switch and stop counting/ acquire it's value when the switch is pressed again.

No, I do not have to use the 12F675, its just what i have. The 12F683 has a PWM, but the datasheet states "10-bit PWM, max frequency 20 kHz" :/

It doesn't look like the other 8-bit series devices can do any better either.

But i still have to wonder if there's a work around since i got a 100kHz clock out of my 12F675 at 4MHz...
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Jul 07, 2009 3:18 pm     Reply with quote

You need to do some physical tests. I just now programmed a 12F683
to do a 100 KHz square wave, 50% duty cycle, with the PWM module.
I can see the signal on my oscilloscope. However, one problem with
the program below is that it can't smoothly do every frequency in your
desired range. What is the minimum frequency step size that you
require ? 1 KHz ?
Code:
#include <12F683.h>
#fuses INTRC_IO, NOWDT, MCLR, PUT, BROWNOUT
#use delay(clock=4000000)

//=============================
void main()
{
setup_ccp1(CCP_PWM); 
setup_timer_2(T2_DIV_BY_1, 9, 1); 
set_pwm1_duty(5);   
   
while(1);
}
Guest








PostPosted: Wed Jul 08, 2009 7:01 am     Reply with quote

Ok, looks like i'll have to give the 12F683 a try. Thanks for trying that out for me.

I wonder why you were able to get 100kHz (so easily?) when Microchip is claiming a 20kHz max on that feature? I've read many a datasheet before, so i understand how misleading they can be sometimes...
marcusayoung



Joined: 03 Jun 2009
Posts: 28

View user's profile Send private message

PostPosted: Wed Jul 08, 2009 7:40 am     Reply with quote

Oops, that was me above ^
RLScott



Joined: 10 Jul 2007
Posts: 465

View user's profile Send private message

PostPosted: Wed Jul 08, 2009 2:10 pm     Reply with quote

Quote:
...I wonder why you were able to get 100kHz (so easily?) when Microchip is claiming a 20kHz max on that feature? I've read many a datasheet before, so i understand how misleading they can be sometimes...

Where did you see this 20kHz limit on PWM frequency? I think you misread something.
_________________
Robert Scott
Real-Time Specialties
Embedded Systems Consulting
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