Нет.
Да.
Нужна , только руки кривые, самому не осилить
Последний раз редактировалось asuz; 11.10.2011 в 17:28.
Попробуй вот этот скетчь и отпишись
Я его еще не проверял
Не забудь настройки в программе сделать на 18 каналов
PHP код:
#define D2_High PORTD |=B00000100 //red
#define D2_LOW PORTD &= B11111011
#define D3_High PORTD |=B00001000 //green
#define D3_LOW PORTD &= B11110111
#define D4_High PORTD |=B00010000 //blue
#define D4_LOW PORTD &= B11101111
#define D5_High PORTD |=B00100000
#define D5_LOW PORTD &= B11011111
#define D6_High PORTD |=B01000000
#define D6_LOW PORTD &= B10111111
#define D7_High PORTD |=B10000000
#define D7_LOW PORTD &= B01111111
#define D8_High PORTB |=B00000001
#define D8_LOW PORTB &= B11111110
#define D9_High PORTB |=B00000010
#define D9_LOW PORTB &= B11111101
#define D10_High PORTB|=B00000100
#define D10_LOW PORTB &=B11111011
#define D11_High PORTB |=B00001000
#define D11_LOW PORTB &= B11110111
#define D12_High PORTB |=B00010000
#define D12_LOW PORTB &= B11101111
#define D13_High PORTB |=B00100000
#define D13_LOW PORTB &= B11011111
#define D14_High PORTC |=B00000001
#define D14_LOW PORTC &= B11111110
#define D15_High PORTC |=B00000010
#define D15_LOW PORTC &= B11111101
#define D16_High PORTC |=B00000100
#define D16_LOW PORTC &= B11111011
#define D17_High PORTC |=B00001000
#define D17_LOW PORTC &= B11110111
#define D18_High PORTC |=B00010000
#define D18_LOW PORTC &= B11101111
#define D19_High PORTC |=B00100000
#define D19_LOW PORTC &= B11011111
volatile unsigned int tcnt2;
volatile byte pwm_time;
//byte pwm_time, Red_R_Old, Green_L_Old, Blue_T_Old;
unsigned long blank=0; //таймер простоя
byte volatile color[18]; //массив храннения цветов 12-ть каналов
void setup()
{
for (int i=2; i < 19; i++){pinMode(i, OUTPUT);}
Serial.begin(115200);
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
tcnt2 = 252; // 16000000/31000/64=8 tcnt2=256-8=248.
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
}
void loop()
{
if (Serial.available() > 18)
{
if (Serial.read() == 255) //проверка прификса
{
for (int i = 0; i < 18; i++)
{
color[i] = Serial.read(); // прочитать данные о цветах из порта в массив
}
// if (Red_R_Old == color[0] && Green_L_Old == color[4] && Blue_T_Old == color[8])
blank=0;
}
} else {
if(blank>100000) { blank=0; for (byte i = 0; i < 18; i++) color[i] = 0;}
blank++;
}
}
//****************обработчик прерывания********************
ISR(TIMER2_OVF_vect)
{
TCNT2 = tcnt2;
pwm_time++;
if(color[0] > pwm_time ) D2_High; else D2_LOW;
if(color[1] > pwm_time ) D3_High; else D3_LOW;
if(color[2] > pwm_time ) D4_High; else D4_LOW;
if(color[3] > pwm_time ) D5_High; else D5_LOW;
if(color[4] > pwm_time ) D6_High; else D6_LOW;
if(color[5] > pwm_time ) D7_High; else D7_LOW;
if(color[6] > pwm_time ) D8_High; else D8_LOW;
if(color[7] > pwm_time ) D9_High; else D9_LOW;
if(color[8] > pwm_time ) D10_High; else D10_LOW;
if(color[9] > pwm_time ) D11_High; else D11_LOW;
if(color[10] > pwm_time) D12_High; else D12_LOW;
if(color[11] > pwm_time) D13_High; else D13_LOW;
if(color[12] > pwm_time) D14_High; else D14_LOW;
if(color[13] > pwm_time) D15_High; else D15_LOW;
if(color[14] > pwm_time) D16_High; else D16_LOW;
if(color[15] > pwm_time) D17_High; else D17_LOW;
if(color[16] > pwm_time) D18_High; else D18_LOW;
if(color[17] > pwm_time) D19_High; else D19_LOW;
}
Последний раз редактировалось Chip; 11.10.2011 в 17:44.
Последний раз редактировалось Chip; 11.10.2011 в 17:56.
Вот тебе в помощь распиновку контроллера
Будет выглядеть примерно так
PE4 означает 4-й бит порта E, соответственно мы включаем этот бит B00010000 и выключаем B11101111 , не забывай что отсчет битов начинается с 0PHP код:
#define D2_High PORTE |=B00010000 //red
#define D2_LOW PORTE &= B11101111
#define D3_High PORTE |=B00100000 //green
#define D3_LOW PORTE &= B11011111
#define D4_High PORTG |=B00100000 //blue
#define D4_LOW PORTG &= B11011111
PG5 означает 5-й бит порта G и т.д.
Последний раз редактировалось Chip; 11.10.2011 в 18:23.
сделал скей на 15 каналов, пины вида
0C3A-5 вывод меги
0С3B-2 вывод меги
0С3C-3 вывод меги
и таких выводов 12 с 2по13 и ещё
0С5A-46
0С5B-45
0С5C-44 выводы меги
получается ещё +3 = 15
остальные выводы контроллера я не могу задействовать....
Прочитай выше сообщение
чёт не как
получается например вывод меги 23
вывод контроллера 77
PA1(AD1)
#define D23_High PORTA |=B00010000 //red line-1 on
#define D23_LOW PORTA &= B11101111 //red line-1 off
.
.
if(color[0] > pwm_time ) D23_High; else D23_LOW;
с таким кодом на выходе 23 меги нет не чего....
И не будет, ты бит не правильно установил, нужно устанавливать 1-й бит B00000010 а у тебя четвертый B00010000
Последний раз редактировалось Chip; 11.10.2011 в 18:43.
стыдно спросить...а какое значение включено и выключено должно быть у 1 бита у 2-го и остальных....
1-ого включено B00000010 это я уже знаю
а помойму понял
Включено:
0-bit B00000001
1-bit B00000010
2-bit B00000100
3-bit B00001000
4-bit B00010000
5-bit B00100000
6-bit B01000000
7-bit B10000000
Выключено:
0-bit B11111110
1-bit B11111101
2-bit B11111011
3-bit B11110111
4-bit B11101111
5-bit B11011111
6-bit B10111111
7-bit B01111111
Последний раз редактировалось asuz; 11.10.2011 в 19:02.
правльно только в таблице еще нужно 0-й бит добавить
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)