This library lets you control the addressable RGB LED strips from Pololu Robotics. Forked to add selectable colour order (Support RGB or GRB Leds)

Fork of PololuLedStrip by David Grayson

Committer:
DavidEGrayson
Date:
Fri Mar 01 03:57:49 2013 +0000
Revision:
9:6ffb85d69eaf
Parent:
8:1578776ceac5
Child:
10:f1bb84b97788
Successfully transmitted colors on the M0.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DavidEGrayson 0:06475317f283 1 AREA asm_func, CODE, READONLY
DavidEGrayson 0:06475317f283 2 EXPORT led_strip_write_color
DavidEGrayson 6:9d0530b7dae2 3 IMPORT led_strip_write_delays
DavidEGrayson 0:06475317f283 4
DavidEGrayson 7:9a088f042ee0 5 MACRO
DavidEGrayson 7:9a088f042ee0 6 delay $id
DavidEGrayson 7:9a088f042ee0 7 ldr r5, =led_strip_write_delays
DavidEGrayson 7:9a088f042ee0 8 ldrb r5, [r5, $id]
DavidEGrayson 9:6ffb85d69eaf 9 lsls r5, r5, #1
DavidEGrayson 7:9a088f042ee0 10 ldr r4, =delay_region_end
DavidEGrayson 9:6ffb85d69eaf 11 subs r4, r4, r5
DavidEGrayson 7:9a088f042ee0 12 blx r4
DavidEGrayson 7:9a088f042ee0 13 MEND
DavidEGrayson 7:9a088f042ee0 14
DavidEGrayson 0:06475317f283 15 led_strip_write_color
DavidEGrayson 5:690fdfb595de 16 ; Register usage:
DavidEGrayson 5:690fdfb595de 17 ; These are the first 4 arguments to the method:
DavidEGrayson 5:690fdfb595de 18 ; R0: pointer to the color to send
DavidEGrayson 5:690fdfb595de 19 ; R1: pointer to the register for setting the pin
DavidEGrayson 5:690fdfb595de 20 ; R2: pointer to the register for clearing the pin
DavidEGrayson 5:690fdfb595de 21 ; R3: pin mask
DavidEGrayson 5:690fdfb595de 22 ; Additionally, we use these registers:
DavidEGrayson 5:690fdfb595de 23 ; R4: temporary register
DavidEGrayson 6:9d0530b7dae2 24 ; R5: temporary register
DavidEGrayson 8:1578776ceac5 25 ; R6: shift register that holds the 24-bit color
DavidEGrayson 5:690fdfb595de 26 ; R7: the number of bits we still need to send
DavidEGrayson 5:690fdfb595de 27 ; R13: Link Register, holds return addresses.
DavidEGrayson 7:9a088f042ee0 28
DavidEGrayson 9:6ffb85d69eaf 29 ; Push those registers so we can restore them later.
DavidEGrayson 9:6ffb85d69eaf 30 push {r4, r5, r6, r7}
DavidEGrayson 9:6ffb85d69eaf 31 mov r4, lr
DavidEGrayson 9:6ffb85d69eaf 32 push {r4}
DavidEGrayson 5:690fdfb595de 33
DavidEGrayson 9:6ffb85d69eaf 34 ldrb r4, [r0, #0] ; Load red.
DavidEGrayson 9:6ffb85d69eaf 35 lsls r4, r4, #24
DavidEGrayson 9:6ffb85d69eaf 36 mov r6, r4 ; Put red in MSB of r6.
DavidEGrayson 9:6ffb85d69eaf 37 ldrb r4, [r0, #1] ; Load green.
DavidEGrayson 9:6ffb85d69eaf 38 lsls r4, r4, #16
DavidEGrayson 9:6ffb85d69eaf 39 orrs r6, r6, r4 ; Put green in r6.
DavidEGrayson 9:6ffb85d69eaf 40 ldrb r4, [r0, #2] ; Load blue.
DavidEGrayson 9:6ffb85d69eaf 41 lsls r4, r4, #8
DavidEGrayson 9:6ffb85d69eaf 42 orrs r6, r6, r4 ; Put blue in MSB of r6.
DavidEGrayson 9:6ffb85d69eaf 43
DavidEGrayson 9:6ffb85d69eaf 44 ; On the Cortex M0 we simply did:
DavidEGrayson 9:6ffb85d69eaf 45 ; ldr r6, [r0] ; Read the color. Now we have: xxBbGgRr
DavidEGrayson 9:6ffb85d69eaf 46 ; rbit r6, r6 ; Reverse the order of the bits: rRgGbBxx
DavidEGrayson 9:6ffb85d69eaf 47 ; rev r6, r6 ; Reverse the order of the bytes: xxbBgGrR
DavidEGrayson 9:6ffb85d69eaf 48 ; and then we used rrxs for shifting to the right through carry.
DavidEGrayson 9:6ffb85d69eaf 49
DavidEGrayson 9:6ffb85d69eaf 50 ldr r7, =24 ; Initialize the loop counter register.
DavidEGrayson 0:06475317f283 51
DavidEGrayson 0:06475317f283 52 send_led_strip_bit
DavidEGrayson 0:06475317f283 53 str r3, [r1] ; Drive the line high.
DavidEGrayson 0:06475317f283 54
DavidEGrayson 7:9a088f042ee0 55 delay #0
DavidEGrayson 0:06475317f283 56
DavidEGrayson 9:6ffb85d69eaf 57 ldr r4, =0x80000000
DavidEGrayson 9:6ffb85d69eaf 58 tst r6, r4
DavidEGrayson 9:6ffb85d69eaf 59 bne delay1
DavidEGrayson 9:6ffb85d69eaf 60 str r3, [r2] ; If the bit to send it 0, drive the line low.
DavidEGrayson 9:6ffb85d69eaf 61 delay1
DavidEGrayson 0:06475317f283 62
DavidEGrayson 7:9a088f042ee0 63 delay #1
DavidEGrayson 0:06475317f283 64
DavidEGrayson 9:6ffb85d69eaf 65 ldr r4, =0x80000000
DavidEGrayson 9:6ffb85d69eaf 66 tst r6, r4
DavidEGrayson 9:6ffb85d69eaf 67 beq delay2
DavidEGrayson 9:6ffb85d69eaf 68 str r3, [r2] ; If the bit to send is 1, drive the line low.
DavidEGrayson 9:6ffb85d69eaf 69 delay2
DavidEGrayson 0:06475317f283 70
DavidEGrayson 7:9a088f042ee0 71 delay #2
DavidEGrayson 4:d3b60bd43811 72
DavidEGrayson 9:6ffb85d69eaf 73 lsls r6, r6, #1 ; Shift color bits.
DavidEGrayson 6:9d0530b7dae2 74 subs r7, r7, #1 ; Decrement the loop counter.
DavidEGrayson 5:690fdfb595de 75 bne send_led_strip_bit ; Send another bit if we have not reached zero.
DavidEGrayson 4:d3b60bd43811 76
DavidEGrayson 4:d3b60bd43811 77 led_strip_asm_end
DavidEGrayson 9:6ffb85d69eaf 78 pop {r4}
DavidEGrayson 9:6ffb85d69eaf 79 mov lr, r4
DavidEGrayson 9:6ffb85d69eaf 80 pop {r4, r5, r6, r7}
DavidEGrayson 4:d3b60bd43811 81 bx lr
DavidEGrayson 4:d3b60bd43811 82
DavidEGrayson 4:d3b60bd43811 83
DavidEGrayson 4:d3b60bd43811 84 delay_region
DavidEGrayson 5:690fdfb595de 85 ; The following is 128 nops.
DavidEGrayson 0:06475317f283 86 nop
DavidEGrayson 0:06475317f283 87 nop
DavidEGrayson 0:06475317f283 88 nop
DavidEGrayson 0:06475317f283 89 nop
DavidEGrayson 0:06475317f283 90 nop
DavidEGrayson 0:06475317f283 91 nop
DavidEGrayson 0:06475317f283 92 nop
DavidEGrayson 0:06475317f283 93 nop
DavidEGrayson 0:06475317f283 94 nop
DavidEGrayson 0:06475317f283 95 nop
DavidEGrayson 0:06475317f283 96 nop
DavidEGrayson 0:06475317f283 97 nop
DavidEGrayson 0:06475317f283 98 nop
DavidEGrayson 4:d3b60bd43811 99 nop
DavidEGrayson 4:d3b60bd43811 100 nop
DavidEGrayson 4:d3b60bd43811 101 nop
DavidEGrayson 4:d3b60bd43811 102
DavidEGrayson 0:06475317f283 103 nop
DavidEGrayson 0:06475317f283 104 nop
DavidEGrayson 0:06475317f283 105 nop
DavidEGrayson 0:06475317f283 106 nop
DavidEGrayson 0:06475317f283 107 nop
DavidEGrayson 0:06475317f283 108 nop
DavidEGrayson 0:06475317f283 109 nop
DavidEGrayson 0:06475317f283 110 nop
DavidEGrayson 0:06475317f283 111 nop
DavidEGrayson 0:06475317f283 112 nop
DavidEGrayson 0:06475317f283 113 nop
DavidEGrayson 0:06475317f283 114 nop
DavidEGrayson 0:06475317f283 115 nop
DavidEGrayson 0:06475317f283 116 nop
DavidEGrayson 0:06475317f283 117 nop
DavidEGrayson 0:06475317f283 118 nop
DavidEGrayson 4:d3b60bd43811 119
DavidEGrayson 0:06475317f283 120 nop
DavidEGrayson 0:06475317f283 121 nop
DavidEGrayson 0:06475317f283 122 nop
DavidEGrayson 0:06475317f283 123 nop
DavidEGrayson 4:d3b60bd43811 124 nop
DavidEGrayson 4:d3b60bd43811 125 nop
DavidEGrayson 0:06475317f283 126 nop
DavidEGrayson 0:06475317f283 127 nop
DavidEGrayson 0:06475317f283 128 nop
DavidEGrayson 0:06475317f283 129 nop
DavidEGrayson 0:06475317f283 130 nop
DavidEGrayson 0:06475317f283 131 nop
DavidEGrayson 0:06475317f283 132 nop
DavidEGrayson 0:06475317f283 133 nop
DavidEGrayson 0:06475317f283 134 nop
DavidEGrayson 0:06475317f283 135 nop
DavidEGrayson 0:06475317f283 136
DavidEGrayson 0:06475317f283 137 nop
DavidEGrayson 0:06475317f283 138 nop
DavidEGrayson 0:06475317f283 139 nop
DavidEGrayson 0:06475317f283 140 nop
DavidEGrayson 0:06475317f283 141 nop
DavidEGrayson 0:06475317f283 142 nop
DavidEGrayson 0:06475317f283 143 nop
DavidEGrayson 0:06475317f283 144 nop
DavidEGrayson 0:06475317f283 145 nop
DavidEGrayson 0:06475317f283 146 nop
DavidEGrayson 4:d3b60bd43811 147 nop
DavidEGrayson 4:d3b60bd43811 148 nop
DavidEGrayson 4:d3b60bd43811 149 nop
DavidEGrayson 4:d3b60bd43811 150 nop
DavidEGrayson 4:d3b60bd43811 151 nop
DavidEGrayson 4:d3b60bd43811 152 nop
DavidEGrayson 0:06475317f283 153
DavidEGrayson 0:06475317f283 154 nop
DavidEGrayson 0:06475317f283 155 nop
DavidEGrayson 0:06475317f283 156 nop
DavidEGrayson 0:06475317f283 157 nop
DavidEGrayson 0:06475317f283 158 nop
DavidEGrayson 0:06475317f283 159 nop
DavidEGrayson 0:06475317f283 160 nop
DavidEGrayson 0:06475317f283 161 nop
DavidEGrayson 0:06475317f283 162 nop
DavidEGrayson 0:06475317f283 163 nop
DavidEGrayson 4:d3b60bd43811 164 nop
DavidEGrayson 4:d3b60bd43811 165 nop
DavidEGrayson 4:d3b60bd43811 166 nop
DavidEGrayson 4:d3b60bd43811 167 nop
DavidEGrayson 4:d3b60bd43811 168 nop
DavidEGrayson 4:d3b60bd43811 169 nop
DavidEGrayson 0:06475317f283 170
DavidEGrayson 0:06475317f283 171 nop
DavidEGrayson 0:06475317f283 172 nop
DavidEGrayson 0:06475317f283 173 nop
DavidEGrayson 0:06475317f283 174 nop
DavidEGrayson 0:06475317f283 175 nop
DavidEGrayson 0:06475317f283 176 nop
DavidEGrayson 0:06475317f283 177 nop
DavidEGrayson 0:06475317f283 178 nop
DavidEGrayson 0:06475317f283 179 nop
DavidEGrayson 0:06475317f283 180 nop
DavidEGrayson 0:06475317f283 181 nop
DavidEGrayson 0:06475317f283 182 nop
DavidEGrayson 0:06475317f283 183 nop
DavidEGrayson 0:06475317f283 184 nop
DavidEGrayson 0:06475317f283 185 nop
DavidEGrayson 0:06475317f283 186 nop
DavidEGrayson 0:06475317f283 187
DavidEGrayson 0:06475317f283 188 nop
DavidEGrayson 0:06475317f283 189 nop
DavidEGrayson 0:06475317f283 190 nop
DavidEGrayson 0:06475317f283 191 nop
DavidEGrayson 0:06475317f283 192 nop
DavidEGrayson 0:06475317f283 193 nop
DavidEGrayson 0:06475317f283 194 nop
DavidEGrayson 0:06475317f283 195 nop
DavidEGrayson 0:06475317f283 196 nop
DavidEGrayson 0:06475317f283 197 nop
DavidEGrayson 4:d3b60bd43811 198 nop
DavidEGrayson 4:d3b60bd43811 199 nop
DavidEGrayson 4:d3b60bd43811 200 nop
DavidEGrayson 4:d3b60bd43811 201 nop
DavidEGrayson 4:d3b60bd43811 202 nop
DavidEGrayson 4:d3b60bd43811 203 nop
DavidEGrayson 4:d3b60bd43811 204
DavidEGrayson 0:06475317f283 205 nop
DavidEGrayson 0:06475317f283 206 nop
DavidEGrayson 0:06475317f283 207 nop
DavidEGrayson 0:06475317f283 208 nop
DavidEGrayson 0:06475317f283 209 nop
DavidEGrayson 0:06475317f283 210 nop
DavidEGrayson 4:d3b60bd43811 211 nop
DavidEGrayson 4:d3b60bd43811 212 nop
DavidEGrayson 4:d3b60bd43811 213 nop
DavidEGrayson 4:d3b60bd43811 214 nop
DavidEGrayson 4:d3b60bd43811 215 nop
DavidEGrayson 4:d3b60bd43811 216 nop
DavidEGrayson 4:d3b60bd43811 217 nop
DavidEGrayson 4:d3b60bd43811 218 nop
DavidEGrayson 4:d3b60bd43811 219 nop
DavidEGrayson 4:d3b60bd43811 220 nop
DavidEGrayson 5:690fdfb595de 221 delay_region_end
DavidEGrayson 4:d3b60bd43811 222 bx lr ; return
DavidEGrayson 0:06475317f283 223
DavidEGrayson 0:06475317f283 224 END