
 Сообщение от 
denns
					 
				 
				не могли бы выложить готовый скетч для Nano плиз, хочу попробывать 24 канала на микрухах уже
			
		 
	 
 
	PHP код:
	
#define TCNT2_Const 250 //256-9
#define BrightnessSize 24 //число каналов
unsigned long blank=0; //таймер простоя 
uint8_t volatile PWM_Counter=0;
uint8_t Brightness[BrightnessSize];
void setup()  
{ 
          pinMode(10, OUTPUT);   //SS SPI вывод для управления защелкой
        pinMode(11, OUTPUT);    // SPI DATA
        pinMode(13, OUTPUT);   // SPI Clock
        digitalWrite(10,LOW);
        digitalWrite(11,LOW);
        digitalWrite(13,LOW);
        SPSR = (1<<SPI2X);       // SPI set clock rate fck/2
        SPCR = (1<<SPE)|(1<<MSTR); // Enable SPI, Master
        
    for (int i=0;i<BrightnessSize;i++) //обнулить массив
    {
        Brightness[i]=0;
    }
        Serial.begin(115200);
    TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2  
    TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика 
    TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика 
    TCCR2B |= (1<<CS22); //установка предделителя 64
    ASSR &= ~(1<<AS2);  //Выбор источника синхронизации таймера если AS2=0 от системного генератора 
    TCNT2 = TCNT2_Const; //  16000000/256/100/64=8 tcnt2=256-8=248.     
    TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
    sei(); 
} 
void loop()  
{ 
  if (Serial.available() > BrightnessSize)  
  {  
      if (Serial.read() == 255)  //проверка прификса       
        {
            for (int i = 0; i < BrightnessSize; i++)  
             {                 
               Brightness[i] = Serial.read();  // прочитать данные о цветах из порта в массив 
             }         
             blank=0; 
        } 
  } else {  
           if(blank>100000) { blank=0; for (byte i = 0; i < BrightnessSize; i++)  Brightness[i] = 15;}  
          blank++;  
         }   
}
SIGNAL(TIMER2_OVF_vect)
{ 
uint8_t PWM_Counter_v=PWM_Counter; // поскольку PWM_Counter объявлена как valotile, обращение к ней - всегда обращение в память. Поэтому создаем локальную копию, она будет храниться в регистре.
TCNT2 = TCNT2_Const; 
uint8_t i = 0; 
uint8_t byte_shift;
uint8_t nbit; // делаем переменную для хранения сдвинутого бита, чтобы у компилятора не возникало желания каждый раз в цикле сдвигать 1 на bt бит влево
byte_shift = 0;
for (uint8_t bt=0; bt<8; bt++)
{
byte_shift = byte_shift<<1;
if(Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
i++;
}
SPDR = byte_shift; //отправляем в шину SPI 
//**************************************
byte_shift = 0;
for (uint8_t bt=0; bt<8; bt++)
{
byte_shift = byte_shift<<1;
if(Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
i++;
}
SPDR = byte_shift; //отправляем в шину SPI 
//**************************************
byte_shift = 0;
for (uint8_t bt=0; bt<8; bt++)
{
byte_shift = byte_shift<<1;
if(Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
i++;
}
SPDR = byte_shift; //отправляем в шину SPI 
    PORTB |= (1<<PIN2); //формируем положительный импульс защелки
        PWM_Counter++;
        while(!(SPSR & (1<<SPIF)));   // Ожидание завершения передачи данных
    PORTB &= ~(1<<PIN2);
} 
 это оно по SPI ?????