Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2093 - 1
///////////////////////////////////////////////////////////////////////////////
2
//
3
// 16MHz
4
//
5
///////////////////////////////////////////////////////////////////////////////
6
#if F_CPU == 16000000UL
7
        ///////////////////////////////////////////////////////////////////////
8
 
9
	.file	"ws2812b.sx"
10
 
11
__SREG__ = 0x3f
12
__SP_H__ = 0x3e
13
__SP_L__ = 0x3d
14
__CCP__  = 0x34
15
__tmp_reg__ = 0
16
__zero_reg__ = 1
17
 
18
	.text
19
 
20
        ///////////////////////////////////////////////////////////////////////
21
        //
22
        // ws2812b_send(U8 * ptr, U16 cnt)
23
        //
24
	// H H H H H H d d d d d d d L L L L L L L
25
        // ^         ^ ^           ^ ^           ^
26
        // 1         6 7          13 14         20
27
        //
28
	// 20 cyles @ 62.5ns(16MHz) = 1.25us
29
	//
30
        ///////////////////////////////////////////////////////////////////////
31
 
32
        .global	ws2812b_send
33
	.type	ws2812b_send, @function
34
 
35
	///////////////////////////////////////////////////////////////////////
36
 
37
ws2812b_send:
38
	movw r30,r24     // 1 U8 *ptr
39
	movw r26,r22     // 1 U16 cnt
40
 
41
	ldi  r25,lo8(0)  // 1 Low
42
	ldi  r24,lo8(-1) // 1 High
43
 
44
	ld   r18,Z+      // 2 data = *ptr++
45
	cli
46
 
47
	////////////////////////////////////////////////////////////////////////
48
 
49
	bit_loop:         //                         (T = 0)
50
 
51
	// High ////////////////////////////////////////////////////////////////
52
 
53
	out 11, r24      // 1 high                  (T = 1)
54
	rjmp .+0         // 2 nop nop               (T = 3)
55
	rjmp .+0         // 2 nop nop               (T = 5)
56
	nop              // 1 nop                   (T = 6)
57
 
58
	// Data ////////////////////////////////////////////////////////////////
59
 
60
	out 11, r18      // 1 data                  (T = 7)
61
	rjmp .+0         // 2 nop nop               (T = 9)
62
	rjmp .+0         // 2 nop nop               (T = 11)
63
	rjmp .+0         // 2 nop nop               (T = 13)
64
 
65
	// Low /////////////////////////////////////////////////////////////////
66
 
67
	out 11, r25      // 1 low                   (T = 14)
68
	ld r18 , Z+      // 2 data = *ptr++         (T = 16)
69
 
70
	// cnt-- ///////////////////////////////////////////////////////////////
71
 
72
	sbiw r26, 1      // 2 cnt--                 (T = 18)
73
	brne bit_loop    // 2 if(count!=0) branch   (T = 20)
74
 
75
        ////////////////////////////////////////////////////////////////////////
76
	//
77
	// _delay_us(50) := 200 * 4 * 62.5ns @ 16MHz
78
	//
79
        ////////////////////////////////////////////////////////////////////////
80
 
81
	ldi r24,lo8(200) // 1 delay_cnt = 200;
82
	ldi r25,hi8(200) // 1
83
 
84
	///////////////////////////////////////////////////////////////////////
85
 
86
	delay: sbiw r24,1 // 2 delay--
87
	brne delay        // 2 if(delay_cnt!=0) branch
88
 
89
        ////////////////////////////////////////////////////////////////////////
90
 
91
	sei
92
	ret              // 4/5
93
 
94
        ////////////////////////////////////////////////////////////////////////
95
 
96
	.size	ws2812b_send, .-ws2812b_send
97
 
98
       /////////////////////////////////////////////////////////////////////////
99
       //
100
       // ws2812b_send_p(U8 * ptr progmen, U16 cnt)
101
       //
102
       // H H H H H H d d d d d d d L L L L L L L
103
       // ^         ^ ^           ^ ^           ^
104
       // 1         6 7          13 14         20
105
       //
106
       // 20 cyles @ 62.5ns(16MHz) = 1.25us
107
       //
108
       /////////////////////////////////////////////////////////////////////////
109
 
110
       .global	ws2812b_send_p
111
       .type	ws2812b_send_p, @function
112
 
113
       /////////////////////////////////////////////////////////////////////////
114
 
115
ws2812b_send_p:
116
	movw r30,r24     // 1 U8 *ptr
117
	movw r26,r22     // 1 U16 cnt
118
 
119
	ldi  r25,lo8(0)  // 1 Low
120
	ldi  r24,lo8(-1) // 1 High
121
 
122
	lpm  r18,Z+      // 3 data = ptr++
123
	cli
124
 
125
       /////////////////////////////////////////////////////////////////////////
126
 
127
	bit_loop_p:      //                         (T = 0)
128
 
129
	// High ////////////////////////////////////////////////////////////////
130
 
131
	out 11, r24      // 1 high                  (T = 1)
132
	rjmp .+0         // 2 nop nop               (T = 3)
133
	rjmp .+0         // 2 nop nop               (T = 5)
134
	nop              // 1 nop                   (T = 6)
135
 
136
	// Data ////////////////////////////////////////////////////////////////
137
 
138
	out 11, r18      // 1 data                  (T = 7)
139
	lpm r18 , Z+     // 3 data = *ptr++         (T = 10)
140
	rjmp .+0         // 2 nop nop               (T = 12)
141
	nop              // 1 nop                   (T = 13)
142
 
143
	// Low /////////////////////////////////////////////////////////////////
144
 
145
	out 11, r25      // 1 low                   (T = 14)
146
	rjmp .+0         // 2 nop nop               (T = 16)
147
 
148
	// cnt-- ///////////////////////////////////////////////////////////////
149
 
150
	sbiw r26, 1      // 2 cnt--                 (T = 18)
151
	brne bit_loop_p  // 2 if(count!=0) branch   (T = 20)
152
 
153
        ////////////////////////////////////////////////////////////////////////
154
	//
155
	// _delay_us(50) := 200 * 4 * 62.5ns @ 16MHz
156
	//
157
        ////////////////////////////////////////////////////////////////////////
158
 
159
	ldi r24,lo8(200) // delay_cnt = 200;
160
	ldi r25,hi8(200) //
161
 
162
	///////////////////////////////////////////////////////////////////////
163
 
164
	delayP: sbiw r24,1 // 2 delay--
165
	brne delayP        // 2 if(delay_cnt!=0) branch
166
 
167
        ////////////////////////////////////////////////////////////////////////
168
 
169
	sei
170
	ret              // 4/5
171
 
172
        ////////////////////////////////////////////////////////////////////////
173
 
174
	.size	ws2812b_send_p, .-ws2812b_send_p
175
 
176
        ///////////////////////////////////////////////////////////////////////
177
#endif
178
 
179
///////////////////////////////////////////////////////////////////////////////
180
//
181
// 8MHz
182
//
183
///////////////////////////////////////////////////////////////////////////////
184
 
185
#if F_CPU == 8000000UL
186
 
187
        ///////////////////////////////////////////////////////////////////////
188
        //
189
        // ws2812b_send(U8 * ptr, U16 cnt)
190
        //
191
	// H H H d d d L L L L
192
        // ^   ^ ^   ^ ^     ^
193
        // 1   3 4   6 7    10
194
        //
195
	// 10 cyles @ 125ns(8MHz) = 1.25us
196
	//
197
        ///////////////////////////////////////////////////////////////////////
198
 
199
        .global	ws2812b_send
200
	.type	ws2812b_send, @function
201
 
202
	///////////////////////////////////////////////////////////////////////
203
 
204
ws2812b_send:
205
	movw r30,r24     // 1 U8 *ptr
206
	movw r26,r22     // 1 U16 cnt
207
 
208
	ldi  r25,lo8(0)  // 1 Low
209
	ldi  r24,lo8(-1) // 1 High
210
 
211
	ld   r18,Z+      // 2 data = *ptr++
212
	cli
213
 
214
	////////////////////////////////////////////////////////////////////////
215
 
216
	bit_loop:        //                         (T = 0)
217
 
218
	// High ////////////////////////////////////////////////////////////////
219
 
220
	out 11, r24      // 1 high                  (T = 1)
221
	sbiw r26, 1      // 2 cnt--                 (T = 3)
222
 
223
	// Data ////////////////////////////////////////////////////////////////
224
 
225
	out 11, r18      // 1 data                  (T = 4)
226
	ld r18 , Z+      // 2 data = *ptr++         (T = 6)
227
	nop              // 1 nop                   (T = 7)
228
 
229
	// Low /////////////////////////////////////////////////////////////////
230
 
231
	out 11, r25      // 1 low                   (T = 8)
232
	brne bit_loop    // 2 if(count!=0) branch   (T = 10)
233
 
234
        ////////////////////////////////////////////////////////////////////////
235
	//
236
	// _delay_us(50) := 100 * 4 * 125ns @ 8MHz
237
	//
238
        ////////////////////////////////////////////////////////////////////////
239
 
240
	ldi r24,lo8(100) // 1 delay_cnt = 100;
241
	ldi r25,hi8(100) // 1
242
 
243
	///////////////////////////////////////////////////////////////////////
244
 
245
	delay: sbiw r24,1 // 2 delay--
246
	brne delay        // 2 if(delay_cnt!=0) branch
247
 
248
        ////////////////////////////////////////////////////////////////////////
249
 
250
	sei
251
	ret              // 4/5
252
 
253
        ////////////////////////////////////////////////////////////////////////
254
 
255
	.size	ws2812b_send, .-ws2812b_send
256
 
257
        ///////////////////////////////////////////////////////////////////////
258
        //
259
        // ws2812b_send_p(U8 * ptr, U16 cnt)
260
        //
261
	// H H H d d d L L L L
262
        // ^   ^ ^   ^ ^     ^
263
        // 1   3 4   6 7    10
264
        //
265
	// 10 cyles @ 125ns(8MHz) = 1.25us
266
	//
267
        ///////////////////////////////////////////////////////////////////////
268
 
269
        .global	ws2812b_send_p
270
	.type	ws2812b_send_p, @function
271
 
272
	///////////////////////////////////////////////////////////////////////
273
 
274
ws2812b_send_p:
275
	movw r30,r24     // 1 U8 *ptr
276
	movw r26,r22     // 1 U16 cnt
277
 
278
	ldi  r25,lo8(0)  // 1 Low
279
	ldi  r24,lo8(-1) // 1 High
280
 
281
	lpm  r18,Z+      // 2 data = *ptr++
282
	cli
283
 
284
	////////////////////////////////////////////////////////////////////////
285
 
286
	bit_loop_p:      //                         (T = 0)
287
 
288
	// High ////////////////////////////////////////////////////////////////
289
 
290
	out 11, r24      // 1 high                  (T = 1)
291
	sbiw r26, 1      // 2 cnt--                 (T = 3)
292
 
293
	// Data ////////////////////////////////////////////////////////////////
294
 
295
	out 11, r18      // 1 data                  (T = 4)
296
	lpm r18, Z+      // 3 data = *ptr++         (T = 7)
297
 
298
 
299
	// Low /////////////////////////////////////////////////////////////////
300
 
301
	out 11, r25      // 1 low                   (T = 8)
302
	brne bit_loop_p  // 2 if(count!=0) branch   (T = 10)
303
 
304
        ////////////////////////////////////////////////////////////////////////
305
	//
306
	// _delay_us(50) := 100 * 4 * 125ns @ 8MHz
307
	//
308
        ////////////////////////////////////////////////////////////////////////
309
 
310
	ldi r24,lo8(100) // 1 delay_cnt = 100;
311
	ldi r25,hi8(100) // 1
312
 
313
	///////////////////////////////////////////////////////////////////////
314
 
315
	delay_p: sbiw r24,1 // 2 delay--
316
	brne delay_p        // 2 if(delay_cnt!=0) branch
317
 
318
        ////////////////////////////////////////////////////////////////////////
319
 
320
	sei
321
	ret              // 4/5
322
 
323
        ////////////////////////////////////////////////////////////////////////
324
 
325
	.size	ws2812b_send_p, .-ws2812b_send_p
326
 
327
        ////////////////////////////////////////////////////////////////////////
328
#endif