Electronics > Projects, Designs, and Technical Stuff

thoughts on my project

<< < (12/12)

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

There was an error while thanking
Thanking...
Go to full version
Powered by SMFPacks Advanced Attachments Uploader Mod