Вот моё видео со светолентой
Вид для печати
Вот моё видео со светолентой
Здравствуйте. Собрал 3-х зонную подсветку по схеме из 1-ого сообщения, вот только проблема с цветами... Вместо красного горит голубая (синий+зеленый), вместо синего желтая (красн+зелен), а вместо черного - горит белым. Пользуюсь программой boblight-1.3-beta1, в чем проблема?
Проблема в настройках. У меня в обеих программах работает нормально, только Боблайт тормозит , особенно в HD фильмах
Подправил скетч и все заработало :) Вот только проблема, вместо черного подсветка горит красным...
Сколько метров ленты выдерживает одна ULN в SMD корпусе ?
Ленты все разные с разной плотностью и с разными токами потребления
На один КАНАЛ ULN моно подключать не больше 500мА
По-моему я считал, получалось, что можно делать 60-см ленты одинарной плотности (3 светодиода на 10 см).
День добрый, вот решил собрать имбилайт на 30 светодиовов(10 каналов по 3 РГБ в каждом) Ардуино у меня MEGA1280 выходов там достаточно чтоб не морочится со сдвиговыми регистрами.... думаю сделаю 30 ключей на КТ315 и будет мне счастье, да не тут то было.... заливаю скейч на 4 канала (12 диодов) всё работает добавляю по одному и после 5 канала не чего не выходит.... не работают выходы на меги и всё тут как буд то ограничение в 16 выходов....
ПРоблема в скейче или мега просто физически не победит 30 каналов?
Цитата:
#include <SoftPWM.h>
uint8_t leds[30] = {22, 23, 24, 25, 26, 27, 28, 29, 30,31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51};
byte volatile color[30];
unsigned long night=0;
void setup()
{
Serial.begin(115200);
SoftPWMBegin();
for (int i = 0; i < 30; i++)
SoftPWMSet(leds[i], 0);
SoftPWMSetFadeTime(ALL, 5, 5);
}
void loop()
{
if (Serial.available() > 30)
{
if (Serial.read() == 255)
{
for (int i = 0; i < 30; i++)
{
color[i] = Serial.read();
}
night=0;
}
}
else
{
if(night>30000) { night=0; for (byte i = 0; i < 30; i++) color[i] = 0;}
night++;
}
for (int i = 0; i < 30; i++)
SoftPWMSet(leds[i], color[i]);
}
в чём беда разобрался.... в файле softPWM стояло 16 максимальных каналов.... но теперь другая беда :) если ставлю частоту обновления 20мс
начинается мигание как на ёлке :))) сейчас поставил 2000мс вроде полёт нормальный, но хотелось бы 20 :) куда копать?
п.с. последний канал пожждит :) сам загорается когда захочет....
Скорее всего у тебя слабый компьютер
Уменьшай размер зон для увеличения производительности компьютера
ДАже когда включаю режим подсветка....
проц ATOM525
Рекомендации написал выше.
Цитата:
Уменьшай размер зон для увеличения производительности компьютера
поставил 4 зоныв программе. всё равно ёлка....
ардуино прошит на 10 зон.
Нужно не количество зон уменьшать, а их площадь которая в настройках программы для каждой зоны
ок, сделал 2 зоны 10 на 10 и 10 в ширину , не чего не меняется.... сделал 2000мс диоды мерцают, и иногда подглючивают.....
если прошиваю ардуино прошивкой на 16 портов то работает всё замечательно, хоть зоны на весь экран ставь, а когда шью на 30 начинает лагать.... может этот softPWM не умеет на 30 каналов раскладывать, не простож там наверно стояло 16 максимальных каналов :) может кто нить скетч подкинет на 30 каналов без soft PWM?
я пробовал вот так шить
но и тут всего 14 каналов......Цитата:
#define D2_High PORTE |=B00010000 //red line-1 on
#define D2_LOW PORTE &= B11101111 //red line-1 off
#define D3_High PORTE |=B00100000 //green line-1 on
#define D3_LOW PORTE &= B11011111 //green line-1 off
#define D4_High PORTG |=B00100000 //blue line-1 on
#define D4_LOW PORTG &= B11011111 //blue line-1 off
#define D5_High PORTE |=B00001000 //red line-2 on
#define D5_LOW PORTE &= B11110111 //red line-2 off
#define D6_High PORTH |=B00001000 //green line-2 on
#define D6_LOW PORTH &= B11110111 //green line-2 off
#define D7_High PORTH |=B00010000 //blue line-2 on
#define D7_LOW PORTH &= B11101111 //blue line-2 off
#define D8_High PORTH |=B00100000 //red line-3 on
#define D8_LOW PORTH &= B11011111 //red line-3 off
#define D9_High PORTH |=B01000000 //green line-3 on
#define D9_LOW PORTH &= B10111111 //green line-3 off
#define D10_High PORTB |=B00010000 //blue line-3 on
#define D10_LOW PORTB &= B11101111 //blue line-3 off
#define D11_High PORTB |=B00100000 //red line-4 on
#define D11_LOW PORTB &= B11011111 //red line-4 off
#define D12_High PORTB |=B01000000 //green line-4 on
#define D12_LOW PORTB &= B10111111 //green line-4 off
#define D13_High PORTB |=B10000000 //blue line-4 on
#define D13_LOW PORTB &= B01111111 //blue line-4 off
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[12]; //массив храннения цветов 12-ть каналов
void setup()
{
for (int i=2; i < 14; 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() > 12)
{
if (Serial.read() == 255) //проверка прификса
{
for (int i = 0; i < 12; 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 < 12; 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;
}
в програмировании ардуин не силён, прошу помощи....
Попробуй в следующей строке подобрать значение
нужно значение 252 уменьшатьЦитата:
tcnt2 = 252; // 16000000/31000/64=8 tcnt2=256-8=248.
Это плавное изменение частоты ШИМ
Вот теперь совсем запутолся.....
У меня скейч на 30 диодов работает через одно место но все 30!
или с ней не чего не выдет?Цитата:
#include <SoftPWM.h>
uint8_t leds[30] = {22, 23, 24, 25, 26, 27, 28, 29, 30,31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51};
byte volatile color[30];
unsigned long night=0;
void setup()
{
Serial.begin(115200);
SoftPWMBegin();
for (int i = 0; i < 30; i++)
SoftPWMSet(leds[i], 0);
SoftPWMSetFadeTime(ALL, 5, 5);
}
void loop()
{
if (Serial.available() > 30)
{
if (Serial.read() == 255)
{
for (int i = 0; i < 30; i++)
{
color[i] = Serial.read();
}
night=0;
}
}
else
{
if(night>30000) { night=0; for (byte i = 0; i < 30; i++) color[i] = 0;}
night++;
}
for (int i = 0; i < 30; i++)
SoftPWMSet(leds[i], color[i]);
}
Эту я тоже пробовал но тут нет 30... тут только 14...
Если так то как добавить к этойещё 16 каналов?Цитата:
#define D2_High PORTE |=B00010000 //red line-1 on
#define D2_LOW PORTE &= B11101111 //red line-1 off
#define D3_High PORTE |=B00100000 //green line-1 on
#define D3_LOW PORTE &= B11011111 //green line-1 off
#define D4_High PORTG |=B00100000 //blue line-1 on
#define D4_LOW PORTG &= B11011111 //blue line-1 off
#define D5_High PORTE |=B00001000 //red line-2 on
#define D5_LOW PORTE &= B11110111 //red line-2 off
#define D6_High PORTH |=B00001000 //green line-2 on
#define D6_LOW PORTH &= B11110111 //green line-2 off
#define D7_High PORTH |=B00010000 //blue line-2 on
#define D7_LOW PORTH &= B11101111 //blue line-2 off
#define D8_High PORTH |=B00100000 //red line-3 on
#define D8_LOW PORTH &= B11011111 //red line-3 off
#define D9_High PORTH |=B01000000 //green line-3 on
#define D9_LOW PORTH &= B10111111 //green line-3 off
#define D10_High PORTB |=B00010000 //blue line-3 on
#define D10_LOW PORTB &= B11101111 //blue line-3 off
#define D11_High PORTB |=B00100000 //red line-4 on
#define D11_LOW PORTB &= B11011111 //red line-4 off
#define D12_High PORTB |=B01000000 //green line-4 on
#define D12_LOW PORTB &= B10111111 //green line-4 off
#define D13_High PORTB |=B10000000 //blue line-4 on
#define D13_LOW PORTB &= B01111111 //blue line-4 off
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[12]; //массив храннения цветов 12-ть каналов
void setup()
{
for (int i=2; i < 14; 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() > 12)
{
if (Serial.read() == 255) //проверка прификса
{
for (int i = 0; i < 12; 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 < 12; 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;
}
Я думаю что с SoftPWM , будет тормозить
тебе нужно привести твои порты к такому виду
Цитата:
#define D2_High PORTE |=B00010000 //red line-1 on
#define D2_LOW PORTE &= B11101111 //red line-1 off
#define D3_High PORTE |=B00100000 //green line-1 on
#define D3_LOW PORTE &= B11011111 //green line-1 off
#define D4_High PORTG |=B00100000 //blue line-1 on
#define D4_LOW PORTG &= B11011111 //blue line-1 off
не как не могу понять логику в этих портах.......может где нибудь табличка есть умная :) ???
http://yqezpq.blu.livefilestore.com/...INO%20MEGA.jpg
вот чего нануглил, но всё равно не могу с портми разобраться...
п.с. весь день бьюсь с этой штукой.... не могу я с портами разобраться работают только 4 которые в готовом коде были... а остальные 6 не могу не как привязать...
Разобрался я со своей мегой1280..... Вопщем Аппартный ШИМ есть только на выходах от 3 до 13 и на нижней площадке от 44 до 46.
ПОлучаем только 15 выходов аппаратного ШИМа.
п.с. Сегодня буду писать скейч Аппаратный + софтовый, у софтового максимум 16 и апаратный 15.... как раз на 30 выходов мне хватит.
целый день бился с кодом... не как не могу его победить....
может кто покажет где ошибка?
Цитата:
#define D2_High PORTE |=B00010000 //red line-1 on
#define D2_LOW PORTE &= B11101111 //red line-1 off
#define D3_High PORTE |=B00100000 //green line-1 on
#define D3_LOW PORTE &= B11011111 //green line-1 off
#define D4_High PORTG |=B00100000 //blue line-1 on
#define D4_LOW PORTG &= B11011111 //blue line-1 off
#define D5_High PORTE |=B00001000 //red line-2 on
#define D5_LOW PORTE &= B11110111 //red line-2 off
#define D6_High PORTH |=B00001000 //green line-2 on
#define D6_LOW PORTH &= B11110111 //green line-2 off
#define D7_High PORTH |=B00010000 //blue line-2 on
#define D7_LOW PORTH &= B11101111 //blue line-2 off
#define D8_High PORTH |=B00100000 //red line-3 on
#define D8_LOW PORTH &= B11011111 //red line-3 off
#define D9_High PORTH |=B01000000 //green line-3 on
#define D9_LOW PORTH &= B10111111 //green line-3 off
#define D10_High PORTB |=B00010000 //blue line-3 on
#define D10_LOW PORTB &= B11101111 //blue line-3 off
#define D11_High PORTB |=B00100000 //red line-4 on
#define D11_LOW PORTB &= B11011111 //red line-4 off
#define D12_High PORTB |=B01000000 //green line-4 on
#define D12_LOW PORTB &= B10111111 //green line-4 off
#define D13_High PORTB |=B10000000 //blue line-4 on
#define D13_LOW PORTB &= B01111111 //blue line-4 off
#define D44_High PORTL |=B00100000 //red line-4 on
#define D44_LOW PORTL &= B11011111 //red line-4 off
#define D45_High PORTL |=B01000000 //green line-4 on
#define D45_LOW PORTL &= B10111111 //green line-4 off
#define D46_High PORTL |=B10000000 //blue line-4 on
#define D46_LOW PORTL &= B01111111 //blue line-4 off
volatile unsigned int tcnt2;
volatile byte pwm_time;
unsigned long blank=0;
#include <SoftPWM.h>
uint8_t leds[15] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36};
byte volatile color[15];
unsigned long night=0;
void setup()
{
Serial.begin(115200);
for (int i=2; i < 15; i++){pinMode(i, OUTPUT);}
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.
SoftPWMBegin();
for (int n = 0; n < 15; n++)
SoftPWMSet(leds[n], 0);
SoftPWMSetFadeTime(ALL, 5, 5);
}
void loop()
{
if (Serial.available() > 15)
{
if (Serial.read() == 255) //проверка прификса
{
for (int i = 0; i < 15; 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 < 15; 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 ) D44_High; else D44_LOW;
if(color[13] > pwm_time) D45_High; else D45_LOW;
if(color[14] > pwm_time) D46_High; else D46_LOW;
if (Serial.available() > 15)
{
if (Serial.read() == 255)
{
for (int n = 0; n < 15; n++)
{
color[n] = Serial.read();
}
night=0;
}
}
else
{
if(night>30000) { night=0; for (byte n = 0; n < 15; n++) color[n] = 0;}
night++;
}
for (int n = 0; n < 15; n++)
SoftPWMSet(leds[n], color[n]);
}
Я уже писал что ошибка в SoftPWM
Забросил я мороку с софт шимом. Поехал в Чип и дип и купил регистров.
Но и тут у меня грабли :) всё собрал по схеме только ардуинка не нано а мега1280, нашел я ноги 10(нано)-53(мега), 11-51, 13-52.
Вот этот скей с сайта ардуино работает.
А заливаю скей для эмбилайтаPHP код:
//**************************************************************//
// Name : shiftOutCode, Hello World
// Author : Carlyn Maw,Tom Igoe, David A. Mellis
// Date : 25 Oct, 2006
// Modified: 23 Mar 2010
// Version : 2.0
// Notes : Code for using a 74HC595 Shift Register //
// : to count from 0 to 255
//****************************************************************
//Pin connected to ST_CP of 74HC595
int latchPin = 53;
//Pin connected to SH_CP of 74HC595
int clockPin = 52;
////Pin connected to DS of 74HC595
int dataPin = 51;
void setup() {
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
// count from 0 to 255 and display the number
// on the LEDs
for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
// take the latchPin low so
// the LEDs don't change while you're sending in bits:
digitalWrite(latchPin, LOW);
// shift out the bits:
shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay);
//take the latch pin high so the LEDs will light up:
digitalWrite(latchPin, HIGH);
// pause before next value:
delay(500);
}
}
а в ответ тишина(не чего не светится)....чую грабли в SPI... хотя первый скей по этим-же ногам и с этой же схемой работает.PHP код:
#define TCNT2_Const 250 //256-9
#define BrightnessSize 30 //число каналов
unsigned long blank=0; //таймер простоя
uint8_t volatile PWM_Counter=0;
uint8_t Brightness[BrightnessSize];
void setup()
{
pinMode(53, OUTPUT); //SS SPI вывод для управления защелкой
pinMode(51, OUTPUT); // SPI DATA
pinMode(52, OUTPUT); // SPI Clock
digitalWrite(53,LOW);
digitalWrite(51,LOW);
digitalWrite(52,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++)
{
if(Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
i++;
byte_shift = byte_shift<<1;
}
SPDR = byte_shift; //отправляем в шину SPI
//**************************************
byte_shift = 0;
for (uint8_t bt=0; bt<8; bt++)
{
if(Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
i++;
byte_shift = byte_shift<<1;
}
SPDR = byte_shift; //отправляем в шину SPI
//**************************************
byte_shift = 0;
for (uint8_t bt=0; bt<8; bt++)
{
if(Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
i++;
byte_shift = byte_shift<<1;
}
SPDR = byte_shift; //отправляем в шину SPI
PORTB |= (1<<PIN2); //формируем положительный импульс защелки
PWM_Counter++;
while(!(SPSR & (1<<SPIF))); // Ожидание завершения передачи данных
PORTB &= ~(1<<PIN2);
}
п.с. уж простите за очередной вопрос.... не силён я в програмировании... сил и времени уже вложено, не хочется бросать на пол пути.
п.с.2. или лучше купить адрдуино нано? и не морочится с мегой
Привет всем. Респект Chip за столь обстоятельный ПОСТ.
Хочу собрать сеё уст-во на 6 зон 18 каналов(судя по посту одна ардуина справится?), Не дадите скейч, или он единый, для разного кол-ва зон и отличие только в настройке Win-приложения?
В программировании не силен.
Ардуинка какая? Nano Uno?
п.с. схема нужна с регистрами
PHP код:
#define TCNT2_Const 250 //256-9
#define BrightnessSize 18 //число каналов
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);
}
Зачем тебе на меге с регистрами заморачиватся у тебя же огромное количество выходов? Достаточно будет описать все выходы(#define D2_High PORTD |=B00000100Цитата:
Забросил я мороку с софт шимом. Поехал в Чип и дип и купил регистров.
Но и тут у меня грабли всё собрал по схеме только ардуинка не нано а мега1280, нашел я ноги 10(нано)-53(мега), 11-51, 13-52.
Вот этот скей с сайта ардуино работает.
#define D2_LOW PORTD &= B11111011) и настроить таймер
Попробуй вот этот скетчь и отпишись
Я его еще не проверял
Не забудь настройки в программе сделать на 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;
}
Вот тебе в помощь распиновку контроллера
Будет выглядеть примерно так
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 и т.д.
сделал скей на 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
стыдно спросить...а какое значение включено и выключено должно быть у 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
правльно только в таблице еще нужно 0-й бит добавить