Digital Altimeter/Barometer/Voltmeter Basic Program

Declarations and Data

#rem "14M2_Altimeter_Barmeter_Voltmeter.bas"

John Saunders 5/22/2015 added barometer

#endrem

#PICAXE 14M2



symbol AltitudeRange    = bit2

symbol Iter            = b1

symbol Digit        = b2

symbol SettingCounter    = b3

symbol BitPos        = b4

symbol Mask            = b5

symbol ReadingCounter    = b6

symbol DisplayMode    = b7        '0=Altimeter,1=Setting,2=Barometer,3=Voltmeter

symbol BaroBase        = w8

symbol Reading        = w9

symbol ZeroAlt        = w10

symbol AnalogValue    = w11


rem Input-Output

symbol Clock        = B.1        'Drives Display Controller MC14489

symbol Enable        = B.2

symbol Outdata        = B.3

symbol Upbutton        = PINC.1

symbol Downbutton        = PINC.2



rem Constants

symbol ThreeDigitCmd    = %0111    'For blanking 2 leading zeroes

symbol FourDigitCmd    = %0011    'For blanking 1 leading zero

symbol FiveDigitCmd    = %0001

symbol Cmd4MSB        = %0100

symbol VoltOffset        = 509        'Adjusts voltage range to 5 - 15V

symbol UpperRangePoint    = 508        '5700 ft altitude, provides hysterisis

symbol UpperRangeBase    = 13500    'Best fit by analysis for > 5500'

symbol LowerRangePoint    = 538        '5300 ft altitude, provides hysterisis

symbol LowerRangeBase    = 12250    'Best fit by analysis for < 5500'

symbol Altimeter         = 0

symbol Setting         = 1

symbol Barometer        = 2

symbol Voltmeter        = 3

symbol BaroMult        = 32

symbol BaroDivisor    = 25


DATA 0,(8,4,2,1)                'Mask of bits for DispHex

Init and Main

init:

High Enable                    'Low is active for MC14489

LET ZeroAlt = LowerRangeBase

IF Upbutton = 1 THEN

    LET DisplayMode = Barometer

ELSE

    LET DisplayMode = Altimeter

ENDIF


main:    

pause 100


IF Upbutton  = 1 AND Downbutton = 1 AND DisplayMode = Altimeter THEN    'To set for barometer correction

    LET DisplayMode = Setting

    DEC SettingCounter

ENDIF


IF DisplayMode <> Setting THEN

    IF Upbutton  = 1 THEN

        LET DisplayMode = Altimeter

    ENDIF

    IF Downbutton  = 1 THEN

        LET DisplayMode = Voltmeter

    ENDIF

ENDIF


IF DisplayMode    = Voltmeter THEN    

    READADC10 C.4,AnalogValue

ELSEIF DisplayMode = Altimeter THEN

    READADC10 C.0,AnalogValue

    IF AltitudeRange = 0 AND AnalogValue < UpperRangePoint THEN

        LET AltitudeRange = 1

        LET ZeroAlt = UpperRangeBase

    ELSEIF AltitudeRange = 1 AND AnalogValue > LowerRangePoint THEN

        LET AltitudeRange = 0

        LET ZeroAlt = LowerRangeBase

    ENDIF

ELSEIF DisplayMode = Barometer THEN

    READADC10 C.0,AnalogValue

ENDIF

INC ReadingCounter

LET Reading = Reading + AnalogValue

IF DisplayMode = Altimeter THEN

    LET Digit = 3 * AltitudeRange + 13

ELSE

    LET Digit = BaroMult

ENDIF

IF ReadingCounter >= Digit THEN

RepeatSetting:

    IF DisplayMode = Voltmeter THEN

        LET AnalogValue = Reading / Digit + VoltOffset

    ELSEIF DisplayMode = Altimeter THEN

        IF Reading > ZeroAlt THEN

            LET AnalogValue = Reading - ZeroAlt + 50000 'To display a "L" for negative altitudes

        ELSE

            LET AnalogValue = ZeroAlt - Reading

        ENDIF

    ELSEIF DisplayMode = Barometer THEN

        LET AnalogValue = Reading/BaroDivisor + BaroBase    'In 1/100" Hg

    ENDIF


'Send the number to the MC14489 display controller

    Low Enable

    LET Digit = Cmd4MSB

    GOSUB SendHex

    LET Digit = ThreeDigitCmd

    IF AnalogValue < 1000 OR AnalogValue > 20000 THEN SendCmd

    LET Digit = FourDigitCmd

    IF AnalogValue < 10000 THEN SendCmd

    LET Digit = FiveDigitCmd

SendCmd:

    GOSUB SendHex            'This blanks leading zeroes

    PULSOUT Enable,10

    IF DisplayMode = Setting THEN

        LET Digit = 7     'Displays an "C" in setting Mode by energising segments a,d,e,f

    ELSE

        LET Digit = 0      

    ENDIF

    GOSUB SendHex

    FOR Iter = 0 to 4

        LET Digit = AnalogValue // 10

        LET AnalogValue = AnalogValue / 10

        GOSUB SendHex

    NEXT

    High Enable

'End sending number

    IF DisplayMode = Setting THEN

        IF Upbutton  = 1 THEN

            INC ZeroAlt

        ENDIF

        IF Downbutton  = 1 THEN

            DEC ZeroAlt

        ENDIF

        IF SettingCounter > 0 THEN

            DEC SettingCounter

            GOTO RepeatSetting

        ELSE 

            LET DisplayMode = Altimeter    'Timer to terminate setting mode

        ENDIF

    ENDIF

    LET ReadingCounter = 0

    LET Reading = 0

ENDIF

goto main

Subprograms

SendHex:                'Input is in digit

FOR BitPos = 0 TO 3        'Faster than the shiftout workaround in the manual

    READ BitPos,Mask

    LET Mask = Digit & Mask 

     LOW Outdata

    IF Mask = 0 then Charbitislow

    HIGH Outdata

Charbitislow:

     PULSOUT Clock,1

NEXT

RETURN