Thermo 7 segments - little problem


Closed Thread
Results 1 to 40 of 50

Hybrid View

  1. #1
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    It's beyond on my understanding and mental capabilities ...
    Code:
    ;                        Termometru 7 segmente 
    '======================================================================================
    
    ;@ DEVICE pic16F628A, intOSC_osc_noclkout, WDT_OFF, PWRT_ON, MCLR_OFF, LVP_OFF, CPD_OFF
    
    DEFINE OSC 4
    CMCON		= 7
    VRCON 	= 0
    INTCON 	= 0
    
                                    
        Common_4   	VAR PORTA.0
        Common_3   	VAR PORTA.1
        Common_2   	VAR PORTA.2
        Common_1   	VAR PORTA.3  
        DP            VAR PORTB.7
    
    Temp   	    Var     byte
    Temperature     Var     Word
    TempC           Var     Word
    I               Var     Byte
    Sign            Var     Word
    Float           Var     Word
    V		    Var     Word		   
    Dummy           Var     Byte
    Busy		    Var     Bit
        DIGIT_0     VAR 	BYTE
        DIGIT_1     VAR 	BYTE
        DIGIT_2     VAR 	BYTE
        DIGIT_3     VAR 	BYTE
    digit		    Var 	BYTE
    
    
    DQ VAR PORTA.4
    DQ_DIR var TRISA.4
    command var byte
    pis   var byte
    
    	TrisB=0					' Make PortB outputs
    	TrisA.0=0:TrisA.1=0:TrisA.2=0		' Make only the specific bits of PortA outputs					
    	TrisA.3=0:TrisA.4=1
    	PortA=0:PortB=0			     	' Clear PortB and PortA
    
    INCLUDE "DT_INTS-14.bas"     ' Base Interrupt System
    INCLUDE "ReEnterPBP.bas"     ' Include if using PBP interrupts
    
    ASM
    INT_LIST  macro    ; IntSource,        Label,  Type, ResetFlag?
            INT_Handler   TMR1_INT,  _show,   PBP,  yes
        endm
        INT_CREATE               ; Creates the interrupt processor
    ENDASM
    
    T1CON = $31                ; Prescaler=8, TMR1ON
    @ INT_ENABLE  TMR1_INT     ; enable Timer 1 interrupts
    
    
    
        
    '======================================================================================
    Gosub init1820 			' Init the DS1820
    
    command = $cc 			' Issue Skip ROM command
    Gosub write1820
    
    command = $44 			' Start temperature conversion
    Gosub write1820
    
    
    Gosub init1820 			' Do another init
    
    command = $cc 			' Issue Skip ROM command
    Gosub write1820
       
    MainLOOP:
    command = $be           ' Read the temperature
    Gosub write1820
    Gosub read1820
    
    TEMPERATURE = ((tempERATURE>> 1)*100)+((TEMPERATURE.0*5)*10)
    Gosub Selectie 
    Goto MainLOOP
    
    '======================================================================================
    Selectie :
    IF sign ="-" then					
        DIGIT_3="-"
        else
        DIGIT_3=" "
    ENDIF
     
    IF TEMPERATURE DIG 2 = 0 THEN
        DIGIT_2 = " "
        ELSE
        DIGIT_2 = TEMPERATURE dig 2
    ENDIF
    
        DIGIT_1 = TEMPERATURE dig 1
        DIGIT_0 = TEMPERATURE dig 0
    
    RETURN
    
    '====================================================================================== 
    show:   
    for i=0 to 4
        TEMP = DIGIT_3 : gosub segments
        COMMON_1 = 1 : PAUSE 1 : COMMON_1 = 0
    
         
        TEMP = DIGIT_2 : GOSUB segments
        COMMON_2 = 1 : PAUSE 1 : COMMON_2 = 0
       
        TEMP = DIGIT_1 : GOSUB segments
        COMMON_3 = 1 : DP = 0 : PAUSE 1 : COMMON_3 = 0 : DP = 1
      
        TEMP = DIGIT_0 : GOSUB segments
        COMMON_4 = 1 : PAUSE 1 : COMMON_4 = 0
    next i
    
    segments:  ; CONVERTS DATES TO 7 SEGMENT CODE for Common ANOD
        
        SELECT CASE TEMP       
    CASE 0 	 : PortB=%11000000 ; 0=ON ; 1=OFF
    CASE 1 	 : PortB=%11111001
    CASE 2 	 : PortB=%10100100      
    CASE 3 	 : PortB=%10110000        
    CASE 4 	 : PortB=%10011001
    CASE 5 	 : PortB=%10010010        
    CASE 6 	 : PortB=%10000010
    CASE 7 	 : PortB=%11111000        
    CASE 8 	 : PortB=%10000000       
    CASE 9 	 : PortB=%10010000        
    CASE "-"     : PortB=%10111111               
    CASE " "     : PortB=%11111111        
        END SELECT 
    return
    @ INT_RETURN
    '====================================================================================== 
    ' Initialize DS1820 and check for presence
    init1820:
       Low DQ              ' Set the data pin low to init
       Pauseus 500         ' Wait > 480us
       DQ_DIR = 1          ' Release data pin (set to input for high)
    
       Pauseus 100         ' Wait > 60us
       If DQ = 1 Then
          Pause 500
          Goto mainLOOP     ' Try again
       Endif
       Pauseus 400         ' Wait for end of presence pulse
       Return
    
    ' Write "command" byte to the DS1820
    write1820:
       For pis = 1 To 8      ' 8 bits to a byte
         If command.0 = 0 Then
            Gosub write0   ' Write a 0 bit
         Else
            Gosub write1   ' Write a 1 bit
         Endif
         command = command >> 1  ' Shift to next bit
       Next pis
       Return
    
    ' Write a 0 bit to the DS1820
    write0:
       Low DQ
       Pauseus 60          ' Low for > 60us for 0
       DQ_DIR = 1          ' Release data pin (set to input for high)
       Return
    
    ' Write a 1 bit to the DS1820
    write1:
       Low DQ              ' Low for < 15us for 1
     @ nop                 ' Delay 1us at 4MHz
       DQ_DIR = 1          ' Release data pin (set to input for high)
       Pauseus 60          ' Use up rest of time slot
       Return
    
    ' Read temperature from the DS1820
    read1820:
       For pis = 1 To 16     ' 16 bits to a word
         temperature = temperature >> 1  ' Shift down bits
         Gosub readbit     ' Get the bit to the top of temp
       Next pis
       If Temperature.15 then       
      Temperature= ~Temperature +1
      Sign  = 1
    Endif
       Return
    
    ' Read a bit from the DS1820
    readbit:
       temperature.15 = 1         ' Preset read bit to 1
       Low DQ              ' Start the time slot
     @ nop                 ' Delay 1us at 4MHz
       DQ_DIR = 1          ' Release data pin (set to input for high)
       If DQ = 0 Then
          temperature.15 = 0      ' Set bit to 0
       Endif
       Pauseus 60          ' Wait out rest of time slot
       Return    
    
    end

    ERROR Line 23: Redefinition of VAR. (DT_INTS-14.bas) ?!?
    Can not be done a simple termometer with LED display ?

  2. #2
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    Check the include, you used the same variable.

    Robert

  3. #3
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    Found it :
    "wsave VAR BYTE $20 SYSTEM ' location for W if in bank0
    ;wsave VAR BYTE $70 SYSTEM ' alternate save location for W "
    ...
    But now I have nothing on display ?!
    Last edited by fratello; - 2nd July 2013 at 15:01.

  4. #4
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    I can only suggest to post all your most recent code. Maybe a senior can spot something.

    Robert

  5. #5
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    OK, I will follow Your advice ...
    This is the last attempt, not-working (just "000" on display). Already feel like I came out of patience with this problem .
    Code:
    ' Pulse counter   - attempt to converted for LED display termometer
    ' =============
    '
    ' File name : Count_Display.bas
    ' Company : Mister E
    ' Programmer : Steve Monfette
    ' Date : 27/12/2004
    ' Device : PIC16F628A
    '
    '
    ' This program display to 3 x 7 segments dislay the result of
    ' pulses count on PORTA.4 pin/sec.
    '
    ' Hardware connection :
    ' ---------------------
    '      1. 3 X 7 segments display on PORTB<7:0>
    '      2. 3 X PNP transistor on PORTA<3:0> to drive common anode
    '         of each 7 segments display
    '
    '
    ' Programming mode and PIC define
    ' -------------------------------
    '
    ;@ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF
    CMCON=7       ' ADDED FOR PIC16F628A   
    DEFINE OSC 20 ' use 20 MHZ oscillator
    
    
        ' I/O Definition
        ' --------------
        '
    TRISA = %11111000 ' PORTA  : <2:0> outputs to common Anode of 7 segment
                          '                1. PORTA.0 More significant
                          '                2. PORTA.2 Less significant
                          '        : PORTA.4 input for signal
                          '
    TRISB = 0         ' PORTB connected to 7 segments
                      '       B0 : segment a
                      '       B1 : segment b
                      '       B2 : segment c
                      '       B3 : segment d
                      '       B4 : segment e
                      '       B5 : segment f
                      '       B6 : segment g
                      '       B7 : segment decimal dot
                          
    
    ' Internal EEPROM definition
    ' --------------------------
    '
    data @0,192,249,164,176,153,146,130,248,128,144 ' table to convert
                                                    ' numbers to 7 segments
                                                    ' pattern output when
                                                    ' drive invert
                                                        
    
    
    ' Interrupt and register definition
    ' ---------------------------------
    
    OPTION_REG = %1111000   ' TMR0 clock source : RA4/T0CKI
                            ' increment on low to high transition
                            ' Prescaler assign to WDT
                            ' WDT rate 1:1
                            '
    INTCON = %10100000      ' Enable global interrupt
                            ' Disable EE write interrupt
                            ' Enable TMR0 overflow interrupt
    
            
        ' Variable definition
        ' -------------------
        '
    DisplayPort  var PORTB   ' Port for 7 Segments
    ;ClockInput   var PORTA.4 ' Input pin for signal
    _7Seg1       con 14      ' enable more significant 7 segment display
    _7Seg2       con 13      ' enable mid significant 7 segment display
    _7Seg3       con 11      ' enable less significant 7 segment display
    Digit_1          var byte    ' Hundreds digit
    Digit_2          var byte    ' Tenth digit
    Digit_3          var byte    ' Unit digit
    ToBeDisplay  var word    ' Result of count to be send to 7 segment display
    Display      var byte    ' Temp variable
    DisplayLoop  var byte    '
    Delay        var word    ' Variable for Delay loop
    OverFlowVar  var word        '
    Thousands    var bit         ' Flag for count >= 1000 & < 10 000
    TenThousands var bit         ' Flag for count >= 10 000
    
    ;===========================================
    Temp   	        Var     byte
    Temperature     Var     Word
    TempC           Var     Word
    I               Var     Byte
    Sign            Var     Word
    DQ      VAR PORTA.4
    DQ_DIR  var TRISA.4
    command var byte
    pis     var byte
    ;============================================
        ' Variable and software initialisation
        ' ------------------------------------
        '
    tobedisplay = 0 ' set initial value of count
    TMR0 = 0        ' reset prescaller
    On interrupt GoTo SetVarToBeDisplay
    
    
    Gosub init1820 			' Init the DS1820
    
    command = $cc 			' Issue Skip ROM command
    Gosub write1820
    
    command = $44 			' Start temperature conversion
    Gosub write1820
    
    
    Gosub init1820 			' Do another init
    
    command = $cc 			' Issue Skip ROM command
    Gosub write1820
        
    MainLoop:
    command = $be           ' Read the temperature
    Gosub write1820
    Gosub read1820
    
        ' MainLoop
        ' ---------
        '
        ' 1. display the result of the count on RA4 pin
        ' 2. refresh display
        ' 3. reset Timer0
        ' 4. reload prescaler.
        '
        ' Duration of the procedure : 1 sec
        '           fine tuned by DelayBetweenEachDisplay Sub
        '
        ' Looping 1 sec and get results of the pulse count in
        ' TMR0 + OverFlowVar
        '
    DisplayRefresh:
            '
        ' Testing amount of count
        ' -----------------------
        '
        ' Get the result of count and place decimal point flag
        ' on the according 7 segments
        '
        'If tobedisplay>= 1000 Then
        'tobedisplay = tobedisplay / 10
        'Else
        '    tenthousands = 0
        '       thousands = 1
        'EndIf
         
        '
        ' convert digit to 7 segment output pattern
        ' -----------------------------------------
    display=ToBeDisplay dig 2 ' Read hundreds digit
    read display, digit_1     ' Convert hundreds
         if thousands==1 then digit_1=digit_1 & $7F ' enable decimal dot
                                                       ' by clearing PORTB.7
    
        display=ToBeDisplay dig 1 ' Read tenths digit
        read display, digit_2     ' Convert tens
            if tenthousands==1 then digit_2=digit_2 & $7F ' enable decimal dot                          '
                                                      ' by clearing PORTB.7
                                                      
            display=ToBeDisplay dig 0 ' Read units digit
            read display, digit_3     ' Convert units
        '
        '
        ' Send digit to 7 segments
        ' ------------------------
        For displayloop = 0 To 111 ' loop for about 1 sec
    
            ' display hundreds
            ' ----------------
            PORTA=_7seg1        ' enable hundreds 7 segment
            displayport = digit_1 ' display
            GoSub DelayBetweenEachDigit
            
            ' display tenth
            ' -------------
            PORTA=_7seg2        ' enable tenth 7 segment
            displayport = digit_2 ' display
            GoSub DelayBetweenEachDigit
            
            ' display units
            ' -------------
            PORTA=_7seg3        ' enable unit 7 segment
            displayport = digit_3 ' display
            GoSub DelayBetweenEachDigit
            
        Next
        
        ToBeDisplay = Temperature
        TMR0 = 0        ' reset prescaller
        GoTo DisplayRefresh
    
    
    DelayBetweenEachDigit:
    
        ' DelayBetweenEachDigit
        ' ---------------------
        ' Produce delay of about 3 mSec
        '
        ' Fine tuned with MPLAB StopWatch to get MainLoop = 1 sec
        '
            For delay = 1 To 307
                @ nop
            Next
            @ nop
            @ nop
            @ nop
            @ nop
            @ nop
            @ nop
            @ nop
        Return
    
    
        disable
    SetVarToBeDisplay:
        '
        ' SetVarToBeDisplay
        ' -----------------
        ' interrupt routine of TMR0 overflow
        '
        ' Reset prescaller
        ' Reset overflow flag
        '
        Temperature = ((tempERATURE>> 1)*100)+((TEMPERATURE.0*5)*10)
        INTCON.2 = 0 ' clear overflow flag
        TMR0 = 0     ' reload TMR0
        Resume
        enable
    
    '====================================================================================== 
    ' Initialize DS1820 and check for presence
    init1820:
       Low DQ              ' Set the data pin low to init
       Pauseus 500         ' Wait > 480us
       DQ_DIR = 1          ' Release data pin (set to input for high)
    
       Pauseus 100         ' Wait > 60us
       If DQ = 1 Then
          Pause 500
          Goto mainLOOP     ' Try again
       Endif
       Pauseus 400         ' Wait for end of presence pulse
       Return
    
    ' Write "command" byte to the DS1820
    write1820:
       For pis = 1 To 8      ' 8 bits to a byte
         If command.0 = 0 Then
            Gosub write0   ' Write a 0 bit
         Else
            Gosub write1   ' Write a 1 bit
         Endif
         command = command >> 1  ' Shift to next bit
       Next pis
       Return
    
    ' Write a 0 bit to the DS1820
    write0:
       Low DQ
       Pauseus 60          ' Low for > 60us for 0
       DQ_DIR = 1          ' Release data pin (set to input for high)
       Return
    
    ' Write a 1 bit to the DS1820
    write1:
       Low DQ              ' Low for < 15us for 1
     @ nop                 ' Delay 1us at 4MHz
       DQ_DIR = 1          ' Release data pin (set to input for high)
       Pauseus 60          ' Use up rest of time slot
       Return
    
    ' Read temperature from the DS1820
    read1820:
       For pis = 1 To 16     ' 16 bits to a word
         temperature = temperature >> 1  ' Shift down bits
         Gosub readbit     ' Get the bit to the top of temp
       Next pis
       If Temperature.15 then       
      Temperature= ~Temperature +1
      Sign  = 1
    Endif
       Return
    
    ' Read a bit from the DS1820
    readbit:
       temperature.15 = 1         ' Preset read bit to 1
       Low DQ              ' Start the time slot
     @ nop                 ' Delay 1us at 4MHz
       DQ_DIR = 1          ' Release data pin (set to input for high)
       If DQ = 0 Then
          temperature.15 = 0      ' Set bit to 0
       Endif
       Pauseus 60          ' Wait out rest of time slot
       Return    
    ;=================================================
    END
    Attached Images Attached Images  

  6. #6
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    What if you comment the DS1820 logic, set temperature and sign to -20 and test only the display logic?

    Robert

  7. #7
    Join Date
    Sep 2010
    Location
    Las Vegas, NV
    Posts
    305


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    Near the top of the program you set up a config line but it's commented out. I think for that chip to need to set the HS osc since you're using a 20Meg unit.

    Do you also need to set the CONFIG register to set for oscillator speed and type?

    I'm looking over the data sheet but have to catch it in fits and starts. More questions later.

  8. #8
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    Thanks for advice ....
    Indeed I commented this : ";@ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _LVP_OFF"
    But in Proteus I set the freq to 20 MHz.
    If I write "temperature=123", the display show "12.3" ; so, it's work ...but the reading of sensor not work / or the temperature is wrong calculated ...

  9. #9
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    So the LCD logic works, that's a start.

    Are you doing this only in proteus?

    Robert

Similar Threads

  1. Windows 7 64 bit problem..can anyone help???
    By ljc4141 in forum mel PIC BASIC Pro
    Replies: 16
    Last Post: - 18th July 2011, 16:29
  2. LED Machine Tach For Tired Eyes
    By Archangel in forum mel PIC BASIC Pro
    Replies: 33
    Last Post: - 27th January 2010, 15:55
  3. adding with 7 segments
    By ruijc in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 28th November 2007, 23:51
  4. 7 segments clock
    By the_apprentice in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 27th April 2006, 19:45
  5. 7 segment digit problem (using Mister E's code)
    By jmgelba in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 9th September 2005, 21:25

Members who have read this thread : 0

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