/**********************************************************************
* ?2008 Microchip Technology Inc.
*
* FileName: main.c
* Dependencies: Header (.h) files if applicable, see below
* Processor: dsPIC33Fxxxx
* Compiler: MPLAB?C30 v3.02 or higher
*
* SOFTWARE LICENSE AGREEMENT:
* Microchip Technology Incorporated ("Microchip") retains all ownership and
* intellectual property rights in the code accompanying this message and in all
* derivatives hereto. You may use this code, and any derivatives created by
* any person or entity by or on your behalf, exclusively with Microchip's
* proprietary products. Your acceptance and/or use of this code constitutes
* agreement to the terms and conditions of this notice.
*
* CODE ACCOMPANYING THIS MESSAGE IS SUPPLIED BY MICROCHIP "AS IS". NO
* WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
* TO, IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE APPLY TO THIS CODE, ITS INTERACTION WITH MICROCHIP'S
* PRODUCTS, COMBINATION WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
*
* YOU ACKNOWLEDGE AND AGREE THAT, IN NO EVENT, SHALL MICROCHIP BE LIABLE, WHETHER
* IN CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE OR BREACH OF STATUTORY DUTY),
* STRICT LIABILITY, INDEMNITY, CONTRIBUTION, OR OTHERWISE, FOR ANY INDIRECT, SPECIAL,
* PUNITIVE, EXEMPLARY, INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, FOR COST OR EXPENSE OF
* ANY KIND WHATSOEVER RELATED TO THE CODE, HOWSOEVER CAUSED, EVEN IF MICROCHIP HAS BEEN
* ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
* ALLOWABLE BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY RELATED TO
* THIS CODE, SHALL NOT EXCEED THE PRICE YOU PAID DIRECTLY TO MICROCHIP SPECIFICALLY TO
* HAVE THIS CODE DEVELOPED.
*
* You agree that you are solely responsible for testing the code and
* determining its suitability. Microchip has no obligation to modify, test,
* certify, or support the code.
*
* ADDITIONAL NOTES:
* Code Tested on:
* Explorer 16 board with dsPIC33FJ64GS610 device
**********************************************************************/
#if defined(__dsPIC33F__)
#include "p33Fxxxx.h"
#endif
//Macros for Configuration of Fuse Registers:
//Invoke macros to set up device configuration fuse registers.
//The fuses will select the oscillator source, power-up timers, watch-dog
//timers etc. The macros are defined within the device
//header files. The configuration fuse registers reside in Flash memory.
//External Oscillator
_FOSCSEL(FNOSC_PRI); // Primary (XT, HS, EC) Oscillator
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);
// Clock Switching is enabled and Fail Safe Clock Monitor is disabled
// OSC2 Pin Function: OSC2 is Clock Output
// Primary Oscillator Mode: XT Crystanl
//
Internal FRC Oscillator
//_FOSCSEL(FNOSC_FRC); // FRC Oscillator
//_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_NONE);
// Clock Switching is enabled and Fail Safe Clock Monitor is disabled
// OSC2 Pin Function: OSC2 is Clock Output
// Primary Oscillator Mode: Disabled
//_FWDT(FWDTEN_OFF); // Watchdog Timer Enabled/disabled by user software
//
int main(void)
{
/* Configure Oscillator to operate the device at 40Mhz */
// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
// Fosc= 7.37M*43(2*2)=80Mhz for 7.37M input clock
PLLFBD=41; // M=43
CLKDIVbits.PLLPOST=0; // N1=2
CLKDIVbits.PLLPRE=0; // N2=2
OSCTUN=0; // Tune FRC oscillator, if FRC is used
// Disable Watch Dog Timer
RCONbits.SWDTEN=0;
// Clock switching to incorporate PLL
__builtin_write_OSCCONH(0x03); // Initiate Clock Switch to Primary
// Oscillator with PLL (NOSC=0b011)
__builtin_write_OSCCONL(0x01); // Start clock switching
while (OSCCONbits.COSC != 0b011); // Wait for Clock switch to occur
// Wait for PLL to lock
while(OSCCONbits.LOCK!=1) {};
/* Configure Auxillary Oscillator to setup the PWM clock for 120Mhz */
// ACLK = (REFCLK * M) / N
// ACLK = ((FRC * 16) / APSTSCLR ) = (7.37 * 16) / 1 = ~ 120MHz*/
ACLKCONbits.FRCSEL = 1; // FRC provides input for Auxiliary PLL (x16)
ACLKCONbits.SELACLK = 1; //Auxiliary Oscillator provides clock source for PWM
ACLKCONbits.APSTSCLR = 7; // Divide Auxiliary clock by 1
ACLKCONbits.ENAPLL = 1; // Enable Auxiliary PLL
while(ACLKCONbits.APLLCK != 1); // Wait for Auxiliary PLL to Lock
/* Remap the pins for fault and current limit input */
__builtin_write_OSCCONL(OSCCON & ~(1<<6));
__builtin_write_OSCCONL(OSCCON | (1<<6));
/* Configure PWM generator 1 for Independent Fault Mode */
// Enable the PWM interrupts
IFS5bits.PWM1IF=0; // Interrupt flag status register
IEC5bits.PWM1IE=1; // Interrupt request is enabled
PTCON2bits.PCLKDIV = 0;// Divide by 1, maximum PWM timing resolution
PTPER = 1000; // Configure PTPER register for PWM frequency of 1.04ns
MDC = 500; // Duty cycle of 50%
// PWM1 Fault and Current Limit Control register
FCLCON1bits.IFLTMOD = 1; // Independent Fault Mode
FCLCON1bits.CLSRC = 0x1C; // Fault input pin 21
FCLCON1bits.CLPOL = 1; // The selected current-limit source is active-lo
FCLCON1bits.CLMOD = 1; // Current-Limit mode is enabled
FCLCON1bits.FLTSRC = 0x1D; // Fault input pin 22
FCLCON1bits.FLTPOL = 1 ; // The selected Fault source is active-lo
FCLCON1bits.FLTMOD = 1; // The PWM is configured for cycle by cycle mode
// PWM1 I/O Control register
IOCON1bits.PENH = 1; // PWM1H is controlled by PWM module
IOCON1bits.PENL = 1; // PWM1L is controlled by PWM module
IOCON1bits.POLH = 0; // PWMxH pin is active-high
IOCON1bits.POLL = 0; // PWMxL pin is active-high
IOCON1bits.PMOD = 0; // PWM I/O pin pair is in the Complementary Output mode
IOCON1bits.FLTDAT = 0; // PWM1H and PWM1L are driven LOW on occurance of Fault and Current limit respectively
// PWM1 Control register
PWMCON1bits.FLTSTAT = 0; // cleared so no interrupt pending
PWMCON1bits.CLSTAT = 0; // cleared so no interrupt pending
PWMCON1bits.TRGSTAT = 0; // cleared so no interrupt pending
PWMCON1bits.FLTIEN = 1; // Fault Interrupt enabled
PWMCON1bits.CLIEN = 1; // Current Limit Interrupt enabled
PWMCON1bits.TRGIEN = 0; // Trigger event interrupts disabled
PWMCON1bits.ITB = 0; // PTPER register provides timing for PWM1 generator
PWMCON1bits.MDCS = 1; // MDC provides duty cycle information
PTCONbits.PTEN = 1; // Enable the PWM Module
while(1);
}
void __attribute__((__interrupt__,no_auto_psv)) _PWM1Interrupt(void)
{
IFS5bits.PWM1IF = 0; //Clear the interrupt flag
if(PWMCON1bits.FLTSTAT ==1)
PWMCON1bits.FLTSTAT = 0; // Clear the fault status bit
if(PWMCON1bits.CLSTAT ==1)
PWMCON1bits.CLSTAT = 0; // Clear the current limit status bit
}