Oops, sorry, forgot to answer that part. (DEC2)
You should only have to reset GIE before reading the sensor.
INTCON.7 = 0
OWIN ....
INTCON.7 = 1
Not sure what you did with the counter so I can't imagine what happened there.
<br>
Oops, sorry, forgot to answer that part. (DEC2)
You should only have to reset GIE before reading the sensor.
INTCON.7 = 0
OWIN ....
INTCON.7 = 1
Not sure what you did with the counter so I can't imagine what happened there.
<br>
DT
Originally Posted by Darrel Taylor
Hi Darrel,
That's great, I sure appreciate it, I'll give it a try tomorrow for sure.
Thanks Again
jessey
Originally Posted by Darrel Taylor
Hi Darrel,
I tried as you suggested and it's still giving me major problems. The counter does increment but it takes about 50 seconds to increment each second. The temperature seems to function ok, as when I touch the DS1820 it does increase the temp reading without any delays and all the buttons are working ok to enter the other subroutines and I can reset your clock ok as well.
The only function that doesn't work, is that the heater doesn't shut off when the temperature is equal to or greater that the set reference that's suppose to shut it off.
I have a Tocks counter that Gosubs the counter in the mainloop that's keeping time as well and it's functioning ok and keeping the proper time so it's a real puzzler. I tried "INTCON.7 = 0" before checking the temp and then instead of "INTCON.7 = 1" to turn it back on I used "Gosub StartTimer" figuring that something wasn't set proper, but still no go.
It has to be something in the mainloop that's causing the havoc. I noticed that when I enter another subroutine from the mainloop that your clock counts the time ok because if I time the seconds that I'm out of the mainloop and when I return, then your counter has counted the time correctly and I can see the time has advanced on the Lcd.
I've spent a couple of late nights going through my code thinking that I've got something in it that might be interfering with your counter but came up empty.
I went through the data sheet again for the 16f877 and still can't figure it out. Would you have any ideas on what's happening to cause this? I've included my code this time and if you get a chance to look at it sometime I'd surely appreciate it.
Thanks
jessey
Last edited by jessey; - 9th November 2005 at 12:51.
The DS1820 takes 750 ms to do a conversion.
In this section here, you have the interrupts turned off the whole time while waiting 3/4 of a second for it to finish. Missing a few (75) interrupts.
Since you have the Elapsed timer going, maybe you could send the convert command, then go back 1 second later and read the results. "Quickly"Code:Update_The_Temperature: INTCON.7 = 0 ' Disables all interrupts OWOut DQ, 1, [$CC, $44] ' Start temperature conversion waitloop:OWIn DQ, 4, [count_remain] ' Check for still busy converting IF count_remain = 0 THEN waitloop OWOut DQ, 1, [$CC, $BE] ' Read the temperature OWIn DQ, 0, [temperature.LOWBYTE, temperature.HIGHBYTE, Skip 4, _ count_remain,count_per_c] 'Gosub StartTimer INTCON.7 = 1 ' Enables all unmasked interrupts RETURN
<br>
Last edited by Darrel Taylor; - 10th November 2005 at 08:05.
DT
Darrel,
I'm trying this code on an 877 and it work great, nice job. I would however like to run it on a 452 or a 4620. What would I have to change for this? I was looking thought the files and came across the lines:
What would these be if I wanted to say run a PLL at 4 MHz or a PLL at 10 MHz?Code:IF OSC == 4 ; Constants for 100hz interrupt from Timer1 TimerConst = 0D8F7h ; Executed at compile time only EndIF If OSC == 8 TimerConst = 0B1E7h EndIF If OSC == 10 TimerConst = 09E5Fh EndIF If OSC == 20 TimerConst = 03CB7h EndIF
The easiest way to figure out the constant at any OSC is to use the Timer Calc form at ...
http://www.picbasic.co.uk/forum/showthread.php?t=2031
For instance, in the form, enter 4 in the OSC field, then put 100 in the bottom Freq field. Press Calculate, and it shows that it takes 10,000 "Ticks" of the timer. And the number to reload into the Timer on each interrupt is 55543, or 0D8F7h This is the same number shown in the ASM section you listed, for 4Mhz.
That's 65536 - 10000 + 7
7 is the number of instructions used to reload the timer. (Elapsed.bas : ADD2_TIMER)
So, just plug in the new OSC value (Any crystal or PLL Freq) and enter 100 in the FREQ field. The new constant can be added to the ASM section of Elapsed.bas.
Also, I have a version of "Elapsed" for the 18F's. I'll send it, later tonight, when I get off work.
L8R,
Darrel
Last edited by Darrel Taylor; - 7th December 2005 at 05:44.
Here's the version for 18F's.
It should be a drop-in replacement for the old version. Everything works the same, except for the registers saved on entry to the INT routine.
So, you can still use the Test_Elapsed_LCD/SER.bas demo's from the original version for testing. Just add the "-18" to the INCLUDE line.
<br>
Last edited by Darrel Taylor; - 7th December 2005 at 07:39.
DT
It works like a charm, thank you vary much. Now I can finish making my waterbed temperature controller.
Originally Posted by Darrel Taylor
Hello Darrel,
I tried using your Elapsed-18 for use with my 18f452 and when I compile I get these errors:
Error(113)c\pbp\10tim~2asm 503:Symbol not previously defined (TimerConst)
Error(113)c\pbp\10tim~2asm 507:Symbol not previously defined (TimerConst)
Would you have any ideas why I'm getting these errors or what I could try to get it to compile? I got my new version of PBP 2.47 installed now.
Thanks
jessey
Bookmarks