Гудвин, волшебник (07.01.2019 11:01, просмотров: 434) ответил Shatun_ на Насчет времянки для WS2812B. У меня получилось и на помедленней. Пришлось ассемблер использовать. На С было не предсказуемо, плюс шлак от XC8 free делал код медленным.
Не понимаю я все эти MOVLWLWLW с банками ;) Тупо наговнокодил:
void send_ws(void)
{
static uint8_t cb;
static uint8_t i;
for (i=0;i<36;i++)
{
cb=RxDataBuffer[i];
SSP1BUF = (cb & 0x80) ? 0xFF : 0xF0;
cb <<= 1;
asm("nop");
asm("nop");
asm("nop");
SSP1BUF = (cb & 0x80) ? 0xFF : 0xF0;
cb <<= 1;
asm("nop");
asm("nop");
asm("nop");
SSP1BUF = (cb & 0x80) ? 0xFF : 0xF0;
cb <<= 1;
asm("nop");
asm("nop");
asm("nop");
SSP1BUF = (cb & 0x80) ? 0xFF : 0xF0;
cb <<= 1;
asm("nop");
asm("nop");
asm("nop");
SSP1BUF = (cb & 0x80) ? 0xFF : 0xF0;
cb <<= 1;
asm("nop");
asm("nop");
asm("nop");
SSP1BUF = (cb & 0x80) ? 0xFF : 0xF0;
cb <<= 1;
asm("nop");
asm("nop");
asm("nop");
SSP1BUF = (cb & 0x80) ? 0xFF : 0xF0;
cb <<= 1;
asm("nop");
asm("nop");
asm("nop");
SSP1BUF = (cb & 0x80) ? 0xFF : 0xF0;
}
}
Задержка 1.25 us возникает во время чтения очередного байта. Но WS, как оказалось, это вполне переваривает. Так что можно и сдвиги в цикл вставить.