0@0
LibraryRoot
0@0
355
0@0
169
308
0@0
root
2
0@0
1
5
100@20
100@20 corner: 209.0d@40.0d
left
Загрузить в Ардуино
103.0d
3@12.0d
9.0d
90@100
110@100 corner: 282.0d@140
90@100 corner: 302.0d@140
115.0d@114.5d
EN_eff
90@130
104@130
WS2812_com_Glediator and Jinx
db618684-e910-493b-a86d-4fcb821d077b
7916881f-67e2-46d7-ac93-ccad1947160c
a1b1d295-0403-4ccb-816e-93627eed3186
WS2812 эффекты Glediator и Jinx через UART
Управление световыми эффектами из программ Glediator и Jinx через компьютер.
DATA_PIN - Выход на ленту (PIN 6).
RX - 0, TX - 1.
NUMBER_OF_PIXELS - количество пикселей (светодиодов).
183
NUMBER_OF_PIXELS
30
b4e48060-84f6-45cc-bb16-4daa7db892de
f4b09df7-2287-40b5-a797-a003fe07849a
DATA_PIN
6
9ee685a7-4675-4677-a406-63f644a4956b
486b8f08-dc78-4650-8457-233e3e34059b
if (EN_eff) { if (go==1)
{
cli();
ws2812_sendarray(display_buffer, NUMBER_OF_PIXELS * 3);
sei();
go=0;
}
}
158
DATA_DDR |= (1 << DATA_PIN);
UCSR0A |= (1<<U2X0);
UCSR0B |= (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00) ;
UBRR0H = 0;
UBRR0L = 1; //Baud Rate 1 MBit (at F_CPU = 16MHz)
ptr=display_buffer;
sei();
288
#define
DATA_PORT
PORTD
#define
DATA_DDR
DDRD
display_buffer
[NUMBER_OF_PIXELS * 3];
unsigned char
*ptr
;
static unsigned char
pos
= 0;
static unsigned int
go
= 0;
volatile unsigned char
uint8_t curbyte,ctr,masklo;
uint8_t maskhi = _BV(DATA_PIN);
masklo =~ maskhi & DATA_PORT;
maskhi |= DATA_PORT;
while (datlen--)
{
curbyte = *data++;
asm volatile
(
" ldi %0,8 \n\t" // 0
"loop%=:out %2, %3 \n\t" // 1
"lsl %1 \n\t" // 2
"dec %0 \n\t" // 3
" rjmp .+0 \n\t" // 5
" brcs .+2 \n\t" // 6l / 7h
" out %2,%4 \n\t" // 7l / -
" rjmp .+0 \n\t" // 9
" nop \n\t" // 10
" out %2,%4 \n\t" // 11
" breq end%= \n\t" // 12 nt. 13 taken
" rjmp .+0 \n\t" // 14
" rjmp .+0 \n\t" // 16
" rjmp .+0 \n\t" // 18
" rjmp loop%= \n\t" // 20
"end%=: \n\t"
: "=&d" (ctr)
: "r" (curbyte), "I" (_SFR_IO_ADDR(DATA_PORT)), "r" (maskhi), "r" (masklo)
);
}
815
void
ws2812_sendarray
uint8_t
*data
uint16_t
datlen
unsigned char b;
b=UDR0;
if (b == 1) {pos=0; ptr=display_buffer; return;}
if (pos == (NUMBER_OF_PIXELS*3)) {} else {*ptr=b; ptr++; pos++;}
if (pos == ((NUMBER_OF_PIXELS*3)-1)) {go=1;}
202
ISR
USART_RX_vect
90@120 corner: 110@140
172.0d
221.0d
0
9600
arduinoIDE
31
1024
Arduino Uno
142360727