PIC frequency

Thread Starter

RG23

Joined Dec 6, 2010
304
How to obtain 1 hz signal from 1Mhz internal clock oscillator in PIC 16f887 without using timer?

if anyone has an idea please let me know

Thank you​
 

ke5nnt

Joined Mar 1, 2009
384
A 1Hz signal from the internal osc? Hmmm... might not be possible. You can usually only get the internal oscillator down to 32KHz, but that's still about 31,999Hz too fast for you. Some MCUs let you use a single resistor on the OSC1 pin to create a variable oscillator frequency (variable by the fact that you can change it by changing the value of the resistor) in ER mode. Even still, a MCU with a 4MHz internal clock with a 1MΩ resistor on OSC1, the clock only goes down to 200KHz.

I'm not an expert believe me, I suppose there may be some combination of bit changes and prescaler maybe that could get you close? Or the right combination of resistor and capacitor for an external R/C oscillator, but I would be surprised if you were able to achieve a 1 Hertz clock from the internal OSC.
 

Thread Starter

RG23

Joined Dec 6, 2010
304
ke5nnt

Senior Member

Thank you for your opinion.

But I think there must be some way out to achieve any frequency from the clock frequency.
 

thatoneguy

Joined Feb 19, 2009
6,359
Toggle a pin with each loop through a program. Every instruction takes 4 instructions per second, so your output should be around 100kHz. Use a divide by 100k circuit for a 1Hz output.

Internal clock will not be as accurate as a crystal, especially if using the 1Hz for a timebase.

I'd suggest a 32.768kHz crystal and a divide by 32,768 circuit (15 bit counter overflow at 1Hz).

This is the only way to do it without using delays, timers, or interrupts in the code. Those are integral parts of the controller to allow you to get various frequencies on outputs.
 

jpanhalt

Joined Jan 18, 2008
11,087
I just want to use the internal 1Mhz clock

no timers or time delays
It's impossible to do what the OP wants. You use a timer, or you use a time-delay loop. You can port the internal osc. to the outside and deal with it there, but the OP apparently doesn't want that either.

When someone wants to do something that is impossible, my first question is why? Usually they are daydreaming or simply don't understand what they want to do.

John
 

Thread Starter

RG23

Joined Dec 6, 2010
304
Is it possible to implement a real time clock and then use the 1 second interval from that clock to get the 1Hz signal?
 

Thread Starter

RG23

Joined Dec 6, 2010
304
I have a code in which all three timers of PIC 16F887 are being used for some or the other functions.

My objective is to clear the counter on LCD display after every 1 second. When I try to clear one of the timers and use them for 1 second, I am not getting the desired result.
It is actually interfering the whole operation. The three timers in that code are used in the Interrupt Service routine of the program.

Hence I want to know if there is any way I can keep resetting the counter after every one second.

Also when I tried using the delay loop of 1 second it did not work.

Basically I want something similar to timer that will keep running for one second in the background and help me reset the counter after every one second.

I hope I made it clear.

Please give your suggestion

Thank you
 

thatoneguy

Joined Feb 19, 2009
6,359
Is there a reason the LCD must be updated every second, exactly?

uCs usually run at speeds where the LCD can be updated several times per second while doing many other operations in between.

Is there a larger overall loop that will update the LCD many times a second, thus when the variable that changes each second will also change on the LCD at the next update.

Using a realtime clock will also work, but would require additional circuitry to extract the seconds.
 

Markd77

Joined Sep 7, 2009
2,806
If any of your current timer interrupts are regular then they could be used.
eg. if one of them interrupts 200 times a second, you could just put a counter in there that excecutes your LCD update every 200 times.
 

Thread Starter

RG23

Joined Dec 6, 2010
304
yes the LCD must be updated every second.

Actually I just want something similar to a 1 second timer that runs in the background continuously

But I am unable to modify any of the timers nor does it work with any delay loop
 

t06afre

Joined May 11, 2009
5,934
yes the LCD must be updated every second.
Actually I just want something similar to a 1 second timer that runs in the background continuously
But I am unable to modify any of the timers nor does it work with any delay loop
The human eye will not notice if the display is updated with some jitter. In fact updating every second will make the display kind of fuzzy. If you use a timer to trigger an interrupt service routine(ISR). I would have used a counter variable in the ISR. And then set a flag then it was time to update the display
 

jpanhalt

Joined Jan 18, 2008
11,087
I can understand not wanting a 1 sec delay loop somewhere in the program. If you are using Assembly, you can easily add up or measure the execution time of the whole program and branches. Thus, the whole program can be inserted into and becomes part of the delay loop. Of course, depending on what else is going on, the refresh won't always be exactly 1 sec, unless you make all possible branches the same time-length. I use NOP's. Obviously, that can get complicated quickly.

If that doesn't cut it, then your idea of getting a 1 sec time signal from somewhere else -- another smaller PIC -- makes sense.

John
 

spinnaker

Joined Oct 29, 2009
7,830
yes the LCD must be updated every second.

Actually I just want something similar to a 1 second timer that runs in the background continuously

But I am unable to modify any of the timers nor does it work with any delay loop
There is no need to modify the timer itself. Just the interrupt routine.


As Markd77 said you just need to figure out how often one of those timers is running it's interrupt handler. Put in a counter, when the counter reaches X, update the display and reset the counter.
 
Top