Очередная итерация скетча для работы с WS2801.
1. проверена работа в паре с другой Ардуиной в режиме SPI приемника, соотвественно исправлены все ошибки.
2. заменены библиотеки COM порта на более легкие и быстрые.
3. произведена оптимизация в сторону максимального отказа от Ардуиновских библиотек.
4. После оптимизаций прошивка на порядок полегчала , с 3.16кб до 0,85кб. Думаю, так же улучшилась отзывчивость кода.
Сам скетч:
(некоторые комментарии оставил для понимания кода)
Если кому-нибудь нужно, могу дополнительно выложить Скетч для Ардуино, который переводит мегу в режим приемника SPI и посылает принятые данные из шины SPI на COM порт. Очень удобно для отладки...Код:#include <util/delay.h> #include <smallUart.h> //#include <SPI.h> unsigned long LastByteTime, t; uint8_t data,byte_count = 0; void setup() { UART_Init(115200); //Заменяем команду SPI.begin(); //SPI.begin(); DDRB |= (1<<MOSI) | (1<< SCK) | (1<<SS); PORTB |= _BV(PORTB2); PORTB &= ~((1<<PORTB3)|(1<<PORTB5)); //SPI.setBitOrder(MSBFIRST); //SPI.setDataMode(SPI_MODE0); //SPI.setClockDivider(SPI_CLOCK_DIV16); // 1 МГц SPCR = 1; SPSR = 0; // 1 МГц; MSBFIRST; SPI_MODE0 //SPCR = 1; SPSR = 1; // 2 МГц; MSBFIRST; SPI_MODE0 //SPCR = 2; SPSR = 1; // 0.5 МГц; MSBFIRST; SPI_MODE0 }//setup() void loop() { //for(;;){ t= millis(); if (UART_ReadByte(data)){ LastByteTime = t; //if (data == 255){_delay_ms(1);continue;} //подождем 1мс для след кадра(for(;;)) if (data == 255){_delay_ms(1);return;} //подождем 1мс для след кадра(loop()) else{ // PORTB &= ~_BV(PORTB2); // для отладки: SS off, начинаем передачу SPDR = data;while(!(SPSR & _BV(SPIF))); //PORTB |= _BV(PORTB2); // для отладки: SS on, закончили передачу } }else{ //гасим подсветку если нет потока более 10 сек if((t - LastByteTime) > 10000) { for(int8_t i=0; i<255; i++) { SPDR = 0;while(!(SPSR & _BV(SPIF))); } _delay_ms(1); // подождем 1мс LastByteTime = t; } } //}//for }
PS: библиотеку SmallUart можно взять отсюда




Ответить с цитированием
