Global Moderator
Melbourne, Australia
Offline
Shannon Member
Karma: 219
Posts: 13896
Lua rocks!
|
 |
« Reply #15 on: November 30, 2012, 01:49:45 am » |
As long as you are trying, we'll be pleased to help.
I don't see interrupts being the issue here. You have two ISRs that you say are called every couple of seconds, so they are hardly the issue.
Then you have one which does a couple of adds. How many times a second do you expect it to be called? Let's put a metric on this.
And what data types are total_pulses, Count, tenth_gallon and running?
|
|
|
|
|
Logged
|
|
|
|
|
Global Moderator
Melbourne, Australia
Offline
Shannon Member
Karma: 219
Posts: 13896
Lua rocks!
|
 |
« Reply #16 on: November 30, 2012, 01:50:58 am » |
ahem...what's a code tag?
OK, here's some boilerplate. Read it, though: Read this before posting a programming questionPlease edit your post, select the code, and put it between [code] ... [/code] tags. You can do that by hitting the # button above the posting area.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 54
|
 |
« Reply #17 on: November 30, 2012, 01:55:40 am » |
As long as you are trying, we'll be pleased to help.
I don't see interrupts being the issue here. You have two ISRs that you say are called every couple of seconds, so they are hardly the issue.
Then you have one which does a couple of adds. How many times a second do you expect it to be called? Let's put a metric on this.
And what data types are total_pulses, Count, tenth_gallon and running?
Very good questions those... I expect no more than say, 100 pulses in a second. total_pulses-unsigned long, Count-unsigned int, tenth_gallon- unsigned int and running-boolean. The calculating interrupt is done every 5 seconds, so I guess that can't be such an overhead issue, right?
|
|
|
|
|
Logged
|
|
|
|
|
Global Moderator
Melbourne, Australia
Offline
Shannon Member
Karma: 219
Posts: 13896
Lua rocks!
|
 |
« Reply #18 on: November 30, 2012, 02:05:56 am » |
Well out of interest, I set up a test. This code: total_pulses++ ; Count++; tenth_gallon++; running=1;
Takes about 2.8 uS to execute. So if you do 100 of them you have taken 280 microseconds. Add in the overhead of 100 interrupts, say 5 uS each, and that is another 500 uS. So in total 780 uS. You have not even used up 1/1000 of the time you have in a second. Time to look elsewhere. Besides, none of those are floating point variables. I thought you were worried about that?
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 54
|
 |
« Reply #19 on: November 30, 2012, 02:21:49 am » |
No actually, it is this interrupt and its floating point math that I jumped to conclusions about...thoug I may simply have more dumb programming mistakes to fix instead. void Repeats(){ //interrupt timer1 repeats every second-changed to 5 seconds...
//here is the math...we sample every 5 seconds. 9200 counts per gallon. FIXED-use float cast to convert integers to float before calculating
Calc = ((float)Count* ((float)720 / (float)k_factor)); //(Counts in 5 seconds/ number counts per gallon, converted from seconds to hours //using a large value we can select any k-factor - use counts per gallon - perfect // Calc is the gallons per hour.
if (!flag){ //reset flag so running total flag is run only once flag=true; } //this is used for averaging routine for average flow rate
if (Count>0){ stopped_flag++; //add 5 seconds to running time length
} if (stopped_flag>5){ //this is to delay the time till we stop and wait.... //30 seconds or so...it decrements with no flow stopped_flag=5; //add 5 seconds to length of time running, up to 30 seconds //-each unit of increase = 5 seconds of stoppage }
if (Count==0){ //decrement once per 5 second with zero flow... stopped_flag--;
} if (stopped_flag<=0){ stopped_flag=0; // no longer running } else { running=true; //added this to ensure it stays running with flow }
Count=0; //reset for next interrupt
//For some reason, when we start back up from stop, we re-enter the save routine. if ((stopped_flag<=0) && (running) ){ //we were running, then stopped
state=10; //keeps returning to state 10, stop and save, and looping again return; }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 26
Posts: 1339
You do some programming to solve a problem, and some to solve it in a particular language. (CC2)
|
 |
« Reply #20 on: November 30, 2012, 02:53:10 am » |
Alarm.timerRepeat(5,Repeats); TimeAlarms doesn't use interrupts. So Repeats is not an ISR (Interrupt Service Routine). Quote from http://arduino.cc/forum/index.php/topic,37693.0.htmlQ: Are there any restrictions on the code in a task handler function? A: No. The scheduler does not use interrupts so your task handling function is no different from other functions you create in your sketch.
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Online
Tesla Member
Karma: 90
Posts: 9438
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #21 on: November 30, 2012, 05:54:38 am » |
Calc = ((float)Count* ((float)720 / (float)k_factor)); just a tip: division is much slower than multiply so this code can be written as Calc = 720.0 * Count * inverse_k_factor; As the first value is float the whole expression is float, no need to cast. Yes you need to calculate inverse_k_factor somewhere in advance.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 114
Posts: 2205
|
 |
« Reply #22 on: November 30, 2012, 06:04:26 am » |
Your intuition is correct. Floating point math is typically implemented via calls. When floating math is used in the isr and elsewhere in the main loop, you can get into re-entrancy -> big issues.
Sometimes 32-bit multificaton is done via calls so same issue.
You can simplify the math or to use a flag.
|
|
|
|
|
Logged
|
|
|
|
|
Global Moderator
Melbourne, Australia
Offline
Shannon Member
Karma: 219
Posts: 13896
Lua rocks!
|
 |
« Reply #23 on: November 30, 2012, 06:11:24 am » |
I don't see the relevance of this. As shown, the only interrupt which is called at all frequently (100 times a second) doesn't do floating maths.
|
|
|
|
|
Logged
|
|
|
|
|
UK
Offline
Tesla Member
Karma: 89
Posts: 6400
-
|
 |
« Reply #24 on: November 30, 2012, 09:05:12 am » |
Isn't the floating point code reentrant, in any case? I would have assumed it was, and I can't think of any good reason for it NOT to be.
I suggest you post all of your code - or attach it, if it's too big to post. Various snippets have been posted, but the only complete copy I can see is in the first post, which is formatted horribly and probably out of date.
|
|
|
|
« Last Edit: November 30, 2012, 09:10:43 am by PeterH »
|
Logged
|
|
|
|
|
Offline
Jr. Member
Karma: 0
Posts: 54
|
 |
« Reply #25 on: November 30, 2012, 10:03:03 pm » |
Just a couple thoughts... (1) I am both surprised and respectfully humbled by the effort you guys gave in getting me in line. I will make the multiplication versus division changes...I do have the app working, against all odds. It's been 2 and a half weeks of grunt work to get up to speed. Newbie efforts are expensive, time wise. But I am building something I think my fellow pilots and I will greatly benefit from, and for that, it is worth it. Christmas came early for a couple of my friends. Thanks all, who assisted, I will be back soon for more advice and abuse ;-) You guys are the absolute best.
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Online
Tesla Member
Karma: 90
Posts: 9438
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #26 on: December 01, 2012, 04:49:42 pm » |
But I am building something I think my fellow pilots and I will greatly benefit from, and for that, it is worth it. Can you tell a bit more (or maybe after Christmas) ?
|
|
|
|
|
Logged
|
|
|
|
|
|