Продолжение темы/Очередная доработка:
Отказался от библиотеки SmallUart, так что теперь нет необходимости скачивать библиотеку SmallUart. Основные функции перенес в скетч.
После очередной оптимизации программа снова "похудела" почти на 200 байтКод:#include <util/delay.h> //#include <smallUart.h> //#include <SPI.h> unsigned long LastByteTime, t; uint8_t data; void setup() { //Инициализация UART UBRR0L = 16;UBRR0H = 0; //115200 //UBRR0L = 34;UBRR0H = 0; //57600 UCSR0A = ( 1<<U2X0 ); //UART_DOUBLESPEED UCSR0C=((1<<UCSZ01) | (1<<UCSZ00)); //Set Frame Format UCSR0B = ((1<<TXEN0) | (1<<RXEN0)); //Enable The receiver and transmitter //Инициализация SPI; //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() bool Read_Next_Byte(uint8_t& data) { if (_SFR_MEM8(0xC0) & (1<<7)) //(UCRA & (1<<UART_RXREADY)) { data = _SFR_MEM8(0xC6); //data = UDR; return true; } else return false; } void loop() { //for(;;){ t= millis(); if (Read_Next_Byte(data)){ //if (true){ 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 }
Знаковое число получилось )))Размер скетча в двоичном коде: 666 байт




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