PDA

View Full Version : DT’s Elapsed Timer Magic Trick



Art
- 1st April 2015, 11:58
Hi Guys :)

Do you think it's possible for a program running on pic 16F628A with no additional hardware,
connected only to:
1) a power supply
2) a single wire clock signal to pin 16 CLKIN
3) an LED
to tell what frequency the hardware is running at and adjust DT's Elapsed Timer constant
accordingly so the LED will flash once per second no matter what crystal is connected?

I think the answer will be no, but already disagree ;)
If it turns out too easy, I won’t bother posting the video so fire away! :D
Cheers, Art.

Art
- 1st April 2015, 12:13
This is the hardware....
A hardware selectable logic buffered clock, or you can turn them all off and the pic won’t run at all.

http://img.photobucket.com/albums/v186/ArtArt/Magic%20Clock_zpsfrbsprsi.png

Demon
- 1st April 2015, 12:39
So where's the LIKE button?

Robert
:)

Art
- 1st April 2015, 12:53
Thanks :)
If it is figured out I want it outed, and if not I’ll take it to the world of YouTube :D but will then give it up ;)

pedja089
- 1st April 2015, 14:22
It's easy, when PIC have internal osc...
You can use same method to calibrate internal OSC, when OSCCAL value is erased.
Just feed in known clock reference and adjust internal clock Until you get correct result.

Art
- 1st April 2015, 14:27
There’s no known clock reference being fed into it.
It can currently be any of three clocks so it’s unknown.
The pic’s clock is set to HS, and is clocked by one of the three signals connected.
8, 16 or 24 MHz.

HenrikOlsson
- 1st April 2015, 16:53
Honestly, I don't understand.
Are you asking us to help you come with a way to do it or have you already done it and asking us if we too can figure it out?
I can't help thinking about what date it is today....

/Henrik.

Art
- 1st April 2015, 17:12
Is it ok to swear here?

Art
- 1st April 2015, 17:12
I’m asserting it’s done, and asking if you too can figure it out.

I should have picked another day. It’s the 2nd now in Aus, but I’ll come back tomorrow :D
It is what I say it is I swear.

Art
- 1st April 2015, 17:21
That’s awesome. I just need to make a YouTube video right now 10 hours ahead UTC.
This should be a pretty good April Fool’s joke.

Art
- 2nd April 2015, 01:28
I’m disappointed :D
I guess I’ll have to spill the answer tomorrow.

https://www.youtube.com/watch?v=PhBOpCkWNsA

Amoque
- 2nd April 2015, 01:34
I am a total noob, but I feel such cleverness deserves a guess - even if only to prove how far superior your skills. I am unwilling to just shrug and wait for you to reveal your skill without so much as voicing the consideration I have given - not so much a joke, but puzzle - you have provided.

I will guess that there is some capacitance in the circuit and that you use some application of the RCTime constant as a reference; different clocks would, I think, reveal the clock speed by the timer values measured when charging and discharging a capacitor from a known voltage. I take my guess from watching the LED (which, I believe has a capacitance associated - and conveniently a resistor in series) which is slow to start - I'm hoping, because it is busy measuring...

Art
- 2nd April 2015, 02:02
Interesting idea, but not tested by me so I don’t know if it would work ;)

The virtue in what I’m doing is someone might come up with a better way,
and at the moment I would appreciate that.
It’s not genius trust me, you’ll find out. Someone is close on another forum.

Demon
- 2nd April 2015, 03:02
2015 nominee for best computer generated animations. :D

Robert

towlerg
- 2nd April 2015, 04:34
628A has two internal clocks

Art
- 2nd April 2015, 04:49
I know of the 4MHz RC clock. What’s the other?

Art
- 2nd April 2015, 05:13
It got figured out on another forum. A better way actually, without writing to the on-chip EEPROM at all.



'************************************************* **********************************
'* *
'* Microchip Pic 16F628 @ 8,16 or 24MHz *
'* Art 2015 *
'* *
'* [email protected] *
'* *
'************************************************* **********************************
'
'
DEFINE OSC 20 '
DEFINE NO_CLRWDT 'watchdog is cleared manually
'
INCLUDE "Elapsed.bas" ‘modified to take a variable
'
' execution time!
'
'
percount var byte '
wrtcount var byte '
clkvalue var byte '
xdata var byte '
'oscfreq var word ‘this is declared in Elapsed Timer file
notreset var bit '
'
CMCON = 7 'set ports digital
trisb.4 = 0 'set led output
portb.4 = 0 '
'
percount = 0 '
clkvalue = 0 '
'
'
notreset = status.bit4 'check wdt reset occured - 0 is did reset
'
'
if notreset = 1 then 'was not reset by watchdog
portb.4 = 1 'turn led on
for percount = 0 to 255 'do eeprom writes until wdt reset
pause 100 '
write percount,$00 '
next percount '
makereset: 'failsafe to make reset occur
@ nop ;
goto makereset '
else 'was reset by watchdog
@ clrwdt ;clear the watchdog from now on
wrtcount = 0 'reset write counter
countwrites: 'count eeprom writes
read wrtcount,xdata 'read byte
@ clrwdt ;
pause 10 '
if xdata != $00 then '
goto donecount 'exit counting loop
endif '
wrtcount = wrtcount + 1 'increment count
goto countwrites '
donecount: '
for percount = 0 to 255 'erase the eeprom for next time
pause 10 '
@ clrwdt ;
write percount,$FF '
next percount '
endif '
'
'gosub flashout 'for testing only
'
oscfreq = 0 'reset oscillator frequency
'
if wrtcount > 8 then '11
oscfreq = $B1E7 'set oscillator frequency
endif '
if wrtcount > 18 then '21
oscfreq = $63C7 'set oscillator frequency
endif '
if wrtcount > 27 then '30
oscfreq = $15A7 'set oscillator frequency
endif '
'
'
gosub ResetTime 'reset time 00:00:00
gosub StartTimer 'start clock timer
'
'
'
cycle:
@ clrwdt
if Ticks > 49 then
portb.4 = 1
else
portb.4 = 0
endif
goto cycle
'
'
'
flashout: 'flash out the count of eeprom writes before wdt reset
for percount = 0 to wrtcount 'with the red led
portb.4 = 1 'flash rate will still depend on oscillator frequency
pause 250 'at this stage
@ clrwdt '
pause 350 '
@ clrwdt '
portb.4 = 0 '
pause 250 '
@ clrwdt '
pause 350 '
@ clrwdt '
next percount '
pause 500 '
@ clrwdt '
pause 500 '
@ clrwdt '
pause 500 '
@ clrwdt '
return ‘
'

towlerg
- 2nd April 2015, 05:24
I know of the 4MHz RC clock. What’s the other?

Actually there are three, 4 Mhz and 48Khz internal clocks and the WDT

Art
- 2nd April 2015, 06:28
I always thought the wdt clock was derived from the internal RC clock, but some Googling confirms it's not.

Fortunately it appears Timer1 does not get reset with the wdt, so the byte values in the timer register
could be used instead of writing to EEPROM.

Tabsoft
- 2nd April 2015, 22:57
Pretty clever Art!

Art
- 3rd April 2015, 03:41
Thanks :)
It wasn’t my idea to use timer1 values as RAM that survives WDT reset,
but I figure as long as you haven’t started timer1, you could just write the count into
one of the timer1 bytes instead of on-chip EEPROM and read the value after the reset.

For my clock board I have swapped the 8MHz crystal with a 20MHz crystal,
and added a dual flip flop to divide two of the clocks, so now have:
8,12,16,20 & 24MHz. One dual more flip flop, and I’ll have 6 & 10MHz as well.
It has been reliable so far with the freqs I can test, bust suspect any 1MHz increment is easy to detect.

Art
- 3rd April 2015, 08:39
Ok, after a little experimentation today, finding the frequency without any use of EEPROM at all is really this easy:


'
DEFINE OSC 20 ‘needed so the 100ms pause period is known
'
if status.bit4 = 1 then 'was not reset by watchdog
for percount = 0 to 255 'do eeprom writes until wdt reset
pause 100 '
@ MOVF _percount ,W ;copy counter value to timer low byte
@ MOVWF TMR1L ;load timer with count value
next percount '
makereset: 'failsafe to make reset occur
goto makereset '
'
else 'hardware was reset by watchdog
@ clrwdt ;
@ MOVF TMR1L ,W ;copy counter value to timer low byte
@ MOVWF _wrtcount ;reload timer with correct value
endif '
'


Then you have a number in wrtcount that represents the crystal frequency i.e. a couple of values either side of 25 = 20MHz.
This is with the power timer also set, but I doubt that matters as the pic isn’t doing anything in power timer period.

In any case, it’s very handy to know that if you’re not using Timer1,
you have an ordinary word variable that survives WDT for certain.

If your program was going to use Timer1 after this, the values should probably be reset to zero, then the clock started.
DT’s Elapsed Timer code does have a Reset feature which probably does this as well as clearing it's real time variables.