I2C variable to LCD


Closed Thread
Results 1 to 8 of 8
  1. #1
    Join Date
    Nov 2010
    Posts
    8

    Default I2C variable to LCD

    I am trying to send a variable to display on my LCD screen. I am using

    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE, str num_of_beacons\1]

    to write the number of beacons. I keep getting two vertical lines on the screen where that character would be.
    Normal strings with the quotes around them work fine, but this is giving me some trouble. Any ideas?

  2. #2
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924

    Default Re: I2C variable to LCD

    As usual, post your whole code.

    We can only guess about the VAR num_of_beacons.

    Do you have something like;
    Code:
    num_of_beacons[0] = $30+BVAR ' BVAR being the number you want to dispaly.
    Dave
    Always wear safety glasses while programming.

  3. #3
    Join Date
    Nov 2010
    Posts
    8

    Default Re: I2C variable to LCD

    Heres all the code:

    Code:
    clear
    
    DEFINE OSC 4 
    OSCCON.6 = 1          ' INTERNAL OSCILLATOR SELECT TO 4MHZ
    OSCCON.5 = 1          ' DURING MEPROG CONFIGURATION, USE 
    OSCCON.4 = 0          ' OSCILLATOR INTIO2
    ' Define the USART registers
    DEFINE HSER_BAUD 9600 'Hser baud rate 
    DEFINE HSER_CLROERR 1 'Hser clear overflow automatically 
    DEFINE HSER_SPBRG 25  'Hser spbrg init 
    DEFINE HSER_RCSTA 80h 'Hser receive status init 
    DEFINE HSER_TXSTA 20h 'Hser transmit status init 
    DEFINE HSER_BITS 8    'Use 8th bit for parit
    PAUSE 1000            ' PAUSE FOR A SECOND, WAITING FOR SYSTEM TO ENERGIZE
    
    ' INITIALIZE PORT E
    TRISE = %00000110      ; set PORTE
    
    ' INITIALIZE PORT D
    LATD =%00000000       ' CLEAR DATA LATCHES
    TRISD =%00001100      ' PORT D inputs/outputs
    
    ' INITIALIZE PORT C   CONTAINS TX FOR COMMUNICATION TO LCD SCREEN
    LATC =%00000000         ' CLEAR DATA LATCHES
    TRISC =%00000110        ; set all PORTC 
    TXSTA =%00100000        ; SYNC = 0, TX ENABLED, BRGH = 0
    RCSTA =%10000000        ; TX/RX ENABLED
    BAUDCON.3 = 1           ; BRG16 = 1
    SPBRGH =%00000000       ; SPBRG = 25
    SPBRG =%00011001
    PIE1.4 = 0              ; DISABLE TX INTERRUPT
    
    SSPADD = $28             'I2C BRG
    SSPSTAT.7 = 1
    SSPCON1 = %00101000
    I2C_COMM VAR PORTC.4
    I2C_CLK VAR PORTC.3
    ADDR1 VAR BYTE
    CONT_SEND VAR WORD
    ADDR1 = $50
    
    
    ' INITIALIZE PORT B
    LATB =%00000000     'CLEAR DATA LATCHES
    TRISB =%00001011    'RB2 IS CANTX, RB3 IS CANRX
    INTCON2.7 = 1       'PORT B WEAK PULL UP DISABLE
    ' 
    ' INITIALIZE PORT A
    LATA =%00000000       ' CLEAR DATA LATCHES
    TRISA =%11111111      ' PORT A ALL INPUTS
    ADCON1 =%00111111     'ALL DIGITAL I/O 
    
    'PIN DEFINITION
    ALARM1 VAR LATD.4      ' PIN 27     GENERAL ALARM
    ALARM2 VAR LATD.5      ' PIN 28     BEACON ALARM
    ALARM3 VAR LATD.6      ' PIN 29     FLASHER FAIL ALARM
    ALARM4 VAR LATD.7      ' PIN 30     OPTIONAL OL ALARM
    ALARM5 VAR LATB.4      ' PIN 37      POL ALARM1
    ALARM6 VAR LATB.5      ' PIN 38     POL ALARM2
    ALARM7 VAR LATB.6      ' PIN 39     POL ALARM3
    ALARM8 VAR LATB.7      ' PIN 40     SPARE AT THE MOMENT (9/15/11)
    
    
    
    SYSTEM_OK VAR LATD.0    'PIN 19
    
    POL_ALARM_INPUT VAR PORTB.1 'PIN 34
    POL_ALARM_INPUT2 VAR PORTC.1 'PIN 16
    POL_ALARM_INPUT3 VAR PORTC.2 'PIN 17
    PPC_INPUT VAR PORTB.0   'PIN 33
    
    
    NUMBER_OUT VAR WORD 
    
    DIP_A0 VAR PORTA.0     ' DIPS SWITCH ON PORTA FOR NUMBER OF BEACONS
    DIP_A1 VAR PORTA.1     ' DIP_AO WILL BE NUM_OF_BEACONS.Bit0
    DIP_A2 VAR PORTA.2     ' ....
    DIP_A3 VAR PORTA.3     ' DIP_A5 WILL BE NUM_OF_BEACONS.Bit5
    DIP_A4 VAR PORTA.4
    DIP_A5 VAR PORTA.5
    DIP_B1 VAR PORTE.1
    DIP_B2 VAR PORTE.2
    
    'VARIABLE
    WAIT_TIME VAR BYTE      ' TIME DELAY VARIABLE LOST BEACON
    X VAR BYTE              ' VARIABLE FOR ROLLING THROUGH BEACONS
    Y VAR BYTE              ' VARIABLE FOR ROLLING THROUGH ALARM CONFIGURATION
    NUM_OF_BEACONS VAR word[1]  ' VARIABLE TO HAVE NUMBER OF BEACON STORED INTO IT
    FLASH_STATE VAR BIT      ' VARIABLE TO STORE THE STATE OF THE FLASH
                             ' ON = 1      OFF = 0
    STATUS_CHANGE VAR BIT    ' VARIABLE BIT TO TELL THE CONTROLLER CHANGE HAS HAPPENED
    TEMP_RXB0SIDH VAR BYTE   ' TEMP BUFFER HIGH TO COMPARE THE REAL BUFFER TO
    TEMP_RXB0SIDL VAR BYTE   ' TEMP BUFFER LOW TO COMPARE THE REAL BUFFER TO
    LED_ALARM var bit[65]    ' CREATES 65 BITS, LABELED LED_ALARM[0-64]
    LOST_ALARM VAR BIT[65]   ' CREATES 65 BITS, LABELED LOST_ALARM[0-64]
    FF_ALARM VAR BIT[65]     ' CREATES 65 BITS, LABELED FF_ALARM[0-64]
    NORMAL_BEACON VAR BIT[65]  ' CREATES 65 BITS, LABELED NORMAL_BEACON[0-64]
    NUM_OF_POLS VAR word
    
    FFA_OK VAR BYTE         
    LOST_OK VAR BYTE
    LED_OK VAR BYTE
    COMM_OK VAR BYTE
    
    
    HIGH ALARM1                   ' START ALL ALARMS OFF
    HIGH ALARM2  
    HIGH ALARM3  
    HIGH ALARM4  
    low ALARM5  
    LOW ALARM6  
    LOW ALARM7
    LOW ALARM8 
     
    
    
    '***************** BEGINNING OF ECAN CONFIGURATION******************
    CANCON=%10000000      ' Configuration Mode
    while CANSTAT !=$80   ' Wait until Canstat is in Config Mode
    PAUSE 10              ' Pause if not 
    WEND                  ' proceed
    ECANCON =%00000000    ' Mode 0
    
    ' Baud Rate = 50bps @ 4 MHZ WITH 10 TQ
    BRGCON1 =$03  
    BRGCON2 =$92  
    BRGCON3 =$02    
    
    ' Setting up Receive Mask 0 register
    RXM0SIDH =%10000000      ' 1'S IMPORTANT, 0'S WILL CHANGE
    RXM0SIDL =%11100000
    ' Setting up Receive Filter 0 register
    RXF0SIDH =%00000000      ' $004, STANDARD FOR BEACON TO CONTROLLER ID'S
    RXF0SIDL =%10000000      ' $00C, $014, $01C...
    
    CANCON=%00000000         ' NORMAL Mode
    while CANSTAT !=$00      ' Wait until Canstat is in NORMAL Mode
    PAUSE 10                 ' Pause if not 
    WEND
    '***************** END OF ECAN CONFIGURATION******************
    
    'RECEIVE BUFFER 0 CONTROL REGISTER
    RXB0CON.6 = 0             ' MEANS BUFFER 0 ONLY RECEIVES STANDARD ID'S
    RXB0CON.5 = 1     
    
    'TRANSMIT BUFFER 0 INITIATE, USED FOR CALLING OUT TO BEACON
    TXB0DLC =%00000001        ' LOAD DATA LENGTH, 1 BYTE
    TXB0D0 =%01110111         ' DATA IS $77, MEANING "BEACON CHECK IN"
    TXB0CON.0 = 1             ' LOW Priority
    TXB0CON.1 = 0             
    
    'TRANSMIT BUFFER 1 INITIATE, USED TO SEND FLASHING SIGNAL
    TXB1DLC =%00000001        ' LOAD DATA LENGTH, 1 BYTE
    TXB1SIDH =%00000000       ' ID $000
    TXB1SIDL =%00000000       ' ALL BEACON WILL ACCEPT THIS ID
    TXB1CON.0 = 1             ' HIGHEST PRIORITY INSIDE CHIP
    TXB1CON.1 = 1        
    
    'VARIABLE CONFIGURATION
    STATUS_CHANGE = 1               ' START WITH CHANGE, MAKES LCD SCREEN DISPLAY SOMETHING
    FLASH_STATE = 0                 ' BEACONS STARTS OFF
    TEMP_RXB0SIDH =%00000000        ' STARTING RECEIVE BUFFER ID $004
    TEMP_RXB0SIDL =%10000000        ' FIRST BEACON WILL SEND ID $00C
    
    'INITIATE NUM_OF_POLS
    
    IF DIP_B2 = 0 AND DIP_B1 = 0 THEN           'DIP SETTINGS FOR AMOUNT OF POLS
    NUM_OF_POLS = 0
    ENDIF
    
    IF DIP_B2 = 0 AND DIP_B1 = 1 THEN
    NUM_OF_POLS = 1
    ENDIF
    
    IF DIP_B2 = 1 AND DIP_B1 = 0 THEN
    NUM_OF_POLS = 2
    ENDIF
    
    IF DIP_B2 = 1 AND DIP_B1 = 1 THEN
    NUM_OF_POLS = 3
    ENDIF
    
    
    
    'INITIATE NUM_OF_BEACONS
    IF DIP_A0 = 0 THEN
    NUM_OF_BEACONS.BIT0 = 0
    ELSE
    NUM_OF_BEACONS.BIT0 = 1
    ENDIF
    
    IF DIP_A1 = 0 THEN
    NUM_OF_BEACONS.BIT1 = 0
    ELSE
    NUM_OF_BEACONS.BIT1 = 1
    ENDIF
    
    IF DIP_A2 = 0 THEN
    NUM_OF_BEACONS.BIT2 = 0
    ELSE
    NUM_OF_BEACONS.BIT2 = 1
    ENDIF
    
    IF DIP_A3 = 0 THEN
    NUM_OF_BEACONS.BIT3 = 0
    ELSE
    NUM_OF_BEACONS.BIT3 = 1
    ENDIF
    
    IF DIP_A4 = 0 THEN
    NUM_OF_BEACONS.BIT4 = 0
    ELSE
    NUM_OF_BEACONS.BIT4 = 1
    ENDIF
    
    IF DIP_A5 = 0 THEN
    NUM_OF_BEACONS.BIT5 = 0
    ELSE
    NUM_OF_BEACONS.BIT5 = 1
    ENDIF
    
    NUM_OF_BEACONS.BIT6 = 0
    NUM_OF_BEACONS.BIT7 = 0
    
    IF NUM_OF_BEACONS =%00000000 THEN 
    NUM_OF_BEACONS = 64
    ENDIF
    '**********************Read and clear RXBO*************************'
    'IF RXB0D0 = %00000000 THEN    ' SIMPLY READ THE BUFFER, it will flush itself
    'PAUSE 1                       ' DO NOTHING
    'ELSE 
    'PAUSE 1                       ' DO NOTHING
    'ENDIF 
    '****************ALARM BIT CONFIGURATION************************
    Y = 1                      ' START AT FIRST BIT OF EACH ARRAY 
    WHILE Y <= NUM_OF_BEACONS  ' ALL ALARMS FOR ALL BEACON MUST BE SET TO ZERO
    LED_ALARM[X] = 0           ' 0 IS NO ALARM, 1 IS AN ALARM CONDITION 
    LOST_ALARM[Y] = 0
    FF_ALARM[Y] = 0
    NORMAL_BEACON[Y] = 1       ' NORMAL_BEACON = 1 IS GOOD, NORMAL_BEACON = 0
    Y = Y + 1                  ' MEANS THERE IS AN ALARM CONDITION
    WEND                       ' CONTINUE WHEN ALL BEACONS ARE ASSIGNED
    '*************INTERRUPT CONFIGURATION******************************
    INTCON =%10100000    ' ENABLE GLOBAL INTERRUPT
                         ' TIMER 0 INT ENABLED, FLAG LOW
                         
    ON INTERRUPT GOTO INTAWHAT
    
    '**************TIMER0  CONFIGURATION
    T0CON =%00000100      ' TIMER 0, 16BITS, PRESCALE 1:32, TIMER0 IS OFF
    TMR0H =%10110000      ' CREATES .66 SECOND START TIME
    TMR0L =%10000000
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$52,$30]
    PAUSE 10
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]
    PAUSE 10
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"Point Lighting Corp"]
    PAUSE 10
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$40,"Obstruction Lighting"]
    PAUSE 10
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"     Controller"]
    PAUSE 10
    
    PAUSE 2000
    
    '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    '$$$$$$$$$$$$$$$$$$$$$$$$____OPERATING CODE STARTS HERE_____$$$$$$$$$$$$$$$$$$
    
    
    RXB0CON.7 = 0             ' CLEAR RECEIVE BUFFER 0 FULL BIT
    T0CON.7 = 1               ' TURN ON TIMER0 JUST BEFORE MAIN PROGRAM
    
    START_CHECK:              ' STARTS THE BEACON CHECK SEQUENCE, first display info from last cycle
                               ' RETURN TO HERE AFTER ALL BEACON HAVE BEEN CHECKED    
                               
    TOGGLE SYSTEM_OK           'TOGGLE SYSTEM OK LED SO WE KNOW THE UNIT ISNT HUNG 
    
    
    IF POL_ALARM_INPUT != 1 and POL_ALARM_INPUT2 != 1 and POL_ALARM_INPUT3 != 1 AND ALARM1 != 0 AND ALARM2 !=0 AND ALARM3 !=0 AND ALARM4 != 0  THEN 
    HIGH alarm4                    'TURN OFF POL ALARM                                                 
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]
    PAUSE 10
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"System Operational"]
    PAUSE 10
    
    'I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$40,"Beacons: ",NUM_OF_BEACONS, " "]
    'PAUSE 10
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$40,"Beacons: "]
    PAUSE 10
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE, str num_of_beacons\1]
    PAUSE 10
    
    
    if num_of_polS >0 THEN
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"Obst Lights (OL): ", NUM_OF_POLS]  
    PAUSE 10 
    ENDIF
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Number of Alarms: 0"]
    PAUSE 10
    endif
     
    HSEROUT [DEC 6777]
    PAUSE 100
    HSEROUT [DEC 6888]
    
    
    IF POL_ALARM_INPUT = 1 OR POL_ALARM_INPUT2 = 1 OR POL_ALARM_INPUT3 = 1 THEN       ' CHECK POL ALARMS
    LOW ALARM4          'TURN ON POL ALARM
    LOW ALARM1          'TURN ON GENERAL ALARM
    goto DISPLAY_ERROR
    ELSE
    HIGH ALARM4
    LOW ALARM5
    LOW ALARM6
    LOW ALARM7                   'RESETING THE POL ARLARMS ON THE BOARD
    ENDIF
    
    IF ALARM2 != 0 AND ALARM3 != 0 AND ALARM4 != 0 AND ALARM5 != 1 AND ALARM6 != 1 AND ALARM7 != 1 AND ALARM8 != 1 THEN
    HIGH ALARM1
    ENDIF             'RESETING GENERAL ALARM ONLY IF NO OTHER ALARMS ARE ACTIVE
    
    
     
                          
    IF POL_ALARM_INPUT = 0 THEN       'POL 1 ALARM INPUT  RESET TO PLC
    HSEROUT [DEC 9981]
    PAUSE 50
    ENDIF
    
    IF POL_ALARM_INPUT2 = 0 THEN    'POL 2 ALARM INPUT   RESET    TO PLC
    HSEROUT [DEC 9982]
    PAUSE 50
    ENDIF
    
    IF POL_ALARM_INPUT3 = 0 THEN    'POL 3 ALARM INPUT RESET     TO PLC
    HSEROUT [DEC 9983]
    PAUSE 50
    ENDIF
    
                      
    TXB0SIDH =%00000000       ' ID $000, RETURN TO STARTING TRANSMIT BUFFER 1 ID'S
    TXB0SIDL =%00000000       ' ID LOW DOES NOT CHANGE
            
    TEMP_RXB0SIDH =%00000000   ' STARTING RECEIVE BUFFER ID $000, WILL ALWAYS BE 
                               ' INCREMENTED TO $00C FOR FIRST BEACON
    X = 1                      ' STARTS AT FIRST BEACON
    NEXT_CHECK:
    WHILE X <= NUM_OF_BEACONS   ' WHILE X IS LESS THEN OR EQUAL TO NUMBER OF BEACONS
    
    TXB0SIDH = TXB0SIDH + 1            ' INCREMENT TX BUFFER TO NEXT BEACON ID
    TEMP_RXB0SIDH = TEMP_RXB0SIDH + 1  ' INCREMENT TEMP RX BUFFER TO NEXT BEACON ID
    
    TXB0CON.3 = 1                ' REQUEST TRANSMISSION ON BUFFER 0
    WAIT_TIME = 250              ' 250 X PAUSE 12 = 3 SECOND
    WHILE TEMP_RXB0SIDH != RXB0SIDH AND WAIT_TIME > 0 ' RECEIVE BUFFER 0 HAS A NEW MESSEGE FROM
        RXB0CON.7 = 0            ' CLEAR RECEIVE BUFFER 0 FULL BIT 
        WAIT_TIME = WAIT_TIME - 1' DECREMENT COUNTER
        PAUSE 10                 ' 12 MILLISECOND PAUSE
    WEND 
                                 ' 3.0 SECOND HAS EXPIRE AND NO RESPONSE
    if wait_time = 0 THEN
    GOTO LOST_BEACON             ' GOTO LOST BEACON
    ENDIF
        
    READ_DATA0:   ' reads data from beacon
           
    if RXB0D0 !=%00000000 THEN   ' DATA INDICATES A BEACON NOT NORMAL       
    GOSUB  BEACON_ALARM           ' GOTO LED ALARM SUBROUTINE
    ENDIF                        ' DATA0 WAS NORMAL (%00000000)
    
    IF RXB0D0 =%00000000 AND NORMAL_BEACON[X] = 0 THEN ' BEACON IS NORMAL ANS IT WASN'T BEFORE
    STATUS_CHANGE = 1          ' INDICATE THAT CHANGE HAS HAPPENED
    LED_ALARM[X] = 0           ' 0 IS NO ALARM, 1 IS AN ALARM CONDITION 
    LOST_ALARM[X] = 0
    FF_ALARM[X] = 0
    NORMAL_BEACON[X] = 1       ' NORMAL_BEACON = 1 IS GOOD, NORMAL_BEACON = 0 BAD
    ENDIF
    
    RXB0CON.7 = 0          ' CLEAR RECEIVE BUFFER 0 FULL BIT 
    X = X + 1              ' INCREMENT COUNTER X 
    GOTO NEXT_CHECK        ' CHECK NEXT BEACON X LESS THEN NUM_OF_BEACONS
    WEND                   ' CHECKED ALL BEACON, X = NUM_OF_BEACONS
                           ' NOW WE DISPLAY WHAT WE FOUND OUT FROM ALL THE BEACONS
    
    IF STATUS_CHANGE = 1 THEN     ' IF A CHANGE HAS OCCURED, LCD DISPLAY MUST CHANGE
    STATUS_CHANGE = 0             ' RESET STATUS_CHANGE BIT
    Y = 1                         ' START AT FIRST BIT OF EACH ARRAY 
    WHILE Y <= NUM_OF_BEACONS     ' SCROLLING THROUGH ALL ACTIVE BEACONS
    IF NORMAL_BEACON[Y] = 1 THEN  ' IF BEACON IS NORMAL
    
    '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    if LOST_ALARM[Y] = 0 THEN     'CHECKING IF A BEACON IS LOST
    NUMBER_OUT = 1900 + Y
    HSEROUT [DEC4 NUMBER_OUT]        'TELLS THE PLC THAT THE BEACON HAS RECOVERED
    PAUSE 50
    ENDIF
       
    if FF_ALARM[Y] = 0 THEN           'CHECKING FOR FLASHER FAILURE
    NUMBER_OUT = 2900 + Y
    HSEROUT [DEC4 NUMBER_OUT]          'TELLS THE PLC THE FF ERROR IS FIXED
    PAUSE 50
    ENDIF
     
    '%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    Y = Y + 1                     ' INCREMENT Y TO TEST NEXT BEACON
    
    ELSE                  ' IF ONE BEACON IS NOT NORMAL
    GOTO DISPLAY_ERROR            ' GOTO DISPLAY ERROR
    ENDIF
    WEND                          ' WILL ONLY ESCAPE WHILELOOP HERE IF ALL BEACON 
    pause 5                       ' ARE NORMAL 
    
    
    
    
    FFA_OK = 67
    LOST_OK = 67
    LED_OK = 67
    
    LOOKDOWN2 FF_ALARM, [1], FFA_OK                      'CHECKING TO SEE IF THE VALUE 1
    LOOKDOWN2 LOST_ALARM, [1], LOST_OK                    'IS STORED IN THE ERROR LOCATIONS
    LOOKDOWN2 LED_ALARM, [1], LED_OK
                                                           'IF THERE IS NO "1" THEN THERES NO ERROR
    IF FFA_OK = 67 AND LOST_OK = 67 AND LED_OK = 67 THEN                    'SO WE CAN RESET THE ALARMS
    HIGH ALARM3                                                                
    HIGH ALARM1
    HIGH ALARM2
    ENDIF
    
    IF FFA_OK = 67 AND LOST_OK = 67 AND LED_OK != 67 THEN                        'IF THE COMM AND FF ARE OK, 
    HIGH ALARM3                                                                     'BUT THE LED IS STILL OUT, 
    HIGH ALARM1                                                                   ' THEN WE CANT RESET THEM
    'HIGH ALARM2   NOT INCLUDED HERE                                              'ALL. ALARM2 (BEACON) IS LEFT OUT OF THE RESET
    ENDIF
    
    
    
    
    
    
    GOTO START_CHECK
    '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    DISPLAY_ERROR:
    
    Y = 1                         ' START AT FIRST BIT OF EACH ARRAY 
    WHILE Y <= NUM_OF_BEACONS      ' SCROLLING THROUGH ALL ACTIVE BEACONS
    IF LED_ALARM[Y] = 1 THEN        'CHECKING LED ARRAYS
    LOW  ALARM2                    'TURN ON BEACON ALARM
    LOW  ALARM1                     'TURN ON GENERAL ALARM
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]         ' ALWAYS $FE, $51 = CLEAR SCREEN
    'HSEROUT [$FE,$45,$00,"System Error"] '$45 cursor position, $00 top left
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"Beacon: ", str y\2," " ]
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$40,"LED Failure"]
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"____________________"] '$45 cursor position,
    IF NUM_OF_POLS > 0 THEN
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ", str NUM_OF_BEACONS\2," ","OLs: ",  str NUM_OF_POLS\2]
    ELSE
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ", str NUM_OF_BEACONS\2," "]
    ENDIF
    PAUSE 50
     
    
    
    NUMBER_OUT = 3000 + Y
    HSEROUT [DEC4 NUMBER_OUT]
    PAUSE 100
    ENDIF
    
    
    
    if LOST_ALARM[Y] = 1 THEN     'CHECKING IF A BEACON IS LOST
    LOW  ALARM2                    'TURN ON BEACON ALARM
    LOW  ALARM1                     'TURN ON GENERAL ALARM
    LOW ALARM3                      'TURN ON FFA ALARM
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]         ' ALWAYS $FE, $51 = CLEAR SCREEN
    'I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"System Error"] '$45 cursor position, $00 top left
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"Beacon: ", str y\2," " ]
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$40,"Lost Beacon"]
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"____________________"] '$45 cursor position,
    IF NUM_OF_POLS > 0 THEN
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ", str NUM_OF_BEACONS\2," ","OLs: ", str NUM_OF_POLS\2]
    ELSE
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Total Beacons: ", str NUM_OF_BEACONS\2," "]
    
    ENDIF
    pause 500
     
    
    NUMBER_OUT = 1000 + Y
    HSEROUT [DEC4 NUMBER_OUT]
    
    PAUSE 100
    
    ELSEif LOST_ALARM[Y] = 0 THEN     'CHECKING IF A BEACON IS LOST
    NUMBER_OUT = 1900 + Y
    HSEROUT [DEC4 NUMBER_OUT]        'TELLS THE PLC THAT THE BEACON HAS RECOVERED
    
    PAUSE 100
    ENDIF
    
    
    
    if FF_ALARM[Y] = 1 THEN           'CHECKING FOR FLASHER FAILURE
    
    LOW  ALARM2                    'TURN ON BEACON ALARM
    LOW  ALARM1                     'TURN ON GENERAL ALARM
    LOW ALARM3                      'TURN ON FFA ALARM
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]         ' ALWAYS $FE, $51 = CLEAR SCREEN
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"Beacon: ",str y\2," " ]
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$40,"Flasher Failure"]
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"____________________"] '$45 cursor position,
    IF NUM_OF_POLS > 0 THEN
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ", str NUM_OF_BEACONS\2," ","OLs: ",  str NUM_OF_POLS\2]
    ELSE
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ", str NUM_OF_BEACONS\2," "]
    ENDIF
    pause 100
     
    NUMBER_OUT = 2000 + Y
    HSEROUT [DEC4 NUMBER_OUT]
    
    PAUSE 100
    
    
    ELSEif FF_ALARM[Y] = 0 THEN           'CHECKING FOR FLASHER FAILURE
    
    NUMBER_OUT = 2900 + Y
    HSEROUT [DEC4 NUMBER_OUT]          'TELLS THE PLC THE FF ERROR IS FIXED
    
    PAUSE 100
    
    ENDIF
    
    Y = Y + 1                  ' NEXT BEACON
    WEND                       ' CONTINUE WHEN ALL BEACONS ARE ASSIGNED
    ENDIF                      ' ENDIF OF (IF STATUS_CHANGE = 1) 
    
     '------------------------------------------------------------------------
    IF POL_ALARM_INPUT = 1 THEN       ' CHECK POL ALARM 1
    HIGH ALARM5
    STATUS_CHANGE = 1 
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]            ' ALWAYS $FE, $51 = CLEAR SCREEN
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"POL Alarm: Level 1"] '$45 cursor position, 
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"____________________"] '$45 cursor position, 
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ", str NUM_OF_BEACONS\2," ","OLs: ", str NUM_OF_POLS\2]
    PAUSE 100
    HSEROUT [DEC 9991]
    
    ELSE
    LOW ALARM5
    ENDIF  
    
    IF POL_ALARM_INPUT2 = 1 THEN            'CHECK POL ALARM 2
    HIGH ALARM6
    STATUS_CHANGE = 1 
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]            ' ALWAYS $FE, $51 = CLEAR SCREEN
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"POL Alarm: Level 2"] '$45 cursor position, $00 top left
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"____________________"] '$45 cursor position,
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ",str NUM_OF_BEACONS\2," ","OLs: ",  str NUM_OF_POLS\2]
    
    PAUSE 100
    HSEROUT [DEC 9992]
    
    ELSE
    LOW ALARM6
    ENDIF 
    
    IF POL_ALARM_INPUT3 = 1 THEN       'CHECK POL ALARM 3
    HIGH ALARM7
    STATUS_CHANGE = 1 
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]            ' ALWAYS $FE, $51 = CLEAR SCREEN
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"POL Alarm: Level 3"] '$45 cursor position, $00 top left
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"____________________"] '$45 cursor position,
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ",str NUM_OF_BEACONS\2," ","OLs: ",str  NUM_OF_POLS\2]
    PAUSE 100
    HSEROUT [DEC 9993]
    PAUSE 100
    
    ELSE
    
    LOW ALARM7
    ENDIF                          
    '-----------------------------------------------------------------
    
    GOTO START_CHECK
    
    
    
    
    BEACON_ALARM:           ' ALL ALARM MESSEGES GO TO THIS LOCATION, MUST FILTER
                            ' ALARM AND SET ALARM BIT TO 1 OF FAILED BEACON 
    IF RXB0D0 = %00001111 and RXB0DLC = %00000010 THEN' DATA0 ID $0F FOR LED ALARM ON BEACON
    STATUS_CHANGE = 1               ' CHANGE HAS HAPPENED
    NORMAL_BEACON[X] = 0            ' NORMAL BIT OFF
    LED_ALARM[X] = 1                ' LED ALARM BIT ON
    ENDIF
    
    IF RXB0D0 = %11111111 THEN      ' DATA0 ID FOR FLASHER FAIL ON BEACON
    STATUS_CHANGE = 1               ' CHANGE HAS HAPPENED
    NORMAL_BEACON[X] = 0            ' NORMAL BIT OFF
    FF_ALARM[X] = 1                 ' FF ALARM BIT ON
    ENDIF
    RETURN                          ' RETURN BACK TO CODE AFTER BITS ARE ASSIGNED
    
    LOST_BEACON:                    ' LOST BEACON COME HERE
    STATUS_CHANGE = 1               ' CHANGE HAS HAPPENED
    NORMAL_BEACON[X] = 0            ' NORMAL BIT OFF
    LOST_ALARM[X] = 1               ' LOST ALARM BIT ON
    X = X + 1                       ' INCREMENT COUNTER X
    
    
    
    
    
    GOTO NEXT_CHECK                 ' GOTO NEXT CHECK, NO DATA0 TO READ
    
    
    
    
    '***************************INTERRUPT BEGINS**********************************
    DISABLE                      ' MUST DISABLE BEFORE INTERRUPT ROUTINE IS USED
    
    INTAWHAT:                    ' INTERRUPT HAS OCCURRED
    TOGGLE SYSTEM_OK
    
    
    T0CON.7 = 0                  ' STOP TIMER WHILE EVERYTHING IS RESET
    
    IF FLASH_STATE = 1 THEN      ' IF BEACONS WERE ON
    FLASH_STATE = 0              ' TURN FLASH_STATE BIT LOW FOR NEXT CYCLE
    
    TXB1D0 =%00000000            ' DATA IS $00, MEANING "FLASHING OFF"
    TXB1CON.3 = 1                ' REQUEST TRANSMISSION ON BUFFER 1
    WHILE TXB1CON.3 != 0         ' HAS IT TRANSMITTED
    if COMSTAT.0 = 1 THEN        ' TX ERROR WARNING OR RX ERROR WARNING
    
    'comm error code here           'PROGRAM LOOPS HERE UNTIL COMM IS GOOD
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]            ' ALWAYS $FE, $51 = CLEAR SCREEN
    'HSEROUT [$FE,$45,$00,"System Error"] '$45 cursor position, $00 top left
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"Communcation Error"] '$45 cursor position, $00 top left
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$40,"Flasher Failure"] '$45 cursor position, $40 second row
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"____________________"] '$45 cursor position,
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ",str NUM_OF_BEACONS\2," ","OLs: ",  str NUM_OF_POLS\2]
    
    HSEROUT [DEC 7777]
    
    hserout [dec 8888]
    
    
    
    STATUS_CHANGE = 1
    PAUSE 1000                     ' PAUSE 1000 MS WHILE WAITING
    
    ENDIF
    PAUSE 10                     ' PAUSE 10 MS WHILE WAITING
    WEND                         ' TRANSMITTION SUCCESSFUL
    
    INTCON.2 = 0                 ' RESET TIMER0 INT FLAG
    TMR0H =%10110000             ' CREATES .66 SECOND BETWEEN NEXT INTERRUPT
    TMR0L =%10000000 
    
    ELSEif flash_state = 0 then      ' ELSE BEACONS WERE OFF  
    FLASH_STATE = 1              ' TURN FLASH_STATE BIT HIGH FOR NEXT CYCLE
    
    TXB1D0 =%11111111            ' DATA IS $FF, MEANING "FLASHING ON"
    TXB1CON.3 = 1                ' REQUEST TRANSMISSION ON BUFFER 1
    WHILE TXB1CON.3 != 0         ' HAS IT TRANSMITTED
    
    if COMSTAT.0 = 1 THEN        ' TX ERROR WARNING OR RX ERROR WARNING
    
    'comm error code    here         'PROGRAM LOOPS HERE UNTIL COMM IS GOOD
    
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$51]            ' ALWAYS $FE, $51 = CLEAR SCREEN
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$00,"Communcation Error"] '$45 cursor position, $00 top left
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$40,"Flasher Failure"] '$45 cursor position, $40 second row
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$14,"____________________"] '$45 cursor position,
    I2CWRITE I2C_COMM, I2C_CLK, CONT_SEND, ADDR1, [$FE,$45,$54,"Beacons: ",str NUM_OF_BEACONS\2," ","OLs: ",  str NUM_OF_POLS\2]
    
    
    HSEROUT [DEC 7777]
    
    hserout [dec 8888]
    
    
    
    STATUS_CHANGE = 1 
    
    PAUSE 1000                     ' PAUSE 1000 MS WHILE WAITING
    ENDIF
    PAUSE 10                     ' PAUSE 10 MS WHILE WAITING
    WEND                         ' TRANSMITTION SUCCESSFUL
    
    
    
    INTCON.2 = 0                 ' RESET TIMER0 INT FLAG
    TMR0H =%00001010             ' CREATES 2 SECOND BETWEEN NEXT INTERRUPT
    TMR0L =%00000000
    ENDIF
    
    T0CON.7 = 1                  ' START TIMER 
    RESUME                       ' GO BACK TO WHERE CODE WAS INTERRUPTED
    ENABLE                       ' MUST USE ENABLE
    
    end                          ' MUST END WITH END

  4. #4
    Join Date
    Nov 2010
    Posts
    8

    Default Re: I2C variable to LCD

    Looks like I got it working after adding the $30 to the value. I couldn't find anything in the help about having to add the $30, what is the reason for it?

  5. #5
    Join Date
    Nov 2010
    Posts
    8

    Default Re: I2C variable to LCD

    Looks like I spoke too soon. It seems to display numbers up to 3 fine, then freaks out. I have up to 64 beacons, how can I make this work?

  6. #6
    Join Date
    Nov 2010
    Posts
    8

    Default Re: I2C variable to LCD

    Got it working, the screen needed the HEX characters, and I was trying to send it DECIMAL. A bit more code required, but problem solved.

  7. #7
    Join Date
    Aug 2010
    Location
    Maryland, USA
    Posts
    869

    Default Re: I2C variable to LCD

    Glad we could help -LOl. Really nice you got it going
    -Bert

    The glass is not half full or half empty, Its twice as big as needed for the job!

    http://foamcasualty.com/ - Warbird R/C scratch building with foam!

  8. #8
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924

    Default Re: I2C variable to LCD

    The 30 + x is an ASCII string thing.
    Dave
    Always wear safety glasses while programming.

Members who have read this thread : 2

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