Try:
1.
ADCON0=%10000101
while !adcon0.2:wend
2.
Display your variables on LCD or a serial port to be sure what values they are
Ioannis
Try:
1.
ADCON0=%10000101
while !adcon0.2:wend
2.
Display your variables on LCD or a serial port to be sure what values they are
Ioannis
with this the Pic16F88 not working
Display on LCD
24.5 °C
Tmin 16 Tmax 30
cdout $FE, 2, "Temp ",dec2 (temperature/100),".", dec1 (temperature//100),$DF,"C"
lcdout $FE, $C0, "Tmin ",#Tmin DIG 1,#Tmin Dig 0," Tmax ",#Tmax DIG 1,#Tmax Dig 0
My problem is, i think:
temperature is a word
Tmax is a byte
and I don't understand how compare the values
Don't you see? You display a decimal number but the number is in fact 245 and not 24.5!
So, maybe you can use word variables and multiply them by 10 so you can compare 245 to 160 and 300.
My first suggestion was to make sure that bit 0 of ADCON0 was set. It needs some time and if you go fast to start ADC, the module might not work as expected. I am sorry that I made the mistake of bit 0 to 2. Please include it as this:
I would not set bit 2 at this stage but anyway.Code:ADCON0=%10000101 while !adcon0.0:wend
Ioannis
OK, Perfectthis work well now
I have modified code in this mode, but don't work yet
If temperature > (Tmax*10) then
PORTA.6=1
else
PORTA.6=0
Endif
PORTA.6 go high when power on after showing the values on the display
NOTE :
The variables are still "temperature WORD" and "Tmax BYTE". I tried to change Tmax from BYTE to WORD in the declaration area but it gives me an error when compile
You should make it word. 30*10=300 > than a byte can hold.
Also better make the multiplication outside the comparison.
Use the LCD as a monitor to check your values.
About compilation, I guess it is a syntax error thing.
Ioannis
hi,
I have define Tcomp VAR WORD
and now i have :
On display i see :Code:tcomp=tmax*100 lcdout $FE, 2, "Temp. ",dec2 (temperature/100),".", dec1 (temperature//100),$DF,"C " lcdout $FE, $C0, "Tmax ",#Tmax DIG 1,#Tmax Dig 0," Tco ",dec2 (Tcomp/100),".", dec1 (Tcomp//100)
Temp. 23.5°C
Tmax 30 Tco 30.0
And PORTA.6 go at 1 the same
correct 10 bit 1024 counts @5v vcc
Last edited by richard; - 10th April 2020 at 00:34.
Warning I'm not a teacher
Here is the code. Look at the comments, and modify the RAW number to number when the display show 30.0degC.
Code:define osc 4 adcon1.7=1 ANSEL = %000001 'Disable Inputs Tranne AN0 ADCON1 = %10001110 OSCCON = %01100000 'Internal RC set to 4MHZ TRISA = %00000001 ' impostazioni INP/OUT TRISB = %00000000 ' delle porte '---------------------------------------------------- DEFINE LCD_DREG PORTB 'Porta B DATA OUT DEFINE LCD_DBIT 4 '0 --> Bit 0-3 : 4 --> Bit 4-7 DEFINE LCD_RSREG PORTB 'LCD register select port - Porta B --> RS DEFINE LCD_RSBIT 2 'LCD register select bit - Pin RS B2 DEFINE LCD_EREG PORTB 'LCD enable port - Porta B --> EN DEFINE LCD_EBIT 3 'LCD enable bit - Pin EN B3DEFINE LCD_BITS 4 'LCD bus size 4 or 8 DEFINE LCD_LINES 2 'Number lines on LCD DEFINE LCD_COMMANDUS 2000 'Command delay time in us DEFINE LCD_DATAUS 50 'Data delay time in us Rele VAR PORTA.6 ' Pin 15 '-------------------------------------------------------------- '---------Define ADCin Parameters DEFINE ADC_BITS 10 'set number of bits in result DEFINE ADC_CLOCK 3 'set clock source (3=rc) DEFINE ADC_SAMPLEUS 50 'Set sampling time in uS ' RAM Assignments and Variables '=========================================================================== temp var word temperature var word samples var word sample VAR BYTE quanta con 1250 Tmax VAR byte Tmin VAR byte '=========================================================================== Tmin=16 Tmax=30 START: Lcdout $FE, 1 low rele main: sample = 1 samples= 0 FOR sample = 1 TO 20 'Take 20 samples ADCIN 0, temp 'Read AN0 into temp variable samples = samples + temp PAUSE 50 ' Wait 1/4 seconds per reading NEXT sample temp = samples/20 'Average over 20 samples (Every 5 seconds) temperature= temp */ quanta if temp > 675 then high rele 'Instead 675 write the correct RAW number for 30degC if temp < 675 then low rele 'Instead 675 write the correct RAW number for 30degC LCDOUT $FE, 2 ' ritorna al primo carattere lcdout $FE, 2, "Temp ",dec2 (temperature/10),".", dec1 (temperature/10),"C" 'lcdout $FE, $C0, "Tmin ",#Tmin, " Tmax ",#Tmax FOR NORMAL OPERATION UNCOMMENT LINE lcdout $FE, $C0, "RAW:",dec temp 'this show the ADC value FOR NORMAL OPERATION COMMENT OR DELETE THIS LINE 'When the display show 30,0 degC look at the RAW number on LCD and rewrite it in lines: if temp > 675 then high rele 'and if temp < 675 then low rele . goto main
not sure whats going on here
my LM35 has a 0.3 volt output @30c, adc value 61 [10mV/deg]
an adc read of 675 would need 329 deg
Warning I'm not a teacher
I'm just curious, can you please try this hex, is It working OK?
Bookmarks