// pwm_star.c [bernhard] /* 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); #include "star_leds.h" 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 RETURN 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_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_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 __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 RETURN 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_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_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 __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(124); PWM5DCH = data >> 4; PWM6DCH = 128 + 64 + 32 + 16 + (data >> 4); switch (cycle) { case 0: LED7P = 0b00000; LED0P = 0b00011; // triangle 0 break; case 1: LED0P = 0b00000; LED4P = 0b00010; break; case 2: LED4P = 0b00000; LED8P = 0b00011; break; case 3: LED8P = 0b00000; LED1P = 0b00010; // triangle 1 break; case 4: LED1P = 0b00000; LED5P = 0b00011; break; case 5: LED5P = 0b00000; LED9P = 0b00010; break; case 6: LED9P = 0b00000; LED2P = 0b00011; // triangle 2 break; case 7: LED2P = 0b00000; LED6P = 0b00010; break; case 8: LED6P = 0b00000; LEDAP = 0b00011; break; case 9: LEDAP = 0b00000; LED3P = 0b00010; // triangle 3 break; case 10: LED3P = 0b00000; LED7P = 0b00011; break; case 11: LED7P = 0b00000; LEDBP = 0b00010; break; case 12: LEDBP = 0b00000; LED4P = 0b00011; // triangle 4 break; case 13: LED4P = 0b00000; LED8P = 0b00010; break; case 14: LED8P = 0b00000; LED0P = 0b00011; break; case 15: LED0P = 0b00000; LED5P = 0b00010; // triangle 5 break; case 16: LED5P = 0b00000; LED9P = 0b00011; break; case 17: LED9P = 0b00000; LED1P = 0b00010; break; case 18: LED1P = 0b00000; LED6P = 0b00011; // triangle 6 break; case 19: LED6P = 0b00000; LEDAP = 0b00010; break; case 20: LEDAP = 0b00000; LED2P = 0b00011; break; case 21: LED2P = 0b00000; LED7P = 0b00010; // triangle 7 break; case 22: LED7P = 0b00000; LEDBP = 0b00011; break; case 23: LEDBP = 0b00000; LED3P = 0b00010; break; case 24: LED3P = 0b00000; LED8P = 0b00011; // triangle 8 break; case 25: LED8P = 0b00000; LED0P = 0b00010; break; case 26: LED0P = 0b00000; LED4P = 0b00011; break; case 27: LED4P = 0b00000; LED9P = 0b00010; // triangle 9 break; case 28: LED9P = 0b00000; LED1P = 0b00011; break; case 29: LED1P = 0b00000; LED5P = 0b00010; break; case 30: LED5P = 0b00000; LEDAP = 0b00011; // triangle A break; case 31: LEDAP = 0b00000; LED2P = 0b00010; break; case 32: LED2P = 0b00000; LED6P = 0b00011; break; case 33: LED6P = 0b00000; LEDBP = 0b00010; // triangle B break; case 34: LEDBP = 0b00000; LED3P = 0b00011; break; case 35: LED3P = 0b00000; LED7P = 0b00010; break; } if (data == 0) { add = 1; cycle++; } if (data == 255) { add = -1; cycle++; } if (cycle == 36) cycle = 0; data += add; } }