View previous topic :: View next topic |
Author |
Message |
cclough
Joined: 14 Oct 2006 Posts: 5
|
Consistent Compile Issue - Please advise |
Posted: Sat Oct 14, 2006 1:54 pm |
|
|
Greetings all,
I'm still pretty fresh to the PIC C scene, so please bear with me.
I can't seem to get it to compile due to a the error 'A numeric expression must appear here' on the Code: | else if ((input(PIN_B0)) = 0) |
Am I missing something totally obvious here? I've done something similar to this above and it works fine.
Any input would be great.
Thanks,
-Chris
Code: |
#include <10F202.h>
#fuses NOWDT //WDT Disabled
#fuses NOMCLR //Master Clear Disabled
#fuses NOPROTECT //Code Protected from reads
#use delay(clock=4000000) //4MHz Clock
#use fast_io(B) //Otherwise the compiler will want to control the TRIS
//*** Pin Definitions ***//
//GPO = Start In
//GP1 = ICSPCLK (unused)
//GP2 = Start Out
//GP3 - MCLR (MCLR disabled, 12.5V to prog)
void main()
{
int1 flag = 1; //Flag to determine if read matches 'secret'
int1 auth = 0; //Flag for state changes
int1 samp=0; //Indicates determined pulse sample
int i,x; //For loops
int read[8]; //Read byte from pulse train
int secret[8] = {0,0,0,1,1,0,0,0}; //Byte for read comparison
set_tris_b(0b11111001); //Set GP0 as input
output_high(PIN_B2); //Set GP2 initially high
while(TRUE)
if((input(PIN_B0)) && (auth=0)) //If B0 goes low AND auth flag is 0
for(x=0;x=7; x++)
delay_us(100); //Delay between bits in pulse train
for (i=0;i=3;i++) //Sample three times to determine bit
samp=input(PIN_B0);
samp=samp+samp;
if (samp<1>=2)
samp=1;
read[x]=samp; //Put sampled bit into array
for(x=0;x=7;x++)
if ((read[x])==(secret[x])) //Compare sampled byte to known byte
flag=flag&&1; //If sampled and known are equal, make Flag AND 1
//if not equal, return to top
if (flag==1) //If sampled byte was equal
output_low(PIN_B2); //Set GP2 low (enable START relay)
auth=1; //Set auth flag to disable sample
else if ((input(PIN_B0)) = 0) //If B0 goes high
output_high(PIN_B2); //Set GP2 high (disable START relay)
auth=0; //Set auth flag to allow for sample loop to start if
} //GP0 goes low again
|
|
|
|
lewiseley
Joined: 30 Oct 2003 Posts: 24 Location: skegness
|
|
Posted: Sat Oct 14, 2006 2:09 pm |
|
|
perhaps
else if ( input(pin_b0)==0) |
|
|
cclough
Joined: 14 Oct 2006 Posts: 5
|
|
Posted: Sat Oct 14, 2006 2:12 pm |
|
|
Hello - thanks for the reply.
I've tried this as well; same error :( |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Oct 14, 2006 2:43 pm |
|
|
Your code has many errors in it. This isn't really a C learning forum.
But to at least get your code to compile without errors, you need to
add braces as shown below.
Code: |
if(flag==1)
{
output_low(PIN_B2);
auth=1;
}
else if ((input(PIN_B0)) == 0)
{
output_high(PIN_B2);
auth=0;
}
|
I don't want to go through your whole code and fix all the errors. |
|
|
cclough
Joined: 14 Oct 2006 Posts: 5
|
|
Posted: Sat Oct 14, 2006 2:56 pm |
|
|
I appreciate your response, but did you need to add the criticism?
Your suggestion was helpful, and allowed me to compile. Thank you.
I'd love a critique of the code, if you're open to spending a few minutes to look it over.
-Chris |
|
|
Ttelmah Guest
|
|
Posted: Sat Oct 14, 2006 3:14 pm |
|
|
The biggest problem, is failure to bracket. C, does not magically understand what you want it to execute from a 'test'. It executes just the very next _statement/block_. If you want multiple lines to execute, then _you_ need to bracket the lines to form a single statement block.
So for example:
Code: |
while(TRUE)
//This line _alone_ is executed by the while loop
if((input(PIN_B0)) && (auth=0)) //If B0 goes low AND auth flag is 0
//If the test is true, this line gets executed
for(x=0;x=7; x++)
//Which executes this line
delay_us(100); //Delay between bits in pulse train
//We get here, if the 'if' fails
for (i=0;i=3;i++) //Sample three times to determine bit
//when the 'for' is executed, it runs this line
samp=input(PIN_B0);
//but not this one...
samp=samp+samp;
|
Best Wishes |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Oct 14, 2006 4:04 pm |
|
|
Quote: | but did you need to add the criticism? |
I debated whether or not to put that in.
The reason for all my comments was this thread earlier in the week.
http://www.ccsinfo.com/forum/viewtopic.php?t=28403
I tried to help someone with similar types of errors in their code,
such as a mis-understanding of how to use braces.
That thread went on for two pages. I would suggest changes.
The person would make a few of them. I would ask the person to
please review their code and fix all bugs of the type that I pointed out.
The person would never really completely do it.
I don't want to get caught up in a thread like that again. |
|
|
cclough
Joined: 14 Oct 2006 Posts: 5
|
|
Posted: Sat Oct 14, 2006 8:22 pm |
|
|
PCM: I figured there was another situation that sparked the statement; thank you for help.
Ttelmah: Thank you for the brief explanation.
I went through and put the brackets in the way they should be, and now things compile, and it's bouncing between statements properly. It doesn't work the way I want it to, but at least it's doing something. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun Oct 15, 2006 5:00 am |
|
|
One other error repeating in our code is the use of '=' for comparing values. A single '=' sign will assign a value, the correct way to compare a value is by using the '==' statement. Sometimes this is done correctly in your code but not always, for example all for-loops contain this error and there are more. |
|
|
cclough
Joined: 14 Oct 2006 Posts: 5
|
|
Posted: Sun Oct 15, 2006 9:02 am |
|
|
Thanks for point this out. I fixed the for-loops already, but need to go through and deal with the others.
-Chris |
|
|
|