Делаю так что бы горели одни красные светодиоды, но вместе с красными горят и зеленые, и мерцают синие. задаю что б светили зеленые, но вместе с зелеными мерцают синие и еле заметно горят красные. и это при добавлении sei();
Вид для печати
Делаю так что бы горели одни красные светодиоды, но вместе с красными горят и зеленые, и мерцают синие. задаю что б светили зеленые, но вместе с зелеными мерцают синие и еле заметно горят красные. и это при добавлении sei();
так вроде еще есть скрол бар и тулс бар, он же не красного цвета
sei() в прерывании позволяет прервать прерывание таймера на другие прерывания - к примеру, на обработку прихода символа в uart (больше прерываний вроде как не может быть). Поскольку приход символа может скушать заметно времени, может появляется мерцание. Но ни на что больше это влиять не должно в нормальных условиях.
Сдвиг светящихся светодиодов может произойти, если прерывание по приходу символа не успевает обработаться до момента прихода еще одного символа. Размер аппаратного буфера - 1 байт. По прерыванию uart этот символ извлекается и перекладывается в программный буфер, из которого уже извлекаются символы в loop();
Думаю, что loop лучше модифицировать на что-то вроде:
В коде может и накосячил, протестить не на чем. Смысл в том, что не ждать, пока все данные загрузятся, а сразу менять Brightness, по приходу каждого байта.Код:void loop()
{
if (Serial.available())
{
if (Serial.read() == 255) //проверка прификса
{
for (int i = 0; i < BrightnessSize; i++)
{
for (;(Serial.available()==0)&&(blank<=100000);blank++);
if Serial.available()
{
Brightness[i] = Serial.read(); // прочитать данные о цветах из порта в массив
blank=0;
}
}
}
} else {
if(blank>100000) { blank=0; for (byte i = 0; i < BrightnessSize; i++) Brightness[i] = 15;}
blank++;
}
}
Не поленился и переписал с нуля главный цикл, так получается проще, хоть и выглядит страшнее. Принцип простой - есть символ - сразу читаем. Если i==BrightnessSize, то означает, что ждем 255-й символ. Иначе - присваиваем в Brightness[i]
Код:
uint8_t i;
uint16_t blank;
setup()
{
...
i=BrightnessSize;
blank=0;
}
loop()
{
if (Serial.available())
{
uint8_t b=(Serial.read();
if (i=BrightnessSize)
{
if (b == 255)
i=0;
else
blank++;
}
else
{
Brightness[i]=b;
blank=0;
i++;
}
}
else
{
_delay_us(200);
if (blank<MaxBlank)
blank++;
else
{
for (uint8_t j = 0; j < BrightnessSize; j++)
Brightness[j] = 15;
blank=MaxBlank;
}
}
}
понял. уже нашел даташит по "шифту". на мое кол-во диодов ключи не нужны, но... 74hc595 комутирует 5 В, следовательно подключить обычную РГБ ленту не получится из этого всего следует что нада ставить еще ULN2003 к каждому шифту...
будет ли в таком случае коректно работать ШИМ?
uln - это обычная сборка из двух транзисторов. Я не вижу причин, чтобы сборка работала медленно.
SBorovkov, попробовал твой переписанный заново код, что то он у меня вообще светодиоды не загораются. а измененный loop все по прежднему не горят 3 светодиода которые сидят на Q2
взял 2 mega8 прошил обе кодом chip'а с первой страницы(немного подправив названия таймеров). соединил у обоих мег8 ногу RX вместе и чудо две меги заработали паралельно :) думаю теперь подправить код чтоб первая мега ловила первые 12 каналов а вторая с 13 по 24 канал. Как вам вообще такой вариант увеличения каналов ?
Нормальный вариант, так как порт работает только на прием данных и никаких конфликтов не создается
Еще можно на кардуино добавить 6 каналов вместо аналоговых входов