EmbeddedRelated.com
Forums

PICC Compiler cant compile

Started by hk_gg October 27, 2008
hi..can anyone tell me why cant i compile this code at PICC Compiler?

the compiler stated that <16f84.h> "File cant be opend"
so how can i find this file?
or someone else can guide me do fix this problem?
thanks

/****************************************************************************
COMBO2.C

PIC 16F84 Combination Lock
  - all combinations are six-digits
  - master combination is '083941'
  - four transient combinations may be programmed (all keys are allowed)
  - press within one-second after master combination:
      'A' to enter 1st transient combination
      'B' to enter 2nd transient combination
      'C' to enter 3rd transient combination
      'D' to enter 4th transient combination
      '#' to enter two-digit lamp ON seconds
      '*' to enter two-digit lock ON seconds
  - setting a feature to zeros deactivates it
  - resets to first expected key five seconds after last key is pressed

                    ---------          ----------
                   |  16F84  |        |          |                        
         T
           +5 --14-|VCC    A0|-17-----|R0        |
           +5 ---4-|MCLR   A1|-18-----|R1        |
          Gnd ---5-|       A2|-1------|R2        |
         XTAL --16-|       A3|-2------|R3  KBD   |
         XTAL --15-|       B0|-6------|C0        |
                   |       B1|-7------|C1        |
                   |       B2|-8------|C2        |
                   |       B3|-9------|C3        |
                   |         |        |          |
                   |         |         ----------
                   |         |
 MANUAL SW -----12-|B6     B4|-10------------------- ILLUMINATION RELAY
 DISABLE SW ----11-|B5     B7|-13------------------- LOCK SOLENOID
                   |         |
                    ---------

        =============
        |  1 2 3 A  |  PB0
        |  4 5 6 B  |  PB1
        |  7 8 9 C  |  PB2
        |  * 0 # D  |  PB3
        =============
         PB4 5 6 7

Keyboard connector is:    C0 C1 C2 C3 R0 R1 R2 R3
PA0-3 is 4-row driver
PB0-3 is 4-column receiver
PB4 is lamp output (to illuminate keyboard, high active)
PB5 is lock disable switch input, low-active
PB6 is manual open switch input, low-active
PB7 is lock solenoid output (high active)
Uses 18mS watchdog timer

Oscillator = 4MHz crystal
Cycle time = 1uS

Jon Fick  05/14/08

***************************************************************************/
#include <16f84.h>
/* Set configuration bits in the PIC processor */
#fuses XT, NOPROTECT, WDT, PUT

#define     ON              1
#define     OFF             0
#define     HIGH            1
#define     LOW             0
#define     UP              1
#define     DOWN            0
#define     YES             1
#define     NO              0
#define     ACTIVE          1
#define     INACTIVE        0
#define     UCHAR           char
#define     UINT            long
#define     BIT             short
#define     POUND           12
#define     BLANK           0x20
#define     NOKEY           0xFF
#define     TRANS_BASE_A    6
#define     TRANS_BASE_B    13
#define     TRANS_BASE_C    20
#define     TRANS_BASE_D    27
#define     LAMP_TIME_BASE  34
#define     LOCK_TIME_BASE  37
#define     COMBO_ACTIVE_FLAG_OFFSET 6
#define     LAMP_ACTIVE_FLAG_OFFSET 2
#define     LOCK_ACTIVE_FLAG_OFFSET 2
#define     WAITKEY_TIMEOUT 75          /* at 15/second */
#define     RESET_KBD_COUNT 75          /* at 15/second */

#use delay ( clock = 4000000, restart_wdt )      /* sets appropriate
compiler constants */
#use fast_io ( A )              /* don't set TRIS on each I/O statement
*/
#use fast_io ( B )
#zero_ram

/* initialize EEPROM */
#rom 0x2100 =   {
                0, 8, 3, 9, 4, 1,               /* master combo (6) */
                0, 0, 0, 0, 0, 0, INACTIVE,     /* transient combo A (6)
and ACTIVE flag (1) */
                0, 0, 0, 0, 0, 0, INACTIVE,     /* transient combo B (6)
and ACTIVE flag (1) */
                0, 0, 0, 0, 0, 0, INACTIVE,     /* transient combo C (6)
and ACTIVE flag (1) */
                0, 0, 0, 0, 0, 0, INACTIVE,     /* transient combo D (6)
and ACTIVE flag (1) */
                1, 5, ACTIVE,                   /* lamp time seconds (2)
and ACTIVE flag (1) */
                0, 1, ACTIVE                    /* lock time seconds (2)
and ACTIVE flag (1) */
                }

/* Use #byte to assign variables to a RAM locations */
#byte   PORT_A      =   5           /* set variable that maps to memory
*/
#byte   PORT_B      =   6
#bit    MANUAL_SW   =   PORT_B.6
#bit    DISABLE_SW  =   PORT_B.5
#bit    ILL_OUT     =   PORT_B.4
#bit    LOCK_OUT    =   PORT_B.7

char GetKey ( void );                           /* prototypes */
char WaitKey ( void );
void StartOpenLock ( char cCnt );
void StartLampTimer ( char cCnt );
void GetNewData ( char cBaseAddress, char cOffset, char cKeyCount, char
cAllKeys );
void UpdateLampSetting ( void );
void UpdateLockSetting ( void );
void ClearFlags ( void );
void Flash ( void );

static long iLampCount, iLampLimit, iLockCount, iLockLimit;
static char cLampSeconds, cLockSeconds;
static char cGettingNewData, cKeyCnt;
static char cMAinvalid, cTAinvalid, cTBinvalid, cTCinvalid, cTDinvalid;
static char cTIinvalid, cTLinvalid;
static char cProgMode, cProgTimeoutCount, cResetKbdCount;

void main ( void )
    {
    char cX, cK;

    set_tris_a ( 0b11110000 );                  /* set inputs and outputs
*/
    set_tris_b ( 0b01101111 );
    port_b_pullups ( TRUE );                    /* enable pullups */
    setup_counters ( RTCC_INTERNAL, RTCC_DIV_256 );     /* 65mS roll */
    enable_interrupts ( INT_RTCC );             /* turn on timer interrupt
*/
    enable_interrupts ( GLOBAL );               /* enable interrupts */
    cKeyCnt = 0;
    ILL_OUT = OFF;                              /* turn off lamp relay */
    LOCK_OUT = OFF;                             /* turn off lock solenoid
*/
    UpdateLampSetting();                        /* update lamp timer count
*/
    UpdateLockSetting();                        /* update lock timer count
*/
    ClearFlags();
    cGettingNewData = NO;
    cProgMode = NO;

    while ( TRUE )
        {
        restart_wdt();                          /* kick dog */

        if ( MANUAL_SW == LOW )                 /* if manual open switch
pressed */
                {
                StartLampTimer ( cLampSeconds );        /* turn lamp on
*/
                StartOpenLock( cLockSeconds );          /* energize
solenoid */
                cKeyCnt = 0;
                while ( MANUAL_SW == LOW )      /* wait for switch to be
released */
                        {
                        restart_wdt();
                        }
                }
        else
                {
                cK = GetKey();          /* check if key pressed */
                if ( cK != NOKEY )      /* validate combo as entered,
could be aliased */
                        {
                        if ( DISABLE_SW == LOW )
                                {
                                StartOpenLock( cLockSeconds );  /* any key
opens lock */
                                cKeyCnt = 0;
                                }
                        else
                                {
                                if ( cK != read_eeprom ( cKeyCnt ) )    /*
if not master combo key */
                                        {
                                        cMAinvalid = ON;
                                        }
                                if ( cK != read_eeprom ( cKeyCnt +
TRANS_BASE_A ) )     /* if not transient combo key */
                                        {
                                        cTAinvalid = ON;
                                        }
                                if ( cK != read_eeprom ( cKeyCnt +
TRANS_BASE_B ) )     /* if not transient combo key */
                                        {
                                        cTBinvalid = ON;
                                        }
                                if ( cK != read_eeprom ( cKeyCnt +
TRANS_BASE_C ) )     /* if not transient combo key */
                                        {
                                        cTCinvalid = ON;
                                        }
                                if ( cK != read_eeprom ( cKeyCnt +
TRANS_BASE_D ) )     /* if not transient combo key */
                                        {
                                        cTDinvalid = ON;
                                        }
                                if ( ( cMAinvalid == OFF ) || ( cTAinvalid
== OFF ) || ( cTBinvalid == OFF ) || ( cTCinvalid == OFF ) || ( cTDinvalid
== OFF ) ) /* if any combo still good */
                                        {
                                        cKeyCnt++;                      /*
point to next code in combo */
                                        }
                                else
                                        {
                                        cKeyCnt = 0;            /* restart
count */
                                        ClearFlags();
                                        }
                                }
                        }
                }

        if ( cKeyCnt == 6 )             /* if one of the combos was
correcct */
                {
                cKeyCnt = 0;
                StartOpenLock( cLockSeconds );  /* energize solenoid for
programmed time */
                if ( cMAinvalid == OFF )        /* if master combo was
entered */
                        {
                        for ( cX = 0; cX < 50; cX++ )           /* wait
one second for a key */
                                {
                                cK = GetKey();
                                if ( cK != NOKEY )
                                        {
                                        cGettingNewData = YES;
                                        break;
                                        }
                                delay_ms ( 20 );
                                }
                        if ( cK == 'A' )        /* if changing transient
combo */
                                {
                                GetNewData ( TRANS_BASE_A,
COMBO_ACTIVE_FLAG_OFFSET, 6, YES );
                                }
                        if ( cK == 'B' )        /* if changing transient
combo */                               {
                                GetNewData ( TRANS_BASE_B,
COMBO_ACTIVE_FLAG_OFFSET, 6, YES );
                                }
                        if ( cK == 'C' )        /* if changing transient
combo */
                                {
                                GetNewData ( TRANS_BASE_C,
COMBO_ACTIVE_FLAG_OFFSET, 6, YES );
                                }
                        if ( cK == 'D' )        /* if changing transient
combo */
                                {
                                GetNewData ( TRANS_BASE_D,
COMBO_ACTIVE_FLAG_OFFSET, 6, YES );
                                }
                        if ( cK == '#' )        /* if changing lamp
seconds */
                                {
                                GetNewData ( LAMP_TIME_BASE,
LAMP_ACTIVE_FLAG_OFFSET, 2, NO );
                                UpdateLampSetting();
                                }
                        if ( cK == '*' )        /* if changing lock
solenoid seconds */
                                {
                                GetNewData ( LOCK_TIME_BASE,
LOCK_ACTIVE_FLAG_OFFSET, 2, NO );
                                UpdateLockSetting();
                                }
                        cGettingNewData = NO;
                        }
                ClearFlags();
                }
        }
    }


/******************************************************************************/
char WaitKey ( void )
        {
        char cK;

        while ( TRUE )
                {
                cK = getkey();
                if ( cK != NOKEY )
                        {
                        return ( cK );
                        }
                }
        }

char GetKey ( void )
    {
    char cKey;

    cKey = NOKEY;                               /* default is invalidated
key */
    PORT_A = 0xF0;                              /* make all four rows low
*/
    delay_ms ( 5 );                             /* wait for row lines to
settle */
    if ( ( PORT_B & 0x0F ) != 0x0F )            /* if a col is low */
        {
        delay_ms ( 5 );                         /* debounce */
        PORT_A = 0b11111110;                    /* try row 0 */
        if ( ( PORT_B & 0x0F ) == 0b00001110 )  /* check columns */
            {
            cKey = 1;
            }
        if ( ( PORT_B & 0x0F ) == 0b00001101 )
            {
            cKey = 2;
            }
        if ( ( PORT_B & 0x0F ) == 0b00001011 )
            {
            cKey = 3;
            }
        if ( ( PORT_B & 0x0F ) == 0b00000111 )
            {
            cKey = 'A';
            }
        PORT_A = 0b11111101;                    /* try row 1 */
        if ( ( PORT_B & 0x0F ) == 0b00001110 )  /* check columns */
            {
            cKey = 4;
            }
        if ( ( PORT_B & 0x0F ) == 0b00001101 )
            {
            cKey = 5;
            }
        if ( ( PORT_B & 0x0F ) == 0b00001011 )
            {
            cKey = 6;
            }
        if ( ( PORT_B & 0x0F ) == 0b00000111 )
            {
            cKey = 'B';
            }
        PORT_A = 0b11111011;                    /* try row 2 */
        if ( ( PORT_B & 0x0F ) == 0b00001110 )           /* check columns
*/
            {
            cKey = 7;
            }
        if ( ( PORT_B & 0x0F ) == 0b00001101 )
            {
            cKey = 8;
            }
        if ( ( PORT_B & 0x0F ) == 0b00001011 )
            {
            cKey = 9;
            }
        if ( ( PORT_B & 0x0F ) == 0b00000111 )
            {
            cKey = 'C';
            }
        PORT_A = 0b11110111;                    /* try row 3 */
        if ( ( PORT_B & 0x0F ) == 0b00001110 )           /* check columns
*/
            {
            cKey = '*';
            }
        if ( ( PORT_B & 0x0F ) == 0b00001101 )
            {
            cKey = 0;
            }
        if ( ( PORT_B & 0x0F ) == 0b00001011 )
            {
            cKey = '#';
            }
        if ( ( PORT_B & 0x0F ) == 0b00000111 )
            {
            cKey = 'D';
            }
        delay_ms ( 5 );
        }
    PORT_A = 0xF0;                          /* make all four rows low */
    while ( ( PORT_B & 0x0F ) != 0x0F )   /* wait until all columns are
high */
        {
        delay_ms ( 5 );
        }
    PORT_A = 0xFF;                          /* make all four rows high */
    if ( ( cKey != NOKEY ) && ( cGettingNewData == NO ) )
        {
        StartLampTimer ( cLampSeconds );        /* turn lamp on anytime a
key is pressed */
        }
    return ( cKey );
    }

void GetNewData ( char cBaseAddress, char cOffset, char cKeyCount, char
cAllKeys )
        {
        char cCnt, cK;
        char cActive = NO;              /* default = inactive */

        cProgMode = YES;
        for ( cCnt = 0; cCnt < cKeyCount; cCnt++ )
                {
                cK = WaitKey();         /* get key */
                if ( ( cAllKeys == NO ) && ( cK > 9 ) ) /* if out of range
*/
                        {
                        cK = 0;         /* zero it */
                        }
                write_eeprom ( cBaseAddress + cCnt, cK );
                if ( cK != 0 )                  /* if any key is not
zero... */
                        {
                        cActive = YES;          /* show that this field is
active */
                        }
                }
        write_eeprom ( cBaseAddress + cOffset, cActive );       /* put in
active flag */
        cProgMode = NO;
        }

void UpdateLampSetting ( void )
        {
        cLampSeconds = ( 10 * read_eeprom ( LAMP_TIME_BASE ) ) +
read_eeprom ( LAMP_TIME_BASE + 1 );
        }

void UpdateLockSetting ( void )
        {
        cLockSeconds = ( 10 * read_eeprom ( LOCK_TIME_BASE ) ) +
read_eeprom ( LOCK_TIME_BASE + 1 );
        }

void ClearFlags ( void )
        {
        cMAinvalid = OFF;       /* default is off until mismatch found */
        if ( read_eeprom ( TRANS_BASE_A + COMBO_ACTIVE_FLAG_OFFSET ) == NO
)
                {
                cTAinvalid = ON;
                }
        else
                {
                cTAinvalid = OFF;
                }
        if ( read_eeprom ( TRANS_BASE_B + COMBO_ACTIVE_FLAG_OFFSET ) == NO
)
                {
                cTBinvalid = ON;
                }
        else
                {
                cTBinvalid = OFF;
                }
        if ( read_eeprom ( TRANS_BASE_C + COMBO_ACTIVE_FLAG_OFFSET ) == NO
)
                {
                cTCinvalid = ON;
                }
        else
                {
                cTCinvalid = OFF;
                }
        if ( read_eeprom ( TRANS_BASE_D + COMBO_ACTIVE_FLAG_OFFSET ) == NO
)
                {
                cTDinvalid = ON;
                }
        else
                {
                cTDinvalid = OFF;
                }
        if ( read_eeprom ( LAMP_TIME_BASE + LAMP_ACTIVE_FLAG_OFFSET ) ==
NO )
                {
                cTIinvalid = ON;
                }
        else
                {
                cTIinvalid = OFF;
                }
        if ( read_eeprom ( LOCK_TIME_BASE + LOCK_ACTIVE_FLAG_OFFSET ) ==
NO )
                {
                cTLinvalid = ON;
                }
        else
                {
                cTLinvalid = OFF;
                }
        }

void StartOpenLock ( char cCnt )
        {
        disable_interrupts ( INT_RTCC );
        if ( cTLinvalid == NO )
                {
                LOCK_OUT = ON;                  /* energize solenoid */
                }
        iLockLimit = ( long ) cCnt * 15;        /* 15 tics per second */
        iLockCount = 0;                         /* zero timer for turning
lock solenoid off */
        enable_interrupts ( INT_RTCC );
        }

void StartLampTimer ( char cCnt )
        {
        disable_interrupts ( INT_RTCC );
        if ( cTIinvalid == NO )                 /* if lamp was programmed
for other than 0 seconds */
                {
                ILL_OUT = ON;                   /* turn on lamp */
                }
        iLampLimit = ( long ) cCnt * 15;        /* 15 tics per second */
        ilampCount = 0;                         /* zero timer for turning
lamp off */
        cResetKbdCount = 0;                     /* zero timer for keyboard
reset */
        enable_interrupts ( INT_RTCC );
        }

#int_rtcc
void TimerInterrupt ( void )          /* 65mS tic */
        {
        if ( cProgMode == YES )                         /* if in program
mode */
                {
                if ( cProgTimeoutCount++ >= 8 )
                        {
                        ILL_OUT ^= 1;                   /* toggle lamp
state to signal programming mode */
                        cProgTimeoutCount = 0;
                        }
                }
        else                                            /* if in normal
mode */
                {
                if ( iLampCount++ > iLampLimit )        /* if timeout yet
*/
                        {
                        ILL_OUT = OFF;                  /* turn lamp off
*/
                        }
                if ( cResetKbdCount++ > RESET_KBD_COUNT )
                        {
                        cKeyCnt = 0;                    /* reset to first
key */
                        }
                if ( iLockCount++ > iLockLimit )
                        {
                        LOCK_OUT = OFF;                 /* de-energize
lock solenoid */
                        }
                }
        }


Check your compiler settings, directories all pointing to the correct
place.

Could do a search for "16f84.h" and place it in your project directory
with your source files. 

> hi..can anyone tell me why cant i compile this code at PICC Compiler? > > the compiler stated that <16f84.h> "File cant be opend" > so how can i find this file? > or someone else can guide me do fix this problem?
Which processor are you using? Hi-Tech include files generally have the form "picXXXX.h" where XXXX is the processor number. However you can normally include "pic.h" and that will pick up the correct name (if you specify the processor on the command line). Andrwe
Andrew Jackson <alj@nospam.com> writes:

>> hi..can anyone tell me why cant i compile this code at PICC >> Compiler?
The presence of '#use' lines says that it's not source intended for a C compiler (which PICC mostly is) but for a compiler for some language sort-of-a-bit-like C. Thankfully, even the name of that compiler's vendor is gone from my brain at this point, so to avoid slandering any innocent bystanders I won't even guess.
>> the compiler stated that <16f84.h> "File cant be opend"
I'll bet that it did not use that message unless you (the OP) have deliberately introduced several typos into the message-text file. A suggestion: copy-and-paste the exact message text in future.
>> so how can i find this file? >> or someone else can guide me do fix this problem? > > Which processor are you using? Hi-Tech include files generally have > the form "picXXXX.h" where XXXX is the processor number.
The file names can be a bit deceptive, since many of them are used for groups of processors with similar characteristics.
> However you can normally include "pic.h"
You _should_ _always_ use '#include <pic.h>' and not any chip-specific header, when writing code for PICC.
> and that will pick up the correct name > (if you specify the processor on the command line).
... and with that compiler there is no other way to specify the processor. But the whole question is moot - the OP is attempting to compile a chunk of source obtained from someone else (because if he wrote it himself for PICC he would not have used '#use'), but has picked the wrong tool. mlp
Mark L Pappin wrote:
> Andrew Jackson <alj@nospam.com> writes: > >>> hi..can anyone tell me why cant i compile this code at PICC >>> Compiler? > > The presence of '#use' lines says that it's not source intended for a > C compiler (which PICC mostly is) but for a compiler for some language > sort-of-a-bit-like C. Thankfully, even the name of that compiler's > vendor is gone from my brain at this point, so to avoid slandering any > innocent bystanders I won't even guess. > >>> the compiler stated that <16f84.h> "File cant be opend" > > I'll bet that it did not use that message unless you (the OP) have > deliberately introduced several typos into the message-text file. > > A suggestion: copy-and-paste the exact message text in future. > >>> so how can i find this file? >>> or someone else can guide me do fix this problem? >> Which processor are you using? Hi-Tech include files generally have >> the form "picXXXX.h" where XXXX is the processor number. > > The file names can be a bit deceptive, since many of them are used for > groups of processors with similar characteristics. > >> However you can normally include "pic.h" > > You _should_ _always_ use '#include <pic.h>' and not any chip-specific > header, when writing code for PICC. > >> and that will pick up the correct name >> (if you specify the processor on the command line). > > ... and with that compiler there is no other way to specify the > processor. > > But the whole question is moot - the OP is attempting to compile a > chunk of source obtained from someone else (because if he wrote it > himself for PICC he would not have used '#use'), but has picked the > wrong tool. > > mlp
He really needs the Compiler name. But Microchip's compiler also is called PICC.
Mark

>>> hi..can anyone tell me why cant i compile this code at PICC >>> Compiler? > > The presence of '#use' lines says that it's not source intended for a > C compiler (which PICC mostly is) but for a compiler for some language > sort-of-a-bit-like C. Thankfully, even the name of that compiler's > vendor is gone from my brain at this point, so to avoid slandering any > innocent bystanders I won't even guess.
My apologies: I saw PICC and thought of the excellent HiTech product but as you correctly point out, this code isn't likely to be for it. To the OP: you need to give more background for people to help you. Which chip (exactly), which compiler. Andrew
hk_gg wrote:
> hi..can anyone tell me why cant i compile this code at PICC Compiler?
Yes. Your source is from http://www.vermontficks.org/combo2d.htm. On http://www.vermontficks.org/pic.htm, Mr. Jon Fick says: "CCS supplies the C compilers that are used to compile my source code. Unabashed and liberal use is made of the many built-in functions provided by these compilers." => The source you posted is for a CCS compiler. The PICC does not understand the special CCS built-in functions and '#' directives. If you like other people to help you (for free, in their spare time), then it is only proper to save as much of their time by quoting the original source of a project.
Hagen Patzke wrote:
> http://www.vermontficks.org/combo2d.htm.
Typo alert: combo2d.htm is the _d_escription. C-Source: http://www.vermontficks.org/combo2c.htm Schematics: http://www.vermontficks.org/combo2s.htm
Neil <NeilKurzm@worldnet.att.net> writes:

> Mark L Pappin wrote: >> Andrew Jackson <alj@nospam.com> writes: >>>> hi..can anyone tell me why cant i compile this code at PICC >>>> Compiler? >> The presence of '#use' lines says that it's not source intended for a >> C compiler (which PICC mostly is) but for a compiler for some language >> sort-of-a-bit-like C.
...
>>>> the compiler stated that <16f84.h> "File cant be opend"
> Microchip's compiler also is called PICC.
Their compiler for PIC16 chips isn't, because they don't have one. Their compilers for other chips all appear to be called "MPLAB C Compiler for X". mlp
Mark L Pappin wrote:
> Neil <NeilKurzm@worldnet.att.net> writes: > >> Mark L Pappin wrote: >>> Andrew Jackson <alj@nospam.com> writes: >>>>> hi..can anyone tell me why cant i compile this code at PICC >>>>> Compiler? >>> The presence of '#use' lines says that it's not source intended for a >>> C compiler (which PICC mostly is) but for a compiler for some language >>> sort-of-a-bit-like C. > ... >>>>> the compiler stated that <16f84.h> "File cant be opend" > >> Microchip's compiler also is called PICC. > > Their compiler for PIC16 chips isn't, because they don't have one. > Their compilers for other chips all appear to be called "MPLAB C > Compiler for X". > > mlp
They used to have one.