| Per Westermark 06/19/09 13:05 Read: 114 times Sweden |
#166262 - Try unsigned subtraction with borrow Responding to: Andy Peters's previous message |
Let's say you have a 16-bit counter ticking downward and automatically going from 0 to 0xffff on turn-around.
Let's say you want to wait 4900 ticks, so you write: if (start-current >= 4900) have_timeout(); Let's say you make your first sample at 53719. 53719-53719 = 0, so not time yet. 53719-53718 = 1, so not time yet. 53719-53717 = 2, so not time yet. ... 53719-48820 = 4899, so not time yet. 53719-48819 = 4900 => timeout. 53719-48818 = 4901, so we are one tick late. ... Let's now say that your first sample was at 3019, i.e. the timer will turn around during your wait. 3019-3019 = 0, so not time yet. 3019-3018 = 1, so not time yet. ... 3019-0 = 3019, so not time yet. (time for a turnaround) 3019-65535 = -62516 which is 0xffff0bcc in 32-bit hex or 0x0bcc in 16-bit hex or 3020 decimal. ... 3019-63656 = -60637 which is 0xffff1323 in 32-bit hex or 0x1323 in 16-bit hex or 4899 decimal. Not yet. 3019-63655 = -60636 which is 0xffff1324 in 32-bit hex or 0x1324 in 16-bit hex or 4900 decimal. Timeout 3019-63654 = -60635 which is 0xffff1325 in 32-bit hex or 0x1325 in 16-bit hex or 4901 decimal. One tick late The subtraction will still produce the correct number of ticks after the turnaround. But you have to be a bit careful if your delay time gets close to the full period time of the timer, since the amount of ticks available for detecting the end of the delay may not be enough. If the timer ticks with 1MHz and your loop can't guarantee that it polls time timer more often than every 100us, then a 16-bit timer would be unsafe to use with this method if your delay is so long that it gets close to 65536-100. |
| Topic | Author | Date |
| s/w delay function | Sandeep Gupta | 06/02/09 00:50 |
| Software loops can be optimized away | Per Westermark | 06/02/09 01:07 |
| lacks side-effects | Neil Kurzman | 06/02/09 01:07 |
| First time with LINT? | Andy Neil | 06/02/09 01:19 |
| lacks side-effects | Andy Neil | 06/02/09 01:07 |
| That does not mean it is an error. | Neil Kurzman | 06/02/09 01:12 |
| It also blocks | Jez Smith | 06/02/09 01:49 |
| How to post legible source code | Andy Neil | 06/02/09 01:13 |
| DELAY_0.1.ZIP Useful? | Murray R. Van Luyn | 06/14/09 22:11 |
| That doesn't help, and it won't work anyhow! | Andy Neil | 06/15/09 01:54 |
| I stand by it. | Murray R. Van Luyn | 06/15/09 19:21 |
| Yes a delay function is useful | David Prentice | 06/16/09 02:39 |
| wrong !!!! | Erik Malund | 06/16/09 08:46 |
| No, that's precisely where you're wrong | Andy Neil | 06/16/09 12:35 |
| How can you say that? | Andy Neil | 06/16/09 12:43 |
| I think you should read Murray's comments | David Prentice | 06/16/09 15:20 |
| I have seen ... | Erik Malund | 06/16/09 15:45 |
| Timers usable without start/stop too | Per Westermark | 06/16/09 16:30 |
| free-running counter/timer | Andy Peters | 06/18/09 17:30 |
| Unsigned integers | Per Westermark | 06/18/09 17:39 |
| re: unsigned | Andy Peters | 06/19/09 12:16 |
| Try unsigned subtraction with borrow | Per Westermark | 06/19/09 13:05 |
bug in second (improved!?) code block | Andy Peters | 06/19/09 16:38 |
| Delay Loops in 'C'..!!! NO | Mahesh Joshi | 06/16/09 05:44 |
| Go on. Suggest a SIMPLE alternative | David Prentice | 06/16/09 06:20 |
| My Methods | Mahesh Joshi | 06/16/09 07:21 |
| So he has a long list of constraints | David Prentice | 06/16/09 07:46 |
| oh boy what a load who wil have 10 minutes for this | Erik Malund | 06/16/09 08:55 |
| Ok. I was being naughty. | David Prentice | 06/16/09 10:28 |
| you forget the obvious ... | Erik Malund | 06/16/09 10:49 |



