#include #include // PIC24FJ64GA002 Configuration Bit Settings // 'C' source line config statements #include // CONFIG2 #pragma config POSCMOD = NONE // Primary Oscillator Select (Primary oscillator disabled) #pragma config I2C1SEL = PRI // I2C1 Pin Location Select (Use default SCL1/SDA1 pins) #pragma config IOL1WAY = OFF // IOLOCK Protection (IOLOCK may be changed via unlocking seq) #pragma config OSCIOFNC = OFF // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as CLKO (FOSC/2)) #pragma config FCKSM = CSECME // Clock Switching and Monitor (Clock switching is enabled, Fail-Safe Clock Monitor is enabled) #pragma config FNOSC = FRCPLL // Oscillator Select (Fast RC Oscillator with PLL module (FRCPLL)) #pragma config SOSCSEL = SOSC // Sec Oscillator Select (Default Secondary Oscillator (SOSC)) #pragma config WUTSEL = LEG // Wake-up timer Select (Legacy Wake-up Timer) #pragma config IESO = ON // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) enabled) // CONFIG1 #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler (1:32,768) #pragma config FWPSA = PR128 // WDT Prescaler (Prescaler ratio of 1:128) #pragma config WINDIS = ON // Watchdog Timer Window (Standard Watchdog Timer enabled,(Windowed-mode is disabled)) #pragma config FWDTEN = OFF // Watchdog Timer Enable (Watchdog Timer is disabled) #pragma config ICS = PGx1 // Comm Channel Select (Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1) #pragma config GWRP = OFF // General Code Segment Write Protect (Writes to program memory are allowed) #pragma config GCP = OFF // General Code Segment Code Protect (Code protection is disabled) #pragma config JTAGEN = OFF // JTAG Port Enable (JTAG port is disabled) // This program is used in explaining the concept of range vs. // resolution. We can use the stimulous to create an input signal // with a given period and measure its period using T1CK and the // TGATE capability. void setup(void) { CLKDIVbits.RCDIV = 0; // make 16MHz // setup T1 to count the number of pulses on T1CK T1CON = 0; PR1 = 60000; // do not overflow soon. T1CONbits.TCKPS = 1; // pre=8 TMR1 = 0; // doesn't matter. we will reset on pos edge on INT0 T1CONbits.TON = 1; IFS0bits.T1IF = 0; // doesn't matter, we never look at it. } int main(void) { int dutyCycle; setup(); while (1) { _INT0IF = 0; _INT0EP = 0; // int on positive edge while (_INT0IF==0); // wait for the first positive edge _INT0IF = 0; TMR1 = 0; // start the timer to count # cycles // for which the signal is 1 _INT0EP = 1; // int on positive edge while (_INT0IF==0); // wait for the first positive edge _INT0IF = 0; dutyCycle = TMR1; } }