Electronics > Projects, Designs, and Technical Stuff
thoughts on my project
ali6x944:
hi again,
so I am kinda stuck with the PWM subroutine...
--- Code: ---#include <xc.h>
#include <stdint.h>
#define _XTAL_FREQ 4000000
/*VARIABLE DEFFENITION SECTION*/
uint16_t RESULT; // ADC RESULT VARIABLE
#define BIG_SW PORTAbits.RA4 //READ RA4 AND ASSIGN IT TO BIG_SW
#define SMALL_SW PORTAbits.RA5 //READ RA5 AND ASSIGN IT TO SMALL_SW
/*FUNCTION INTITILIZATION SECTION*/
void ADC_INIT()
{
ADCON0bits.CHS=0b000010; // ANALOG CHANNEL SELECTION BITS (RA2)
ADCON1bits.ADCS=0b111; // ADC COVERSION CLOCK SELECTION BITS (ADCRC)
ADCON0bits.ADON=1; // ANALOG CHANNEL SELECTION BITS (ADCON HIGH)
ADCON1bits.ADPREF=0b00; //ADC POSITIVE VOLTAGE REFRENCE CONFIGRATION bits (VREF+ IS VDD)
ADCON1bits.ADFM=1; // ADC RESULT FORMAT SELECTION BITS (RIGHT JUSTIFIED)
}
void ADC_RESULT()
{
ADCON0bits.GOnDONE=1; // ADC CONVERSION STATUS BITS
while(ADCON0bits.GOnDONE==1); // WAIT WHILE ADC STATUS IS ON
RESULT = ADRESH << 8; //Load ADC high value
RESULT |= ADRESL; //Load ADC low value
}
void CCP1_TMR2_INIT()
{
CCP1PPSbits.CCP1PPS=0b00000; // BIG LIGHT DRIVER (PWM->RA0), OUTPUT
TRISAbits.TRISA0=0; // TRISA0(RA0) BIG LIGHT DRIVE, OUTPUT
PR2bits.T2PR=0b10; // PR2 SET TO 2
CCP1CONbits.MODE=0b1111; // CPP1 MODE (PWM)
CCP1CONbits.FMT=1; // RIGHT-ALIGNED PWM FORMAT
PIR4bits.TMR2IF=0; // TIMER2 INTERUPT FLAG CLEARED
T2CONbits.CKPS=0b000; // 1:1 TIMER2 PRESCALER VALUE
T2CONbits.OUTPS=0b0000; // 1:1 TIMER2 POSTSCALER VALUE
T2CONbits.ON=1; // TIMER2 ON
}
void CCP2_TMR2_INIT()
{
CCP2PPSbits.CCP2PPS=0b00000; // SMALL LIGHT DRIVER (PWM->RA1), OUTPUT
TRISAbits.TRISA1=0; // TRISA1(RA1) SMALL LIGHT DRIVE, OUTPUT
PR2bits.T2PR=0b10; // PR2 SET TO 2
CCP2CONbits.MODE=0b1111; // CPP2 MODE (PWM)
CCP2CONbits.FMT=0; // LEFT-ALIGNED PWM FORMAT
PIR4bits.TMR2IF=0; // TIMER2 INTERUPT FLAG CLEARED
T2CONbits.CKPS=0b000; // 1:1 TIMER2 PRESCALER VALUE
T2CONbits.OUTPS=0b0000; // 1:1 TIMER2 POSTSCALER VALUE
T2CONbits.ON=1; // TIMER2 ON
}
void PWM1_SBR()
{
if (BIG_SW)
{
CCP1CONbits.CCP1EN=1; // CCP1 MODULE ON
CCPR1L:CCPR1H=RESULT; // LOAD RESULT IN CCPR1L:CCPR1H REGISTER
}
else
{
CCP1CONbits.CCP1EN=0; // CCP1 MODULE OFF
}
}
void PWM2_SBR()
{
if (SMALL_SW)
{
CCP2CONbits.CCP2EN=1; // CCP2 MODULE ON
CCPR2L:CCPR2H=RESULT; // LOAD RESULT IN CCPR2L:CCPR2H REGISTER
}
else
{
CCP2CONbits.CCP2EN=0; // CCP2 MODULE OFF
}
}
/*MAIN FUNCTION*/
void main(void)
{
OSCFRQ =0b101; // OSCFRQ(HFFRQ0-2) SET OSCILLATOR TO 16MHz
//(BIG_SW&&SMALL_SW)||(!BIG_SW&&!SMALL_SW)
/*TRISx AND ANSELx ASSIGNMENT*/
TRISAbits.TRISA0=0; // TRISA0(RA0) BIG LIGHT DRIVE, OUTPUT
TRISAbits.TRISA1=0; // TRISA1(RA1) SMALL LIGHT DRIVE, OUTPUT
TRISAbits.TRISA2=1; // TRISA2(RA2) ANALOG POT, INPUT
TRISAbits.TRISA4=1; // TRISA4(RA4) BIG LIGHT SWITCH, INPUT
TRISAbits.TRISA5=1; // TRISA5(RA5) SMALL LIGHT SWITCH, INPUT
ANSELAbits.ANSA0=0; // ANSELA0(ANSA0) DISABLED, INPUT DIGITAL
ANSELAbits.ANSA1=0; // ANSELA0(ANSA1) DISABLED, INPUT DIGITAL
ANSELAbits.ANSA2=1; // ANSELA2(ANSA2) ANALOG POT, INPUT ANALOG
ANSELAbits.ANSA4=0; // ANSELA4(ANSA4) DISABLED, INPUT DIGITAL
ANSELAbits.ANSA5=0; // ANSELA5(ANSA5) DISABLED, INPUT DIGITAL
/*CCPx ASSIGNMENT*/
CCP1PPSbits.CCP1PPS=0b00000; // BIG LIGHT DRIVER (PWM->RA0), OUTPUT
CCP2PPSbits.CCP2PPS=0b00001; // SMALL LIGHT DRIVER (PWM->RA1), OUTPUT
/*LATx STEADY-STATE*/
LATAbits.LATA1 = 0;
LATAbits.LATA0 = 0;
/*FUNCTION INTITILIZATION CALL*/
ADC_INIT();
CCP1_TMR2_INIT();
CCP2_TMR2_INIT();
/*MAIN LOOP*/
while(1)
{
if(BIG_SW==SMALL_SW)
{
LATAbits.LATA0 = 0; //LED OFF
LATAbits.LATA1 = 0; //LED OFF
}
else if(SMALL_SW)
{
ADC_RESULT();
PWM2_SBR();
}
else if (BIG_SW)
{
ADC_RESULT();
PWM1_SBR();
}
}
}
--- End code ---
I think I followed the steps correctly, but I'm not really sure...
I think the problem is in PWMx_SBR I tried to manipulate it but with no real improvement |O
ali6x944:
am I missing something in the initialization or the actual pwm subroutine function?
Navigation
[0] Message Index
[*] Previous page
Go to full version