Thanks for all the help yesterday, 2 hours work today has got me further than ever with a PIC. Once again, Swordfish is pretty awesome!
Below is a program that uses a Microchip MCP9700 sensor on RA2 with a 2.56V voltage reference on Vref+. Google doesn't think many people seem to use these sensors but they are pretty standard, 10mV/C. 0 degrees C is 500mV, commented in the code.
I can read the ADC and convert to a positive temperature fine. However I ran into a few problems, if anybody can answer I'd be really grateful.
1) Setting ADCON0 works for Vref+ but setting the individual bits doesn't, is there a reason for this? Purely out of curiosity!
2) What's the best way to incorporate negative temperatures? I guess it should be possible to calculate +ve or -ve in the same way but I can't figure it at the minute. My temperature calculation probably isn't the best.
3) Is it easy to display the decimal portion? I can't think how to calculate it, but 0.25 degrees resolution should be possible with the full 10 bits.
Any general pointers for improving my code would also be good.
Below is a program that uses a Microchip MCP9700 sensor on RA2 with a 2.56V voltage reference on Vref+. Google doesn't think many people seem to use these sensors but they are pretty standard, 10mV/C. 0 degrees C is 500mV, commented in the code.
I can read the ADC and convert to a positive temperature fine. However I ran into a few problems, if anybody can answer I'd be really grateful.
1) Setting ADCON0 works for Vref+ but setting the individual bits doesn't, is there a reason for this? Purely out of curiosity!
Code:
// Works:
ADCON0 = $40
// Doesn't work:
VCFG1 = 0
VCFG0 = 1
2) What's the best way to incorporate negative temperatures? I guess it should be possible to calculate +ve or -ve in the same way but I can't figure it at the minute. My temperature calculation probably isn't the best.
3) Is it easy to display the decimal portion? I can't think how to calculate it, but 0.25 degrees resolution should be possible with the full 10 bits.
Any general pointers for improving my code would also be good.
Code:
Device = 18F1320
Clock = 8
Config OSC = INTIO2
Config MCLRE = ON
// some LCD options...
#option LCD_DATA = PORTB.4
#option LCD_RS = PORTA.0
#option LCD_EN = PORTA.1
Include "IntOSC8.bas"
Include "LCD.bas"
Include "ADC.bas"
Include "convert.bas"
Include "utils.bas"
Dim ADVal As Word
Dim Temp As Byte
Dim LED As PORTB.1
Function ADInAsVolt() As Word
result = (ADC.Read(2) + 1) * 500 / 1024
End Function
SetAllDigital
// External 2.56V voltage reference on Vref+
ADCON0 = $40
// Enable RA2 as analogue input
PCFG2 = 0
TRISA.2 = 1
ADCON1.2 = 1
// Write static text, this is never overwritten
LCD.Cls
LCD.WriteAt(1,1,"A/D Value:")
LCD.WriteAt(2,1," Temp:")
While True
ADVal = ADC.Read(2)
// Write the A/D value to the LCD
LCD.MoveCursor(1,12)
LCD.Write(DecToStr(ADVal, 4, "0"))
// Write the temperature
LCD.MoveCursor(2,12)
// If it's <200, it's negative
// -> Sensor has 10mV/degree C resolution, ADC has 2.5mV per step
// -> 500mV is 0 degrees C
// -> 500 / 2.5 = ADC value 200
if (adval < 200) then
LCD.write("-ve! ")
else
LCD.write("+")
Temp = (ADVal - 200) / 4
LCD.Write(DecToStr(Temp, 2, " "), 223, "C")
endif
Toggle(LED)
DelayMS(500)
Wend