Compare value ...


Closed Thread
Results 1 to 40 of 69

Hybrid View

  1. #1
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,132


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    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:

    Code:
    ADCON0=%10000101
    while !adcon0.0:wend
    I would not set bit 2 at this stage but anyway.

    Ioannis

  2. #2
    Join Date
    Apr 2020
    Posts
    30


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    Quote Originally Posted by Ioannis View Post

    Code:
    ADCON0=000101
    while !adcon0.0:wend

    OK, Perfect this work well now


    Quote Originally Posted by Ioannis View Post
    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.

    Ioannis
    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

  3. #3
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,132


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    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

  4. #4
    Join Date
    Apr 2020
    Posts
    30


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    Quote Originally Posted by Ioannis View Post
    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 :

    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)
    On display i see :

    Temp. 23.5°C
    Tmax 30 Tco 30.0

    And PORTA.6 go at 1 the same

  5. #5


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    on 10bit adc?

  6. #6
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    correct 10 bit 1024 counts @5v vcc
    Last edited by richard; - 10th April 2020 at 00:34.
    Warning I'm not a teacher

  7. #7
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    i get same result from proteus

    Name:  frm_on.jpg
Views: 4936
Size:  370.2 KBName:  frm_off.jpg
Views: 4824
Size:  367.1 KB

    Code:
    '****************************************************************'*  
    '*  Name    : 16F88_LM35.BAS                                   *
    '*  Author  :                                    *
    '*  Notice  : Copyright (c) 2020                                *
    '*          : All Rights Reserved                               *
    '*  Date    : 04/04/2020                                        *
    '*  Version : 1.0                                               *
    '*           PIC 16F88
    '****************************************************************
    #CONFIG
      __config  _CONFIG1, _INTRC_IO & _WDT_ON & _PWRTE_OFF & _MCLR_ON & _BODEN_ON & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF
      __config  _CONFIG2, _FCMEN_ON & _IESO_ON
    #ENDCONFIG
    
    
    adcon1.7=1
    ANSEL  = %00000001 'Disable Inputs Tranne AN0
    OSCCON = %01100000 'Internal RC set to 4MHZ
    TRISA  = %10111111 ' impostazioni INP/OUT
    TRISB  = 0 ' 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
    
    '    EEPROM 
     data @0,16,30
    '===========================================================================
    '*****  SETTAGGIO PORTE 
    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 1249
    Tmax VAR byte
    Tmin VAR byte
    '===========================================================================
    pause 500
    START:
        read 0,tmin,tmax
        Lcdout $FE, 1           'Clear screen
        rele=0
    main:
        samples=0
        FOR sample = 1 TO 10 'Take 10 samples
            ADCIN 0, temp 'Read AN0 into temp variable
            samples = samples + temp
            PAUSE 40 ' Wait 1/4 seconds per reading
        NEXT sample
        temp = samples/10 'Average over 10 samples 
        temperature= temp */ quanta
        LCDOUT $FE, 1 ' cancella LCD
        lcdout "Temp ",dec2 (temperature/10),".", dec1 (temperature//10),$DF,"C"
        lcdout $FE, $C0,"temp ", dec temp 
        If temperature > (Tmax*10) then
            rele=1
        else
            rele=0
        Endif                           
    goto main
    Warning I'm not a teacher

  8. #8
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    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
    i think i see the problem, if louis is using a 16f690 then the adc settings used are totally inappropriate
    adc control on a 16f690 is quite different to a 16f88

    define osc 4 ;there is no define called osc
    adcon1.7=1 ;bit 7 is unimplemented
    ADCON1 = %10001110 ;fosc/2 adc clk bits 0:3 and 7 are unimplemented


    should be
    define OSC 4 ;OSC = 4
    adcon0.7=1 ;right justify result
    adcon1= %00110000 ; frc adc clk
    Last edited by richard; - 10th April 2020 at 05:05.
    Warning I'm not a teacher

  9. #9


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    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

  10. #10
    Join Date
    May 2013
    Location
    australia
    Posts
    2,644


    Did you find this post helpful? Yes | No

    Default Re: Compare value ...

    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

Similar Threads

  1. How to compare two temperatures
    By SKOLS1 in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 10th April 2012, 09:07
  2. how to hserin compare with known value?
    By aa222k in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 23rd November 2010, 18:48
  3. Is there a faster way to compare?
    By RussMartin in forum mel PIC BASIC Pro
    Replies: 12
    Last Post: - 8th February 2010, 19:48
  4. how to compare data
    By Mus.me in forum mel PIC BASIC Pro
    Replies: 19
    Last Post: - 1st November 2009, 22:30
  5. Compare Data
    By Pesticida in forum mel PIC BASIC Pro
    Replies: 9
    Last Post: - 14th February 2008, 20:40

Members who have read this thread : 7

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts