'**************************************************************** '* Name : ws2811_16f1619_spi-INT.PBP * '* Author : richard * '* Notice : * '* : * '* Date : * '* Version : * '* Notes : PIC16F1619 80 LEDS MAX * '* : ws8212 TEST Output on Rb7 * '**************************************************************** #CONFIG __config _CONFIG1, _FOSC_INTOSC & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF __config _CONFIG2, _WRT_OFF & _PPS1WAY_OFF & _ZCD_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_HI & _LVP_ON __config _CONFIG3, _WDTCPS_WDTCPS6 & _WDTE_OFF & _WDTCWS_WDTCWS100 & _WDTCCS_LFINTOSC #ENDCONFIG define OSC 32 ; --- *** Oscillator *** --------------------------------------------------- OSCCON = %11110000 ;32 MHz, ANSELb = 0 ANSELA = 0 ANSELC = 0 nows con 192 ;NUMBER OF WS2812 *3 (85 x3 =255 max ) LRAM_START CON 8912 pixels var word bank0 p_offset var word bank0 p_pc var BYTE bank0 ;PIXEL COUNTER offset var word txb1 var byte[80]bank9 ;RESERVE LAST 3 BANKS AS LINEAR MEMORY txb2 var byte[80]bank10 txb3 var byte[80]bank11 LED VAR PORTA.5 ' Assign name "LED" to DEFINE INTHAND SPI_ISR ' DEFINE DEBUG_REG PORTA ' DEFINE DEBUG_BIT 0 ; if not used for pwr ' DEFINE DEBUG_BAUD 9600 ' DEFINE DEBUG_MODE 0 goto overasm ASM SPI_ISR ;BANKSEL LATA ;BSF LATA,5 BANKSEL PIR1 BCF PIR1,3 MOVE?CW _LRAM_START,FSR0 BANKSEL _p_pc movf _p_pc,W addwf FSR0,F btfsc STATUS, C incf FSR0+1,F MOVIW FSR0 ++ BANKSEL SSP1BUF movwf SSP1BUF BANKSEL _p_pc DECFSZ _p_pc GOTO SPIexit BANKSEL PIE1 BCF PIE1,3 SPIexit ;BANKSEL LATA ;BCF LATA,5 RETFIE _loadpix ;LOADS LED DATA TO LINEAR SRAM BUFFER BANKSEL _offset MOVE?WW _offset,FSR0 BSF FSR0H ,7 MOVE?CW _LRAM_START + _nows ,FSR1 BANKSEL _p_pc nxlby MOVIW FSR0 ++ MOVWI FSR1 -- DECFSZ _p_pc,F ;dec pixel count pc GOTO nxlby RETURN getaddr macro Text, Addr movlw low Text movwf Addr movlw High Text movwf Addr + 1 endm ENDASM overasm: CLC2POL = $01; CLC2SEL0 = $00; CLC2SEL1 = $0E; CLC2SEL2 = $28; CLC2SEL3 = $27; CLC2GLS0 = $44; CLC2GLS1 = $10; CLC2GLS2 = $80; CLC2GLS3 = $20; CLC2CON = $80; PPSLOCK = $55; PPSLOCK = $AA; PPSLOCK = 0 ; unlock PPS RB7PPS = $05; CLC2 the output PPSLOCK = $55; PPSLOCK = $AA; PPSLOCK = 1; lock PPS ' Adjust Timer2 period for desired baud rate ' One bit period is two Timer2 periods T2CON = $90 PR2 = 5 ' Adjust PWM1 duty cycle for desired "0" data-bit duty cycle ' ‘1’ data-bit duty cycle is automatically 50% PWM3CON = $80 PWM3DCH = 2 PWM3DCL = 0 ' MSSP configured for SPI master with Timer2_Period/2 clock SSP1CON1 = $23 CLEAR ' Output on Rb7 'TRISC = %00100111 TRISa = %11011110 TRISb = %01111111 led=0 'LATA.0=1 'pause 2000 'Debug "Start",13 ,10 @ getaddr _rw1,_pixels' Get a String from flash memory INTCON=$C0 aloop: for p_offset=0 to 1536 step 24 offset = pixels+p_offset p_pc=nows ;set number of leds to show CALL loadpix GOSUB TX_LEDS pause 200 next pause 1000 goto aloop stop end TX_LEDS: ;ENGAGE THE SPI INT p_pc=nows-1 PIR1.3=0 PIE1.3=1 SSP1BUF=txb3[79] RETURN rw1: @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ;192 @ DW 0,0,0, 50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ;23 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 ;47 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 ;71 @ DW 0,0,0, 50,50,50, 50,50, 50,50,50, 50,0,0,0, 0,0,0, 0,0,0, 0,0,0 ;95 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 ;119 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 ;143 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 ;167 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ;191 ;384 @ DW 0,0,0, 0,0,0, 50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ;576 @ DW 0,0,0, 0,0,0, 50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ;768 @ DW 0,0,0 ,50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ;960 @ DW 0,0,0, 0,0,0, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ;1152 @ DW 0,0,0, 50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ;1344 @ DW 0,0,0 ,50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 50,50,50, 0,0,0, 0,0,0, 50,50,50, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0 ,50,50,50, 50,50,50, 50,50,50, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 ;1536 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0 @ DW 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0