This allows an LPC1768 to take Art-Net data and send it to WS2812B LED's

Dependencies:   mbed mbed-rtos EthernetInterface

Committer:
tonydbeck
Date:
Wed Dec 26 21:05:02 2018 +0000
Revision:
15:c730bd607d9a
Full Working Version - December 18

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tonydbeck 15:c730bd607d9a 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tonydbeck 15:c730bd607d9a 2 ; NeoCore.s
tonydbeck 15:c730bd607d9a 3 ;
tonydbeck 15:c730bd607d9a 4 ; Allen Wild
tonydbeck 15:c730bd607d9a 5 ; March 2014
tonydbeck 15:c730bd607d9a 6 ;
tonydbeck 15:c730bd607d9a 7 ; ARM assembly functions for writing to Adafruit NeoPixels
tonydbeck 15:c730bd607d9a 8 ; with the mbed NXP LPC1768
tonydbeck 15:c730bd607d9a 9 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tonydbeck 15:c730bd607d9a 10 AREA neo_core, CODE, READONLY
tonydbeck 15:c730bd607d9a 11
tonydbeck 15:c730bd607d9a 12 IMPORT neo_fio_reg
tonydbeck 15:c730bd607d9a 13 IMPORT neo_bitmask
tonydbeck 15:c730bd607d9a 14
tonydbeck 15:c730bd607d9a 15 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tonydbeck 15:c730bd607d9a 16 neo_write_pin
tonydbeck 15:c730bd607d9a 17 ; Set the GPIO pin to the value passed in R0
tonydbeck 15:c730bd607d9a 18 ; Registers and bitmasks are stored in variables set by the C++ library
tonydbeck 15:c730bd607d9a 19 LDR R1, =neo_fio_reg ; load pointers to register values
tonydbeck 15:c730bd607d9a 20 LDR R2, =neo_bitmask
tonydbeck 15:c730bd607d9a 21 LDR R1, [R1] ; load actual values from memory
tonydbeck 15:c730bd607d9a 22 LDR R2, [R2]
tonydbeck 15:c730bd607d9a 23
tonydbeck 15:c730bd607d9a 24 CMP R0, #0 ; VALUE == 0 ?
tonydbeck 15:c730bd607d9a 25 ITE EQ ; (IF-THEN-ELSE) ON NEXT TWO INSTRUCTIONS USING "EQ" FLAG
tonydbeck 15:c730bd607d9a 26 STREQ R2, [R1,#0x1C] ; if==0, CLEAR BIT
tonydbeck 15:c730bd607d9a 27 STRNE R2, [R1,#0x18] ; if==1, SET BIT
tonydbeck 15:c730bd607d9a 28 BX LR
tonydbeck 15:c730bd607d9a 29
tonydbeck 15:c730bd607d9a 30 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tonydbeck 15:c730bd607d9a 31 neo_zero
tonydbeck 15:c730bd607d9a 32 ; Output a NeoPixel zero, composed of a short
tonydbeck 15:c730bd607d9a 33 ; HIGH pulse and a long LOW pulse
tonydbeck 15:c730bd607d9a 34 PUSH {LR}
tonydbeck 15:c730bd607d9a 35 MOV R0, #1
tonydbeck 15:c730bd607d9a 36 BL neo_write_pin ; set pin high
tonydbeck 15:c730bd607d9a 37
tonydbeck 15:c730bd607d9a 38 MOV R0, #10 ; delay for long enough
tonydbeck 15:c730bd607d9a 39 BL neo_delay
tonydbeck 15:c730bd607d9a 40
tonydbeck 15:c730bd607d9a 41 MOV R0, #0 ; set pin low
tonydbeck 15:c730bd607d9a 42 BL neo_write_pin
tonydbeck 15:c730bd607d9a 43
tonydbeck 15:c730bd607d9a 44 MOV R0, #20 ; delay
tonydbeck 15:c730bd607d9a 45 BL neo_delay
tonydbeck 15:c730bd607d9a 46
tonydbeck 15:c730bd607d9a 47 POP {LR}
tonydbeck 15:c730bd607d9a 48 BX LR
tonydbeck 15:c730bd607d9a 49
tonydbeck 15:c730bd607d9a 50 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tonydbeck 15:c730bd607d9a 51 neo_one
tonydbeck 15:c730bd607d9a 52 ; Output a NeoPixel one, composed of a long
tonydbeck 15:c730bd607d9a 53 ; HIGH pulse and a short LOW pulse
tonydbeck 15:c730bd607d9a 54 PUSH {LR}
tonydbeck 15:c730bd607d9a 55 MOV R0, #1
tonydbeck 15:c730bd607d9a 56 BL neo_write_pin
tonydbeck 15:c730bd607d9a 57
tonydbeck 15:c730bd607d9a 58 MOV R0, #86
tonydbeck 15:c730bd607d9a 59 BL neo_delay
tonydbeck 15:c730bd607d9a 60
tonydbeck 15:c730bd607d9a 61 MOV R0, #0
tonydbeck 15:c730bd607d9a 62 BL neo_write_pin
tonydbeck 15:c730bd607d9a 63
tonydbeck 15:c730bd607d9a 64 NOP ; really short delay
tonydbeck 15:c730bd607d9a 65 NOP
tonydbeck 15:c730bd607d9a 66 NOP
tonydbeck 15:c730bd607d9a 67
tonydbeck 15:c730bd607d9a 68 POP {LR}
tonydbeck 15:c730bd607d9a 69 BX LR
tonydbeck 15:c730bd607d9a 70
tonydbeck 15:c730bd607d9a 71 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tonydbeck 15:c730bd607d9a 72 EXPORT neo_out ; void neo_out(int *data, int n);
tonydbeck 15:c730bd607d9a 73 ; Main function called from the C++ library
tonydbeck 15:c730bd607d9a 74 ; R0 contains a pointer to the array of color data to send
tonydbeck 15:c730bd607d9a 75 ; R1 contains the number of bytes of data to send
tonydbeck 15:c730bd607d9a 76 neo_out
tonydbeck 15:c730bd607d9a 77 PUSH {LR, R4, R5, R6, R7, R8}
tonydbeck 15:c730bd607d9a 78 MOV R7, R1 ; move length to R7
tonydbeck 15:c730bd607d9a 79 MOV R6, R0 ; move address to R6
tonydbeck 15:c730bd607d9a 80
tonydbeck 15:c730bd607d9a 81 neo_byteloop
tonydbeck 15:c730bd607d9a 82 LDRB R5, [R6] ; load byte to send
tonydbeck 15:c730bd607d9a 83 MOV R4, #0x80 ; load initial bitmask
tonydbeck 15:c730bd607d9a 84
tonydbeck 15:c730bd607d9a 85 neo_bitloop
tonydbeck 15:c730bd607d9a 86 AND R3, R5, R4 ; mask current byte
tonydbeck 15:c730bd607d9a 87 CMP R3, #0
tonydbeck 15:c730bd607d9a 88 BLEQ neo_zero ; send current bit
tonydbeck 15:c730bd607d9a 89 BLNE neo_one
tonydbeck 15:c730bd607d9a 90
tonydbeck 15:c730bd607d9a 91 LSR R4, R4, #1 ; shift bitmask right one
tonydbeck 15:c730bd607d9a 92 CMP R4, #0 ; if still more bits, loop back
tonydbeck 15:c730bd607d9a 93 BNE neo_bitloop
tonydbeck 15:c730bd607d9a 94
tonydbeck 15:c730bd607d9a 95 ADD R6, R6, #1 ; increment address
tonydbeck 15:c730bd607d9a 96 SUB R7, R7, #1 ; decrement count
tonydbeck 15:c730bd607d9a 97 CMP R7, #0
tonydbeck 15:c730bd607d9a 98 BNE neo_byteloop ; continue if not done
tonydbeck 15:c730bd607d9a 99
tonydbeck 15:c730bd607d9a 100 MOV R0, #0
tonydbeck 15:c730bd607d9a 101 BL neo_write_pin
tonydbeck 15:c730bd607d9a 102 POP {R8, R7, R6, R5, R4, LR}
tonydbeck 15:c730bd607d9a 103 BX LR
tonydbeck 15:c730bd607d9a 104
tonydbeck 15:c730bd607d9a 105 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
tonydbeck 15:c730bd607d9a 106
tonydbeck 15:c730bd607d9a 107 neo_delay
tonydbeck 15:c730bd607d9a 108 ; delay the specified number of cycles in R0 with a bunch of nops
tonydbeck 15:c730bd607d9a 109 LDR R2, =neo_delay_end
tonydbeck 15:c730bd607d9a 110 SUB R2, R2, R0
tonydbeck 15:c730bd607d9a 111 BX R2
tonydbeck 15:c730bd607d9a 112 NOP
tonydbeck 15:c730bd607d9a 113 NOP
tonydbeck 15:c730bd607d9a 114 NOP
tonydbeck 15:c730bd607d9a 115 NOP
tonydbeck 15:c730bd607d9a 116 NOP
tonydbeck 15:c730bd607d9a 117 NOP
tonydbeck 15:c730bd607d9a 118 NOP
tonydbeck 15:c730bd607d9a 119 NOP
tonydbeck 15:c730bd607d9a 120 NOP
tonydbeck 15:c730bd607d9a 121 NOP
tonydbeck 15:c730bd607d9a 122 NOP
tonydbeck 15:c730bd607d9a 123 NOP
tonydbeck 15:c730bd607d9a 124 NOP
tonydbeck 15:c730bd607d9a 125 NOP
tonydbeck 15:c730bd607d9a 126 NOP
tonydbeck 15:c730bd607d9a 127 NOP
tonydbeck 15:c730bd607d9a 128 NOP
tonydbeck 15:c730bd607d9a 129 NOP
tonydbeck 15:c730bd607d9a 130 NOP
tonydbeck 15:c730bd607d9a 131 NOP
tonydbeck 15:c730bd607d9a 132 NOP
tonydbeck 15:c730bd607d9a 133 NOP
tonydbeck 15:c730bd607d9a 134 NOP
tonydbeck 15:c730bd607d9a 135 NOP
tonydbeck 15:c730bd607d9a 136 NOP
tonydbeck 15:c730bd607d9a 137 NOP
tonydbeck 15:c730bd607d9a 138 NOP
tonydbeck 15:c730bd607d9a 139 NOP
tonydbeck 15:c730bd607d9a 140 NOP
tonydbeck 15:c730bd607d9a 141 NOP
tonydbeck 15:c730bd607d9a 142 NOP
tonydbeck 15:c730bd607d9a 143 NOP
tonydbeck 15:c730bd607d9a 144 NOP
tonydbeck 15:c730bd607d9a 145 NOP
tonydbeck 15:c730bd607d9a 146 NOP
tonydbeck 15:c730bd607d9a 147 NOP
tonydbeck 15:c730bd607d9a 148 NOP
tonydbeck 15:c730bd607d9a 149 NOP
tonydbeck 15:c730bd607d9a 150 NOP
tonydbeck 15:c730bd607d9a 151 NOP
tonydbeck 15:c730bd607d9a 152 NOP
tonydbeck 15:c730bd607d9a 153 NOP
tonydbeck 15:c730bd607d9a 154 NOP
tonydbeck 15:c730bd607d9a 155 NOP
tonydbeck 15:c730bd607d9a 156 NOP
tonydbeck 15:c730bd607d9a 157 NOP
tonydbeck 15:c730bd607d9a 158 NOP
tonydbeck 15:c730bd607d9a 159 NOP
tonydbeck 15:c730bd607d9a 160 NOP
tonydbeck 15:c730bd607d9a 161 NOP
tonydbeck 15:c730bd607d9a 162 NOP
tonydbeck 15:c730bd607d9a 163 NOP
tonydbeck 15:c730bd607d9a 164 NOP
tonydbeck 15:c730bd607d9a 165 NOP
tonydbeck 15:c730bd607d9a 166 NOP
tonydbeck 15:c730bd607d9a 167 NOP
tonydbeck 15:c730bd607d9a 168 NOP
tonydbeck 15:c730bd607d9a 169 NOP
tonydbeck 15:c730bd607d9a 170 NOP
tonydbeck 15:c730bd607d9a 171 NOP
tonydbeck 15:c730bd607d9a 172 NOP
tonydbeck 15:c730bd607d9a 173 NOP
tonydbeck 15:c730bd607d9a 174 NOP
tonydbeck 15:c730bd607d9a 175 NOP
tonydbeck 15:c730bd607d9a 176 NOP
tonydbeck 15:c730bd607d9a 177 NOP
tonydbeck 15:c730bd607d9a 178 NOP
tonydbeck 15:c730bd607d9a 179 NOP
tonydbeck 15:c730bd607d9a 180 NOP
tonydbeck 15:c730bd607d9a 181 NOP
tonydbeck 15:c730bd607d9a 182 NOP
tonydbeck 15:c730bd607d9a 183 NOP
tonydbeck 15:c730bd607d9a 184 NOP
tonydbeck 15:c730bd607d9a 185 NOP
tonydbeck 15:c730bd607d9a 186 NOP
tonydbeck 15:c730bd607d9a 187 NOP
tonydbeck 15:c730bd607d9a 188 NOP
tonydbeck 15:c730bd607d9a 189 NOP
tonydbeck 15:c730bd607d9a 190 NOP
tonydbeck 15:c730bd607d9a 191 NOP
tonydbeck 15:c730bd607d9a 192 NOP
tonydbeck 15:c730bd607d9a 193 NOP
tonydbeck 15:c730bd607d9a 194 NOP
tonydbeck 15:c730bd607d9a 195 NOP
tonydbeck 15:c730bd607d9a 196 NOP
tonydbeck 15:c730bd607d9a 197 NOP
tonydbeck 15:c730bd607d9a 198 NOP
tonydbeck 15:c730bd607d9a 199 NOP
tonydbeck 15:c730bd607d9a 200 NOP
tonydbeck 15:c730bd607d9a 201 NOP
tonydbeck 15:c730bd607d9a 202 NOP
tonydbeck 15:c730bd607d9a 203 NOP
tonydbeck 15:c730bd607d9a 204 NOP
tonydbeck 15:c730bd607d9a 205 NOP
tonydbeck 15:c730bd607d9a 206 NOP
tonydbeck 15:c730bd607d9a 207 NOP
tonydbeck 15:c730bd607d9a 208 NOP
tonydbeck 15:c730bd607d9a 209 NOP
tonydbeck 15:c730bd607d9a 210 NOP
tonydbeck 15:c730bd607d9a 211 NOP
tonydbeck 15:c730bd607d9a 212 neo_delay_end
tonydbeck 15:c730bd607d9a 213 BX LR
tonydbeck 15:c730bd607d9a 214
tonydbeck 15:c730bd607d9a 215 END ; end code region
tonydbeck 15:c730bd607d9a 216
tonydbeck 15:c730bd607d9a 217
tonydbeck 15:c730bd607d9a 218