DIGILIGHT
ws2812.c
См. документацию.
1 
15 #include <avr/io.h>
16 #include "avr_helper.h"
17 #include <util/delay.h>
18 #include "global.h"
19 #include "pixel.h"
20 #include "ws2812.h"
21 
22 #if (F_CPU < 16000000UL) || !defined(F_CPU)
23 #error "F_CPU must be defined and must be greather or equal 16MHz"
24 #endif
25 
27 #define WS_BIT_0 0xE0
28 #define WS_BIT_1 0xF8
30 
35 __inline static void send_byte(uint8_t byte){
36  for(uint8_t mask=0x80; mask; mask >>=1){
37  SPDR = byte & mask ? WS_BIT_1 : WS_BIT_0;
38  while(bit_is_clear(SPSR, SPIF));
39  }
40 }
41 
45 void ws2812_show(void){
46  for(uint8_t i=0; i<PIXEL_CNT; i++){
47  for(uint8_t j=0; j<PIXEL_LEN; j++){
48  // для чипа WS2812 порядок цветовых составляющих должен быть таким:
49  send_byte((pixels[i].g * (pixels[i].bright+1))>>8); // сначала ЗЕЛЕНЫЙ
50  send_byte((pixels[i].r * (pixels[i].bright+1))>>8); // затем КРАСНЫЙ
51  send_byte((pixels[i].b * (pixels[i].bright+1))>>8); // в конце - СИНИЙ
52  }
53  }
54 }
55 
59 INIT(7){
60  DDR(PORT_SPI) |= _BV(PIN_MOSI) | _BV(PIN_SS) | _BV(PIN_SCK);
61 
62  SPCR = _BV(SPE) | _BV(MSTR) | _BV(CPHA);//fosc/2 16MHz/2
63  SPSR = _BV(SPI2X);
64  SPSR; SPDR;
65 }
66 
#define PORT_SPI
Символ порта, на который выведен аппаратный SPI.
Definition: hardware.h:30
Общие описания
#define WS_BIT_1
Константа для формирования импульса "1" для WS2812.
Definition: ws2812.c:29
сервисный модуль для реализации эффектов Набор вспомогательных функций для базовых манипуляций над це...
void ws2812_show(void)
обновление ленты светододов
Definition: ws2812.c:45
#define PIXEL_CNT
Общее количество пикселов
Definition: pixel.h:27
#define WS_BIT_0
Константа для формирования импульса "0" для WS2812.
Definition: ws2812.c:27
#define PIN_MOSI
Номер бита линии MOSI.
Definition: hardware.h:32
INIT(7)
Definition: ws2812.c:59
pixel_t pixels[MAX_TOTAL_PIX]
Массив пикселей предельного размера
Definition: pixel.c:22
#define PIN_SCK
Номер бита линии SCK.
Definition: hardware.h:36
#define PIN_SS
Номер бита линии SS.
Definition: hardware.h:34
аппаратные особенности подключения WS2812.