// pwm.c /* Copyright (C) 2017 H.Poetzl ** ** This program is free software: you can redistribute it and/or ** modify it under the terms of the GNU General Public License ** as published by the Free Software Foundation, either version ** 2 of the License, or (at your option) any later version. */ // ------------------------------------------------ // configuration #define NO_BIT_DEFINES #include #include #define CONFIG(k, n) __code static char __at _ ## k __ ## k = n CONFIG(CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CSWEN_ON & _CLKOUTEN_OFF); CONFIG(CONFIG2, _MCLRE_ON & _WDTE_OFF & _PPS1WAY_OFF); #define LED0L LATA #define LED0T TRISA #define LED0P RA5PPS #define LED0 5 #define LED1L LATC #define LED1T TRISC #define LED1P RC0PPS #define LED1 0 #define LED2L LATC #define LED2T TRISC #define LED2P RC1PPS #define LED2 1 #define LED3L LATC #define LED3T TRISC #define LED3P RC2PPS #define LED3 2 #define LED4L LATB #define LED4T TRISB #define LED4P RB4PPS #define LED4 4 #define LED5L LATB #define LED5T TRISB #define LED5P RB5PPS #define LED5 5 #define LED6L LATB #define LED6T TRISB #define LED6P RB6PPS #define LED6 6 #define LED7L LATB #define LED7T TRISB #define LED7P RB7PPS #define LED7 7 #define LED8L LATC #define LED8T TRISC #define LED8P RC7PPS #define LED8 7 #define LED9L LATC #define LED9T TRISC #define LED9P RC6PPS #define LED9 6 #define LEDAL LATC #define LEDAT TRISC #define LEDAP RC3PPS #define LEDA 3 #define LEDBL LATC #define LEDBT TRISC #define LEDBP RC4PPS #define LEDB 4 #define LEDCL LATA #define LEDCT TRISA #define LEDC 7 #define LEDDL LATA #define LEDDT TRISA #define LEDD 7 #define LEDEL LATA #define LEDET TRISA #define LEDE 7 #define LEDFL LATA #define LEDFT TRISA #define LEDF 7 void delay(uint8_t val) { val &= 0xFF; __asm NOP ; 1us delay loop DECFSZ WREG,W BRA $-2 __endasm; } void led_on(uint8_t id) { id &= 0xF; __asm ANDLW 0xF BANKSEL LATA BTFSC WREG,3 BRA _led_8_on_ ; 8-F BTFSC WREG,2 BRA _led_4_on_ ; 4-7 BTFSC WREG,1 BRA _led_2_on_ ; 2-3 BTFSC WREG,0 BRA _led_1_on_ ; 1 BCF LED0L,LED0 RETURN _led_8_on_: BTFSC WREG,2 BRA _led_C_on_ ; C-F BTFSC WREG,1 BRA _led_A_on_ ; A-B BTFSC WREG,0 BRA _led_9_on_ BCF LED8L,LED8 RETURN _led_4_on_: BTFSC WREG,1 BRA _led_6_on_ ; 6-7 BTFSC WREG,0 BRA _led_5_on_ BCF LED4L,LED4 RETURN _led_C_on_: BTFSC WREG,1 BRA _led_E_on_ ; E-F BTFSC WREG,0 BRA _led_D_on_ BCF LEDCL,LEDC RETURN _led_2_on_: BTFSC WREG,0 BRA _led_3_on_ BCF LED2L,LED2 RETURN _led_6_on_: BTFSC WREG,0 BRA _led_7_on_ BCF LED6L,LED6 RETURN _led_A_on_: BTFSC WREG,0 BRA _led_B_on_ BCF LEDAL,LEDA RETURN _led_E_on_: BTFSC WREG,0 BRA _led_F_on_ BCF LEDEL,LEDE RETURN _led_1_on_: BCF LED1L,LED1 RETURN _led_3_on_: BCF LED3L,LED3 RETURN _led_5_on_: BCF LED5L,LED5 RETURN _led_7_on_: BCF LED7L,LED7 RETURN _led_9_on_: BCF LED9L,LED9 RETURN _led_B_on_: BCF LEDBL,LEDB RETURN _led_D_on_: BCF LEDDL,LEDD RETURN _led_F_on_: BCF LEDFL,LEDF RETURN __endasm; } void led_off(uint8_t id) { id &= 0xF; __asm ANDLW 0xF BANKSEL LATA BTFSC WREG,3 BRA _led_8_off_ ; 8-F BTFSC WREG,2 BRA _led_4_off_ ; 4-7 BTFSC WREG,1 BRA _led_2_off_ ; 2-3 BTFSC WREG,0 BRA _led_1_off_ BSF LED0L,LED0 RETURN _led_8_off_: BTFSC WREG,2 BRA _led_C_off_ ; C-F BTFSC WREG,1 BRA _led_A_off_ ; A-B BTFSC WREG,0 BRA _led_9_off_ BSF LED8L,LED8 RETURN _led_4_off_: BTFSC WREG,1 BRA _led_6_off_ ; 6-7 BTFSC WREG,0 BRA _led_5_off_ BSF LED4L,LED4 RETURN _led_C_off_: BTFSC WREG,1 BRA _led_E_off_ ; E-F BTFSC WREG,0 BRA _led_D_off_ BSF LEDCL,LEDC RETURN _led_2_off_: BTFSC WREG,0 BRA _led_3_off_ BSF LED2L,LED2 RETURN _led_6_off_: BTFSC WREG,0 BRA _led_7_off_ BSF LED6L,LED6 RETURN _led_A_off_: BTFSC WREG,0 BRA _led_B_off_ BSF LEDAL,LEDA RETURN _led_E_off_: BTFSC WREG,0 BRA _led_F_off_ BSF LEDEL,LEDE RETURN _led_1_off_: BSF LED1L,LED1 RETURN _led_3_off_: BSF LED3L,LED3 RETURN _led_5_off_: BSF LED5L,LED5 RETURN _led_7_off_: BSF LED7L,LED7 RETURN _led_9_off_: BSF LED9L,LED9 RETURN _led_B_off_: BSF LEDBL,LEDB RETURN _led_D_off_: BSF LEDDL,LEDD RETURN _led_F_off_: BSF LEDFL,LEDF RETURN __endasm; } // -------------------------------------------------- // and our main entry point void main() { uint8_t data = 0; uint8_t cycle = 0; int8_t add = 1; // all digital ANSELA = 0; ANSELB = 0; ANSELC = 0; // all input TRISA = 0xFF; TRISB = 0xFF; TRISC = 0xFF; // all one LATA = 0xFF; LATB = 0xFF; LATC = 0xFF; // all open drain ODCONA = 0xFF; ODCONB = 0xFF; ODCONC = 0xFF; __asm BANKSEL TRISA BCF LED0T,LED0 BCF LED1T,LED1 BCF LED2T,LED2 BCF LED3T,LED3 BCF LED4T,LED4 BCF LED5T,LED5 BCF LED6T,LED6 BCF LED7T,LED7 BCF LED8T,LED8 BCF LED9T,LED9 BCF LEDAT,LEDA BCF LEDBT,LEDB __endasm; OSCCON3bits.CSWHOLD = 0; OSCCON1bits.NDIV = 4; /* configure Timer 2 */ T2CON = 0; T2CONbits.TMR2ON = 1; T2CONbits.T2CKPS = 0b00; /* Prescaler = 64 */ T2CONbits.T2OUTPS = 0b0000; /* Postscaler = 1 */ PR2 = 0xFF; TMR2 = 0; /* configure PWM */ PWMTMRSbits.P5TSEL = 0b01; /* Based on Timer2 */ PWM5CON = 0; PWM5CONbits.PWM5EN = 1; /* Enable PWM Module */ PWM5CONbits.PWM5POL = 1; /* Output Active Low */ PWM5DCH = 0; PWM5DCL = 0; /* configure PWM */ PWMTMRSbits.P6TSEL = 0b01; /* Based on Timer2 */ PWM6CON = 0; PWM6CONbits.PWM6EN = 1; /* Enable PWM Module */ PWM6CONbits.PWM6POL = 0; /* Output Active Low */ PWM6DCH = 0; PWM6DCL = 0; /* PPS */ PPSLOCKbits.PPSLOCKED = 0; LED0P = 0b00010; LED1P = 0b00011; while (1) { delay(63); PWM5DCH = data >> 4; PWM6DCH = 128 + 64 + 32 + 16 + (data >> 4); switch (cycle) { case 0: LED0P = 0b00000; LED1P = 0b00011; LEDBP = 0b00011; break; case 1: LED0P = 0b00000; LED2P = 0b00010; LEDAP = 0b00010; break; case 2: LED1P = 0b00000; LEDBP = 0b00000; LED3P = 0b00011; LED9P = 0b00011; break; case 3: LED2P = 0b00000; LEDAP = 0b00000; LED4P = 0b00010; LED8P = 0b00010; break; case 4: LED3P = 0b00000; LED9P = 0b00000; LED5P = 0b00011; LED7P = 0b00011; break; case 5: LED4P = 0b00000; LED8P = 0b00000; LED6P = 0b00010; break; case 6: LED5P = 0b00000; LED7P = 0b00000; LED0P = 0b00011; case 7: LED6P = 0b00000; break; } if (data == 0) { add = 1; cycle++; } if (data == 255) { add = -1; cycle++; } if (cycle == 8) cycle = 0; data += add; } }