I am programming a PIC16F887 with MPLAB X, the compiler is XC8 v2.10 and the hardware tool is PICkit3.
When compiling the program I get these errors in the following constants of the program.
control.c: 125: 12: error: expression is not assignable
ADON_bit = 1;
control.c: 126: 3: error: invalid digit 'F' in octal constant
C1IE_bit = 1; // enable analog coparator interrupt
control.c: 126: 12: error: expression is not assignable
C1IE_bit = 1; // enable analog coparator interrupt
control.c: 130: 5: error: invalid digit 'F' in octal constant
GO_DONE_bit = 1; // start analog-to-digital conversion
control.c: 130: 17: error: expression is not assignable
GO_DONE_bit = 1; // start analog-to-digital conversion
My program code is as follows:
#define PWM_MIN_DUTY 80
#define PWM_START_DUTY 200
#include <xc.h>
#include <pic16f887.h>
#include "config.h"
void AH_BL();
void AH_CL();
void BH_CL();
void BH_AL();
void CH_AL();
void CH_BL();
void bldc_move();
unsigned int bldc_step = 0;
unsigned int motor_speed, i, j;
void Interrupt()
{
int j;
for(j = 0; j < 9; j++)
{
if(bldc_step & 1)
{
if(!C1OUT_bit)
{
j -= 1;
}
}
else
{
if(C1OUT_bit)
{
j -= 1;
}
}
}
bldc_move();
C1ON_bit = 1; // clear the mismatch condition
C1IF_bit = 0; // Clear comparator 1 interrupt flag bit
}
void bldc_move()
{
switch(bldc_step)
{
case 0:
AH_BL();
CM1CON0 = 0xA2;
break;
case 1:
AH_CL();
CM1CON0 = 0xA1;
break;
case 2:
BH_CL();
CM1CON0 = 0xA0;
break;
case 3:
BH_AL();
CM1CON0 = 0xA2;
break;
case 4:
CH_AL();
CM1CON0 = 0xA1;
break;
case 5:
CH_BL();
CM1CON0 = 0xA0;
break;
}
bldc_step++;
if(bldc_step >= 6)
bldc_step = 0;
}
void set_pwm_duty(unsigned int pwm_duty)
{
CCP1CON = ((pwm_duty << 4) & 0x30) | 0x0C;
CCPR1L = pwm_duty >> 2;
}
void main()
{
ANSEL = 0x10;
PORTD = 0;
TRISD = 0;
ADCON0 = 0xD0;
ADFM_bit = 0;
INTCON = 0xC0;
C1IF_bit = 0;
CCP1CON = 0x0C;
CCPR1L = 0;
TMR2IF_bit = 0;
T2CON = 0x04;
PR2 = 0xFF;
set_pwm_duty(PWM_START_DUTY);
i = 5000;
while(i > 100)
{
j = i;
while(j--);
bldc_move();
i = i - 50;
}
ADON_bit = 1;
C1IE_bit = 1;
while(1)
{
GO_DONE_bit = 1;
__delay_ms(50);
motor_speed = (ADRESH << 2) | (ADRESL >> 6);
if(motor_speed < PWM_MIN_DUTY)
motor_speed = PWM_MIN_DUTY;
set_pwm_duty(motor_speed);
}
}
void AH_BL()
{
CCP1CON = 0;
PORTD = 0x08;
PSTRCON = 0x08;
CCP1CON = 0x0C;
}
void AH_CL()
{
PORTD = 0x04;
}
void BH_CL()
{
CCP1CON = 0;
PORTD = 0x04;
PSTRCON = 0x04;
CCP1CON = 0x0C;
}
void BH_AL()
{
PORTD = 0x10;
}
void CH_AL()
{
CCP1CON = 0;
PORTD = 0x10;
PSTRCON = 0x02;
CCP1CON = 0x0C;
}
void CH_BL()
{
PORTD = 0x08;
}