I need your help. I've converted the Tutorial on Programming the NeoPixel to PICBASIC. I’m using a PIC18F25K22 at 40MHz. I get the right timings (400ns & 800ns) but I don’t have a NeoPixel! I’ve ordered a Led strip from AliExpress but it takes one month to get it…
So, if anyone of you can give it a try please. Keep the data line as short as possible with a short ground return. This will improve the rise and fall time. The nice thing about these pixels is when data is forwarded, it is passed through the internal reshaping mechanism. (Ref: Understanding the WS2812 ).
Thanks!
Code:
'****************************************************************
'* Name : NeoPixel
'* Author : Michel Jasmin
'* Notice : Copyright (c) 2014
'* : All Rights Reserved
'* Date : 2014-08-13
'* Version : 1.0
'* Notes :
'* :
'****************************************************************
'PIC18F25K22
#CONFIG
__CONFIG _CONFIG1H, _FOSC_HSHP_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_ON_1H & _IESO_ON_1H
__CONFIG _CONFIG2H, _WDTEN_OFF_2H
__CONFIG _CONFIG3H, _PBADEN_ON_3H & _CCP2MX_PORTB3_3H & _MCLRE_EXTMCLR_3H
__CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L
__CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
__CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H
#ENDCONFIG
DEFINE OSC 40
DEFINE NO_CLRWDT 1 ' Don't waste cycles clearing WDT
'------------ ALIAS -------------------------
LedPin VAR LATC.3
NeoPin VAR LATC.5
'------------ Const -------------------------
NEO_NUM CON 60
CR CON 13
LF CON 10
'------------ Variables -------------------------
NeoGreen VAR BYTE[NEO_NUM]
NeoBlue VAR BYTE[NEO_NUM]
NeoRed VAR BYTE[NEO_NUM]
NeoPixel VAR BYTE
BitCount VAR BYTE
TempW VAR WORD
'Flags
AppFlags VAR BYTE
DataBit VAR AppFlags.0
'------------------------ Initialization -------------------------------
Clear ' Clear RAM before entry
TRISC.3 = 0 'Led Pin
TRISC.5 = 0 'NeoPin
TRISC.6 = 1 'TX1
TRISC.7 = 1 'RX1
'The serial port is used only for debugging purpose.
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $24 ' Enable transmit, BRGH = 1
SPBRG = 17 ' 9600 Baud @ 40 MHz -0.03%
SPBRGH = 4
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
PAUSE 100
HSEROUT [CR,LF,CR,LF,"Test NeoPixel v 17",CR,LF]
'Blink a LED just to say: Hello, I'm alive!
LedPin = 0
FOR TempW = 0 TO 4
TOGGLE LedPin
PAUSE 250
NEXT
LedPin = 0
DataBit = 0
GOSUB NeoInit
'------------ Main program -------------------------
Main:
'For testing purpose:
'DataBit = 1
'GOSUB NeoBit
'GOTO Main
GOSUB NeoDraw
GOSUB NeoRotate
PAUSE 25
GOTO Main
END
NeoBit:
IF DataBit = 1 THEN
'400ns pulse required
NeoPin = 1
'3 nop = 500ns @ 32MHz
'2 nop = 376ns @ 32MHz
'2 nop = 300ns @ 40MHz
'3 nop = 400ns @ 40MHz
ASM
nop
nop
nop
ENDASM
NeoPin = 0
ELSE
'800ns pulse required
NeoPin = 1
'5 nop = 740ns @ 32MHz
'6 nop = 880ns @ 32MHz
'6 nop = 700ns @ 40MHz
'7 nop = 800ns @ 40MHz
ASM
nop
nop
nop
nop
nop
nop
nop
ENDASM
NeoPin = 0
ENDIF
RETURN
NeoInit:
FOR NeoPixel = 0 TO NEO_NUM
IF NeoPixel < 10 THEN
NeoGreen[NeoPixel] = 0
NeoBlue[NeoPixel] = 0
NeoRed[NeoPixel] = 64
ELSEIF NeoPixel < 20 THEN
NeoGreen[NeoPixel] = 0
NeoBlue[NeoPixel] = 64
NeoRed[NeoPixel] = 0
ELSEIF NeoPixel < 30 THEN
NeoGreen[NeoPixel] = 0
NeoBlue[NeoPixel] = 64
NeoRed[NeoPixel] = 64
ELSEIF NeoPixel < 40 THEN
NeoGreen[NeoPixel] = 64
NeoBlue[NeoPixel] = 0
NeoRed[NeoPixel] = 0
ELSEIF NeoPixel < 50 THEN
NeoGreen[NeoPixel] = 64
NeoBlue[NeoPixel] = 0
NeoRed[NeoPixel] = 64
ELSE
NeoGreen[NeoPixel] = 64
NeoBlue[NeoPixel] = 64
NeoRed[NeoPixel] = 0
ENDIF
NEXT
RETURN
NeoDraw:
FOR NeoPixel = 0 TO NEO_NUM
FOR BitCount = 7 TO 0 STEP -1
DataBit = NeoGreen.0[NeoPixel * BitCount]
GOSUB NeoBit
NEXT
FOR BitCount = 7 TO 0 STEP -1
DataBit = NeoRed.0[NeoPixel * BitCount]
GOSUB NeoBit
NEXT
FOR BitCount = 7 TO 0 STEP -1
DataBit = NeoBlue.0[NeoPixel * BitCount]
GOSUB NeoBit
NEXT
NEXT
NeoPin = 0
RETURN
NeoRotate:
FOR NeoPixel = 0 TO (NEO_NUM - 1)
NeoGreen[NeoPixel] = NeoGreen[NeoPixel + 1]
NeoBlue[NeoPixel] = NeoBlue[NeoPixel + 1]
NeoRed[NeoPixel] = NeoRed[NeoPixel + 1]
NEXT
NeoGreen[NEO_NUM - 1] = NeoGreen[0]
NeoBlue[NEO_NUM - 1] = NeoBlue[0]
NeoRed[NEO_NUM - 1] = NeoRed[0]
RETURN
Bookmarks