PIC12F509 C Code will not compile...build errors

Flyback

Well-Known Member
Hello,
Do you know why this code for PIC12F509 will not compile?
It is written in MPLAB X IDE and using XC8 C compiler.
All the code does is pick out a low to high transition on PORT GP4 and then wait 3 ms, then take PORT GP2 high.
I am festooned with build errors at the moment.

C:
/*
 * File:   zapper.c
 * Author:
 *
 * Created on 03 June 2017, 23:55
 */

//This code turns the product ON at the mains peak voltage
//It does this by using the zero crossing detector input.

//This uses PIC12F509
//MPLAB X IDE
//XC8 C compiler (free)

#define  _XTAL_FREQ 4000000

#include <xc.h>
#include <stdint.h>

#pragma config OSC = ExtRC      // Oscillator Selection bits (external RC oscillator)
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled)
#pragma config CP = OFF         // Code Protection bit (Code protection off)
#pragma config MCLRE = ON       // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is MCLR)

//I have not set the MCLR pin as an input because it will be noise susceptible.
//Therefore i set MCLR up as reset, but i will never use it as reset..but will
//simply tie the pin top Vdd on the PCB.

//Define output
#define FETS     LATBbits.RB2;

//Define input
#define zero_x     PORTBbits.RB4;

//Define actions
#define ON    LATBbits.RB2 = 1  /*Turn ON FETs*/


//Declare functions which set up the microcontroller
void    disable_interrupts(void);   //How do this?
void    disable_pullups(void);      //How do this?
void    setup_ports(void);


void    setup_ports(void) {
    TRISB = 0b00011000;
    return;
}

//Declare variables
uint8_t    count;

void main(void) {
    setup_ports();
    //10 second delay
    for (count=1;count<=100;count++)   {
    __delayms(100);
    }

here:
    if {zero_x = 1} {goto here;}
here1:
    if {zero_x = 0} {goto here1;}

    //When it gets to this point, the zero crossing input has just gone high

    __delayms(3);   //delay to get to the mains peak
    ON;              //Turn ON FETs...at the mains peak

    while(1){;}

    return ();
}
 
Last edited by a moderator:
here:
if {zero_x = 1} {goto here;}
here1:
if {zero_x = 0} {goto here1;}
Replace this with this

while(zero_x == 1 );
while(zero_x == 0);

using goto's in C will haunt you..
return ();
is wrong... You don't need a return as the function main() is declared void

Untested but try this
C:
/*
 * File:   zapper.c
 * Author:
 *
 * Created on 03 June 2017, 23:55
 */
//This code turns the product ON at the mains peak voltage
//It does this by using the zero crossing detector input.
//This uses PIC12F509
//MPLAB X IDE
//XC8 C compiler (free)
#define  _XTAL_FREQ 4000000
#include <xc.h>
#include <stdint.h>
#pragma config OSC = ExtRC      // Oscillator Selection bits (external RC oscillator)
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled)
#pragma config CP = OFF         // Code Protection bit (Code protection off)
#pragma config MCLRE = ON       // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is MCLR)
//I have not set the MCLR pin as an input because it will be noise susceptible.
//Therefore i set MCLR up as reset, but i will never use it as reset..but will
//simply tie the pin top Vdd on the PCB.
//Define output
#define FETS     LATBbits.RB2
//Define input
#define zero_x     PORTBbits.RB4
//Define actions
#define ON    LATBbits.RB2 = 1  /*Turn ON FETs*/

//Declare functions which set up the microcontroller
//void    disable_interrupts(void);   //How do this?  No need to do it at all
//void    disable_pullups(void);      //How do this?
//void    setup_ports(void);
void    setup_ports(void) {  // this will work without definition as it comes first!!
    TRISB = 0b00011000;
    return;
}
//Declare variables
uint8_t    count;
void main(void) {
    setup_ports();
    //10 second delay
    for (count=1;count<=100;count++)   {
    __delay_ms(100);
    }
 while(zero_x == 1);
 while(zero_x == 0);
 
    //When it gets to this point, the zero crossing input has just gone high
    __delay_ms(3);   //delay to get to the mains peak
    ON;              //Turn ON FETs...at the mains peak
    while(1){}
}
 
Last edited:
The semicolon at the end of #define sentence is an error.
If zero_x = 1 should be if zero_x == 1
If zero_x = 0 -> if zero_ x == 0
Return statements are not needed.

How does the compiler know which PIC is used?
 
Just a few points: The 12F509 is a simple chip. It does not have any LATx register, TRISx is simply TRIS, and the port is not PORTx, but rather GP0..GP5 . The 12F505, a 14-pin chip, is different.

Flyback is apparently Treez on other forums.

John
 
Thankyou so much,
Massive reduction in errors now, but still wont compile...error remaining says "struct/union required" and points to the 'while' lines.
Any ideas greatly appreciated.

/*
* File: zapper.c
* Author:
*
* Created on 03 June 2017, 23:55
*/

//This code turns the product ON at the mains peak voltage
//It does this by using the zero crossing detector input.

//This uses PIC12F509
//MPLAB X IDE
//XC8 C compiler (free)

#define _XTAL_FREQ 4000000

#include <xc.h>
#include <stdint.h>


#pragma config OSC = ExtRC // Oscillator Selection bits (external RC oscillator)
#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config CP = OFF // Code Protection bit (Code protection off)
#pragma config MCLRE = ON // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is MCLR)

//I have not set the MCLR pin as an input because it will be noise susceptible.
//Therefore i set MCLR up as reset, but i will never use it as reset..but will
//simply tie the pin top Vdd on the PCB.

//Define output
#define FETS GPIO.GP2

//Define input
#define zero_x GPIO.GP4

//Define actions
#define ON GPIO.GP2 = 1; /*Turn ON FETs*/


//Declare functions which set up the microcontroller
//void disable_interrupts(void); //How do this?
//void disable_pullups(void); //How do this?
void setup_ports(void);


void setup_ports(void) {
// TRIS = 0b00011000;
TRIS = 0x18;
return;
}

//Declare variables
uint8_t count;

void main(void) {
setup_ports();
//10 second delay
for (count=1;count<=100;count++) {
__delay_ms(100);
}


while(zero_x == 1 ) {;}
while(zero_x == 0) {;}

//When it gets to this point, the zero crossing input has just gone high

__delay_ms(3); //delay to get to the mains peak
ON; //Turn ON FETs...at the mains peak

while(1){;}

return;
}
 
Hi Flyback,

You know, for such a simple program, you may want to consider the 10F32x chips. The 10F320 is $0.42 each in lots of 100 and the 12F509 is $0.52 each in lots of 100 from Digikey. The 10F32x offers the LATx register, interrupts, and 16 MHz. I didn't do a full comparison of alternatives, but since it seems you are starting almost from scratch, a newer chip might be much better, smaller, and cheaper.

John
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…