I want an approximate time in seconds between 2 calls of a routine.
I don't need a lot of accuracy and I don't have any UDBs to spare for this trivial function. I have a function that can take from a few seconds to an hour or more of time to complete and want a gross measurement of the time that has passed by.
I tried using the clock() and the time() functions in C after including time.h but these functions always return -1 indicating an "error".
Is there some way to get these functions to work?
Can I use the ARM TICTIMER somehow?
For now I'm using a FF timer which at least doesn't use any UDBs but I would like to just use clock().
ARM Systick with an interrupt incing a count variable one solution.
Some DSO scopes have extended time bases to handle long events,
so use a pin to trigger start, and its other edge to stop to measure.
This might help as well -
You could alwyas use a pin and and gate an external period counter.
It would have to be a reciprocal counter or have that capability.
If you have a spare pin. You can sent one pulse on one routine and send 2 pulses on the other. Then you can use a CRO to capture the pulse to check the time between them. and also check for variation by recording the pulse over a longer time as well.
Check your CRO (DSO), most, not all, have max sweep rates < 10 sec/div,
therefore cannot measure 1 hour (3600 sec)/360 dvision) events. In that
case you would be better off with a datalogger, or use another psoc to
measure extended periods. Any PSOC could do that.
If I am not mistaken hli posted a reciprocal frequency counter some time ago
on the forum, that could be the basis of a long period measurement system.
Attached info on reciprocal counters.
You can also use a timer. To clock it at 1 Hz, use a 'global signal' component, which can give you a PPS. Then you can start and stop the timer whenever want, and read the elapsed time in seconds directly.
Or you attach a 32 kHz crystal and use the RTC component (but it doesn't have the notion of unix time, so you need to do the calculations on your own).
Thanks for the answers guys!
But I can't seem to find any real documentation on the systick timer.
I know it is part of the ARM and there appears to be a few API calls but I can't find the description.
http://www.cypress.com/?docID=44506 has a sample project and a few other links to documents like the cy_boot project? But that has exactly 1 reference to systic and does not describe the API at all.
Several links bring me http://www.cypress.com/?app=forum&id=2233&rID=49587 but this is another guy trying to get the systic to work... not sure he ever did.
The ARM documention on SysTick is:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0179b/ar01s02s08.html which is good but doesn't give the specifics of how to select the clock and what various things are selected and how to start it.
I think I can just read the systick_current register at
0xE000E018 at the start and subtract that from the value at the end. I assume it's a 32-bit number so should have plenty of resolution.
I shouldn't need an interrupt to count - I just need this counter running on the 1Khz ILO gives me over 1000 hours. The ILO is -55%/+100% which isn't quite as accurate as I'd like but probably close enough. I could also use the systick interrupt to make a 1 sec interrupt with +/-3% accuracy and then count seconds with that.
I am completely out of UDBs (about to post about that as well) so this needs to be a 100% CPU function. Again, I don't need much accuracy - just a rough wall-clock #.