Результаты опроса: Нужна ли вам такая функция на телевизоре?

Голосовавшие
191. Вы ещё не голосовали в этом опросе
  • Нет.

    28 14.66%
  • Да.

    129 67.54%
  • Нужна , только руки кривые, самому не осилить

    34 17.80%
Показано с 1 по 10 из 921

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #10
    Продвинутый Аватар для HiddenPilot
    Регистрация
    14.04.2008
    Возраст
    46
    Сообщений
    354
    Вес репутации
    311

    По умолчанию Re: Фоновая подсветка телевизора Ambilight

    Очередная итерация скетча для работы с WS2801.
    1. проверена работа в паре с другой Ардуиной в режиме SPI приемника, соотвественно исправлены все ошибки.
    2. заменены библиотеки COM порта на более легкие и быстрые.
    3. произведена оптимизация в сторону максимального отказа от Ардуиновских библиотек.
    4. После оптимизаций прошивка на порядок полегчала , с 3.16кб до 0,85кб. Думаю, так же улучшилась отзывчивость кода.

    Сам скетч:
    (некоторые комментарии оставил для понимания кода)
    Код:
    #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
     }
    Если кому-нибудь нужно, могу дополнительно выложить Скетч для Ардуино, который переводит мегу в режим приемника SPI и посылает принятые данные из шины SPI на COM порт. Очень удобно для отладки...

    PS: библиотеку SmallUart можно взять отсюда
    Последний раз редактировалось HiddenPilot; 03.09.2012 в 22:17.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •