Shatun_ (07.01.2019 10:35, просмотров: 411) ответил Гудвин на Не :) Нашел перед НГ у себя несколько PIC16F1454. Легких путей мы не ищем - ардуины не пройдут! ;), посему зародилась мысль - а не забацать ли именно на этой таракашке чё-нить "для души", пока все спят до середины Января. Заодно пощупать за вымя
Насчет времянки для WS2812B. У меня получилось и на помедленней. Пришлось ассемблер использовать. На С было не предсказуемо, плюс шлак от XC8 free делал код медленным.
void putColor(uint8_t r, uint8_t g, uint8_t b) {
c[0] = r;
c[1] = g;
c[2] = b;
cj = LEDS_COUNT;
INTERRUPT_GlobalInterruptDisable();
#asm
LED_LOOP:
banksel _c
MOVF _c & 0x7F, W
banksel _cc
MOVWF _cc & 0x7F
banksel _c
MOVF (_c + 1) & 0x7F, W
banksel _cc
MOVWF (_cc + 1) & 0x7F
banksel _c
MOVF (_c + 2) & 0x7F, W
banksel _cc
MOVWF (_cc + 2) & 0x7F
MOVLW 24
banksel _ci
MOVWF _ci & 0x7F
LED_BIT_LOOP:
banksel _cc
BTFSC _cc & 0x7F, 7
BRA LED_SEND_1
banksel LATC
BSF LATC, 0x5
BCF LATC, 0x5
BRA LED_SEND_DONE
LED_SEND_1:
banksel LATC
BSF LATC, 0x5
NOP
NOP
BCF LATC, 0x5
LED_SEND_DONE:
banksel _cc
RLF (_cc + 2) & 0x7F
RLF (_cc + 1) & 0x7F
RLF _cc & 0x7F
banksel _ci
DECFSZ _ci & 0x7F
BRA LED_BIT_LOOP
banksel _cj
DECFSZ _cj & 0x7F
BRA LED_LOOP
#endasm
INTERRUPT_GlobalInterruptEnable();
__delay_us(50);
}