// led blink example Copyright (C) 2014 Diego Herranz #define NO_BIT_DEFINES #include #include // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN), // disable watchdog, // and DO NOT disable low voltage programming. // The rest of fuses are left as default. __code uint16_t __at (_CONFIG1) __configword = _FOSC_INTOSC & _CLKOUTEN_OFF & _WDTE_OFF & _BOREN_ON & _CP_OFF; #define LED_PORT PORTCbits.RC5 #define LED_TRIS TRISCbits.TRISC5 // board layout: // mosfets clockwise from power feed: // RA5, RA4, RC2, RC3 // 'input' pin: RC5 // microsecond delay. static inline void delay(uint8_t us) { TMR1L = 0; while(TMR1L < us); } #define ADDTOUINT16(REG, LIT) __asm \ BANKSEL REG \ MOVLW LIT \ ADDWF _##REG##L, F \ CLRW \ ADDWFC _##REG##H, F \ __endasm #define SUBFROMUINT16(REG, LIT) __asm \ BANKSEL REG \ MOVLW LIT \ SUBWF _##REG##L, F \ CLRW \ SUBWFB _##REG##H, F \ __endasm #define PPSO_PWM1 3 void main(void) { OSCCON = 0xf0; TRISC = 0; T1CON = 0x31; // timer1 at 1 mhz, so 1us ANSELA = 0; TRISA = 0; //SLRCONC = 0; LED_PORT = 0; PWM1CLKCON = 0x00; // From Fosc w/o prescaler PWM1PRH = PWM1PRL = 0xFF; // period: 32 mhz / 65535 = 488 Hz PWM1PH = 0; PWM1DCH = PWM1DCL = 0; PWM1OF = 0; PWM1INTE = 0x00; // no interrupts enabled PWM1INTF = 0x00; // clear interrupt flag PWM1LDCON = 0x80; // load armed PWM1OFCON = 0x00; // independent run mode PWM1CON = 0x80; // enable, standard PWM mode, active high output RC5PPS = PPSO_PWM1; while(1) { while (PWM1DCL < 0xFF || PWM1DCH < 0xFE) { ADDTOUINT16(PWM1DC, 1); PWMLD = 1; delay(50); } while (PWM1DCL > 0 || PWM1DCH > 0) { SUBFROMUINT16(PWM1DC, 1); PWMLD = 1; delay(50); } } }