|
|
View previous topic :: View next topic |
Author |
Message |
JohnP Guest
|
Function prototype issue? |
Posted: Sun Aug 02, 2009 11:45 am |
|
|
I am trying to compile a program made up of snippets of working code from previous projects...
void SerialReceive(void); // apprears earlier in code.
void main()
// bunch of configuration
// etc/
//*************************************
// Main Loop
//**************************************
while (1)
{
//When a packet is received on the tool bus, NewPacket is set.
//Process received packet and reply.
if(NewPacket)
{
disable_interrupts(INT_RDA); //disable serial port interrupts
NewPacket = FALSE; //clear flag
SerialReceive(); //get received packet
enable_interrupts(INT_RDA); //enable serial port interrupts
}
if (Tick)
{
Tick = 0;
output_toggle(PIN_D7); //Show that Timer0 is generating a 1/2 sec timer
fputs( " | HI ! | ",HOST_PC );
output_toggle(PIN_D0); //Toggle the D0 D1 pin pattern
output_toggle(PIN_D1); //
rs232_errors = 0; // clear errors just to clear warning...
}
}//end of MAIN LOOP
void SerialReceive(void) // compiler does not like this line and
// focuses on the "void" ...
{
Checksum = 0;
delay_us(50); //short dead time to allow bus master to get ready to receive
if(SerialError) //received an error in packet
{
CREN = 0; //turn off receiver
putc(Buff[0]); //echo board address
while(!TRMT); //wait for transmit buffer to finish
when I try to compile this I get the DREADED non-specific, utterly confusing; " A numeric expression must appear here..." pointing to the first line of code
This funtion comiles noprmally in other code...and I have looked for obvious missing braces etc. Actually no funtions will compile after my brief main section...So something is hosed in there...but I can't find it.
Any help appreciated...from reading other posts, I see you can get this message from a host of arcane sources...Hoo Boy, what fun!
JPR |
|
|
bungee-
Joined: 27 Jun 2007 Posts: 206
|
Re: Funtion prototype issue? |
Posted: Sun Aug 02, 2009 11:51 am |
|
|
JohnP wrote: | I am trying to compile a program mad eup of snippets of working code from previous projects...
when I try to compile this I get the DREADED non-specific, utterly confusing; " A numeric expression must appear here..." pointing to the first line of code
This funtion comiles noprmally in other code...and I have looked for obvious missing braces etc. Actually no funtions will compile after my brief main section...So something is hosed in there...but I can't find it.
Any help appreciated...from reading other posts, I see you can get this message from a host of arcane sources...Hoo Boy, what fun!
JPR |
Paste complete code. You probably overlooked something and use CODE for pasting a source it is easier to "debug" |
|
|
JohnP Guest
|
Reply |
Posted: Sun Aug 02, 2009 11:56 am |
|
|
Here is the code...implements a ninth bit serial RX funtion...
Works great in other uses...I am clearly missing something simple?
Code: |
#define RecvTimeout 20000 // increased for debug 6/7/06
// define legal addresses
#define PMTAddress1 70
#define PMTAddress2 80
#define PMTAddress3 90
// Need to find where these come from?????
#byte RCSTA2 = 0xF6B //Receive status control register
#bit SPEN = 0xF6B.7 //Serial Port Enable
#bit RX9 = 0xF6B.6 //9-bit receive enable
#bit CREN = 0xF6B.4 //Receive Enable
#bit ADDEN = 0xF6B.3 //Address detect enable
#bit FERR = 0xF6B.2 //framing error
#bit OERR = 0xF6B.1 //overrun error
#bit RX9D = 0xF6B.0 //9th bit of received data
#byte TXSTA2 = 0xF6C //Transmit status and control register
#bit TX9 = 0xF6C.6 //9-bit transmit enable
#bit TXEN = 0xF6C.5 //Transmit enable
#bit TRMT = 0xF6C.1 //Transmit buffer is empty
#bit TX9D = 0xF6C.0 //9th bit of transmit data
#byte RCREG2 = 0xF6E //receive register
#byte PIR1 = 3998
#bit RCIF= 3998.5 //usart receive interrupt flag
int1 NewPacket;
int1 PMT_changed;
int16 Tout;
int8 RecvPacketSize;
int8 PacketSize;
int16 TotPacketSize;
int8 H;
int8 L;
int8 Checksum;
int8 RecvPointer;
int8 Adr;
int8 SerialError;
int8 Status, TempCount;
int1 Tick, toggle;
int16 temperature, temptemp;
unsigned int16 dac_value, pmt_set_value, buf_value, temp_value;
unsigned int16 default_PMT = 44239; // initialize to 1350 volts
int8 PowerOnTimer;
//ready to be xmited
int8 Rcmd; //received command
int8 Buff[30]; //serial communications buffer
int8 CB;
int8 CL;
int8 CH;
int8 ReceivedAddress; //value read from serial port with 9th bit set
int *pntr;
int16 CVsetpoint;
int16 Timer0_Clk;
//int8 B1, B2, B3, B4, B5, B6, B7, B8; // temporary variables
void ReadTemp(void);
void SerialReceive(void);
void SendStatus(void);
void SetSerialNumber(void);
void SendReport(void);
void ChangePMT(void);
void IncrementPMT(void);
void DecrementPMT(void);
void WriteCalDate(void);
void WritePMTVoltage(void);
void Write_new_SN(void);
void WriteMfgDate(void);
void WriteFirmwareVersion(void);
void WriteHardwareVersion(void);
void SetMfgDate(void);
void SetFirmwareRev(void);
void SetHardwareRev(void);
void SendPMTVoltage(void);
/********************************************************************
* RTCC - Timer 0 Interrupt *
********************************************************************/
#int_TIMER0
TIMER0_ISR()
{
set_timer0(15536); // reload for 10 msec tick, based on value from above number
// = 655356 - (.01/(8 /40,000,000))
// this gives a 94.67 hz pulse so a lot closer than the previous value
Timer0_Clk++; // 10 msec clock event counter
if (Timer0_Clk > 50)
{
Tick = 1; //500 msec clock tick
}
}// end of Timer0 ISR
#int_RDA
void RDA_isr(void)
{
// handler for input commands from the Host PC would go here...
}
//**************************************************************************
// STB Serial ISR
//
// Receive Interrupt - when address bit is set
// in 1st xmission matches the BoardAddress
//**************************************************************************
#int_RDA2
void RDA2_isr(void)
{
int CS;
NewPacket = 0;
SerialError = 0;
ReceivedAddress = RCREG2; //get byte from receive buffer
if ( (ReceivedAddress == PMTAddress1) || (ReceivedAddress == PMTAddress2) || (ReceivedAddress == PMTAddress3) )
{
//output_high(PIN_B6); // for debug!!!! Set while wating for next byte
NewPacket = 1; //set flag for new packet is coming
ADDEN = 0; //allow receiver to get the rest of the packet
//output_low(PIN_B6);
Buff[0] = ReceivedAddress; //shove address into 1st slot...
//Receive packet size High Byte
Tout = RecvTimeout;
while(RCIF == 0) //wait for next byte in receiver
{
Tout--;
//output_high(PIN_B6); // for debug!!!!Set while wating for next byte
if(Tout == 0)
{
SerialError = 130; //Timeout error
goto ErrorTest;
}
}
//output_low(PIN_B6); // for debug!!!! 2nd byte arrived
Buff[1] = RCREG2; //get size byte from serial port
// Receive packet size Low byte
Tout = RecvTimeout;
while(RCIF == 0) //wait for next byte in receiver
{
Tout--;
//output_high(PIN_B6); // for debug!!!!Set while wating for next byte
if(Tout == 0)
{
SerialError = 130; //Timeout error
goto ErrorTest;
}
}
//output_low(PIN_B6); // for debug!!!!last size byte arrived
Buff[2] = RCREG2; //get byte from serial port
RecvPacketSize = Buff[2]; //add size and checksum to packet size
// --- receive packet
RecvPointer = 3; //position pointer at first byte
// receive rest of packet past the packet size bytes.....
while(RecvPointer < (RecvPacketSize+1))
{
Tout = RecvTimeout;
while(RCIF == 0)
{
Tout--;
// output_high(PIN_B6); // for debug!!!!Set while wating for next byte
if(Tout == 0)
{
SerialError = 130; //Timeout error = 0x82
goto ErrorTest;
}
}
// output_low(PIN_B6); // for debug!!!! next byte here
Buff[RecvPointer] = RCREG2; //save packet data in buffer array
RecvPointer++;
}// end of while RCVpointer <= RecvPacetsize
CS = 0;
RecvPointer = 1;
while(RecvPointer < Buff[2])
{
CS = CS + Buff[RecvPointer];
RecvPointer++;
}
CS = ~(CS) + 1; //CheckSum is now 2's complement
RecvPacketSize = Buff[2];
if (CS != Buff[RecvPacketSize])
{
SerialError = 129; //checksum error = 0x81
}
}// End of IF Rc'd addr = Board Address
ErrorTest:
ADDEN = 1; //enable interrupt when address bit is set
}// end of RDA2 ISR
void main()
{
setup_adc_ports(AN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_20);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_spi2(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED, 0,1);
setup_timer_3(T3_DISABLED);
setup_timer_4(T4_DISABLED, 0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
TX9D = 0; //9th bit of transmitted data is always low
TX9 = 1; //Enable 9-bit transmits
RX9 = 1; //Enable 9-bit receives
setup_low_volt_detect(FALSE);
set_tris_a(0xFF); // all inputs
set_tris_b(0xFF); // all inputs
set_tris_c(0x80); //Set up for UART1 = HOST_PC on C7(Rx)Input and C6 (TX) and all others are outputs
set_tris_d(0); //All outputs to drive diodes and diagnostics
set_tris_e(0xFF); // all inputs
set_tris_f(0xFF); // all inputs
set_tris_g(0xFF); // all inputs
set_tris_h(0x80); //Set up for UART2 = STB on H7 (Rx)Input and H6 (TX) and all others are outputs
set_tris_j(0xFF); // all inputs
// setup_uart(115200, HOST_PC);
// setup_uart(115200, STB);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
// Crive pin D0 high to turn on diode D1
output_high(PIN_D0); //Turn on D1 to signify we made it this far!!!
output_high(PIN_D1);
output_high(PIN_D2);
output_high(PIN_D3);
output_high(PIN_D4);
output_high(PIN_D5);
output_high(PIN_D6);
output_high(PIN_D7);
delay_ms(1000);
output_low(PIN_D1);
output_low(PIN_D2);
output_low(PIN_D3);
output_low(PIN_D4);
output_low(PIN_D5);
output_low(PIN_D6);
output_low(PIN_D7);
Timer0_Clk = 0;
enable_interrupts(INT_RDA);;
enable_interrupts(INT_RDA2);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
Checksum = 0;
//*************************************
// Main Loop
//**************************************
while (1)
{
//When a packet is received on the tool bus, NewPacket is set.
//Process received packet and reply.
if(NewPacket)
{
disable_interrupts(INT_RDA); //disable serial port interrupts
NewPacket = FALSE; //clear flag
SerialReceive(); //get received packet
enable_interrupts(INT_RDA); //enable serial port interrupts
}
if (Tick)
{
Tick = 0;
output_toggle(PIN_D7); //Show that Timer0 is generating a 1/2 sec timer
fputs( " | HI ! | ",HOST_PC );
output_toggle(PIN_D0); //Toggle the D0 D1 pin pattern
output_toggle(PIN_D1); //
rs232_errors = 0; // clear errors just to clear warning...
}
}//end of MAIN LOOP
void SerialReceive(void)
{
Checksum = 0;
delay_us(50); //short dead time to allow bus master to get ready to receive
if(SerialError) //received an error in packet
{
CREN = 0; //turn off receiver
putc(Buff[0]); //echo board address
while(!TRMT); //wait for transmit buffer to finish
putc(0); // high byte of num. of bytes
while(!TRMT); //wait for transmit buffer to finish
putc(4); //1 byte command
while(!TRMT); //wait for transmit buffer to finish
putc(SerialError); //error code
while(!TRMT); //wait for transmit buffer to finish
Checksum = ~(4 + SerialError) + 1; // CS now 2's complement
putc(Checksum); //checksum
goto SerialEnd;
}
else
{
switch (Buff[3]) //sort the received command...USES 4th BYTE FOR CHLS FORMAT
{
case 's':
//SendStatus();
break;
case 'm':
//SetMfgDate(); // write mfg date to eeprom
break;
case 'n':
//SetSerialNumber();
break;
case 'f':
//SetFirmwareRev(); // write firmware date to eeprom
break;
case 'H':
//SetHardwareRev(); //write hardware version to eeprom
break;
case 50:
Buff[2] = 50; //error command
break;
case 'r':
//SendReport();
break;
case 'i':
//IncrementPMT();
break;
case 'l':
//DecrementPMT();
break;
case 'c':
//WriteCalDate();
break;
case 'P':
WritePMTVoltage();
break;
case 'V':
//SendPMTVoltage();
break;
default:
Buff[1] = 0; //(1 byte reply) received command is
//not supported
Buff[2] = 4; // low byte of # bytes in block
Buff[3] = 131; //bad command received
break;
}
// Command selection/action done
// Send response
PacketSize = Buff[2];
Checksum = 0;
for(RecvPointer = 1; RecvPointer < PacketSize; RecvPointer++)
{
Checksum = Checksum + Buff[RecvPointer];
}
Buff[Buff[2]] = ~(Checksum) + 1;
CREN = 0; //turn off receiver
for(RecvPointer = 0; RecvPointer <= PacketSize; RecvPointer++)
{
putc(Buff[RecvPointer]);
while(!TRMT); //wait for transmit buffer to finish
}
SerialEnd:
delay_us(50); //short dead time to allow bus master to get ready to receive
CREN = 1; //turn on receiver
setup_wdt(WDT_ON);
restart_wdt();
}
} //end of SerialReceive
}// Program end
|
|
|
|
JohnP Guest
|
Prototype problem wa BRAIN problem |
Posted: Sun Aug 02, 2009 12:16 pm |
|
|
Found it...
I had the added functions stuck in before the final ending curly brace of main...stupid error...wonderfully non-specific compiler error...
Sorry to bother the Illuminati with this triffle...
JPR |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|