Делаю так что бы горели одни красные светодиоды, но вместе с красными горят и зеленые, и мерцают синие. задаю что б светили зеленые, но вместе с зелеными мерцают синие и еле заметно горят красные. и это при добавлении 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 каналов вместо аналоговых входов
TIMSK &= ~(1<<TOIE2)
TCCR2 &= ~((1<<WGM21) | (1<<WGM20))
"TCCR2B &= ~(1<<WGM22))" эту строчку удалил не нашел описание в книжки :)
ASSR &= ~(1<<AS2);
tcnt2 = 252; // 16000000/31000/64=8 tcnt2=256-8=248.
TIMSK |= (1<<TOIE2)
Получилось написать прошивку для tiny2313 на асм. 12 каналов правда кварц хитрый нужен на 7.3728 иначе uart работает нестабильно. а так все работает на ура тока если яркость на 0 выставить в програме от chip'a то глючит.
думаю штуки 4 параллельно законектить и будет 48 каналов.
исходник... мож кому пригодится
PHP код:
.include "tn2313def.inc"
.def Temp=R16
.def OutPB=R17
.def OutPD=R18
.def StPref=R31
.dseg
Status : .byte 12
onoff : .byte 1
S : .byte 1
UUU : .byte 1
Schet : .byte 1
Br : .byte 12
.cseg
.org 0
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM_CAPT1 ; Timer1 Capture Handler
rjmp TIM_COMP1 ; Timer1 Compare Handler
rjmp TIM_OVF1 ; Timer1 Overflow Handler
rjmp TIM_OVF0 ; Timer0 Overflow Handler
rjmp UART_RXC ; UART RX Complete Handler
rjmp UART_DRE ; UDR Empty Handler
rjmp UART_TXC ; UART TX Complete Handler
rjmp ANA_C ; Analog Comparator Handler
EXT_INT0 : reti
EXT_INT1 : reti
TIM_CAPT1 : reti
;TIM_OVF0 : reti
TIM_OVF1 : reti
;UART_RXC : reti
UART_DRE : reti
UART_TXC : reti
ANA_C : reti
;TIM_COMP1 : reti
reset:
ldi Temp,RamEnd ;Чтобы вызывать Функции
out SPL,Temp ;
ldi temp,0b01000010 ;Выбор Timer1 Compare Handler
out TIMSK,temp ;и переполнение тамера 0
ldi temp,0b00000010 ;Делитель /8
out TCCR1B,temp ;
ldi temp,0b00000101
out TCCR0,temp
ldi temp,0x0 ;Установка таймера
out OCR1AH,temp ;
ldi temp,0x23 ;
out OCR1AL,temp ;
ldi temp,(1<<RXEN)|(1<<RXCIE) ; включить приемник | разрешить прерывание
out ucr,temp ;
ldi temp,3 ; 115200/кварц 7.3728
out ubrr,temp
ldi Temp,0b11111111 ;Порт D на вывод
out ddrd,Temp ;
ldi Temp,0b11111111 ;Порт B на вывод
out ddrb,Temp ;
sei ;Разрешить прерывания
ldi StPref,0
ldi r19,1
ldi r20,1
ldi r21,1
ldi r22,1
ldi r23,1
ldi r24,1
ldi r25,1
ldi r26,1
ldi r27,1
ldi r28,1
ldi r29,1
ldi r30,1
;------------Основная програма---------------;
IndicCycle:
rjmp IndicCycle
TIM_OVF0:
lds temp,s
inc temp
sts S,temp
cpi temp,50
brne Ex33
ldi temp,0
sts s,temp
ldi temp,0
sts br,temp
sts br+1,temp
sts br+2,temp
sts br+3,temp
sts br+4,temp
sts br+5,temp
sts br+6,temp
sts br+7,temp
sts br+8,temp
sts br+9,temp
sts br+10,temp
sts br+11,temp
Ex33:
reti
UART_RXC :
cli
ldi temp,0
out TCNT0,temp
sts s,temp
ldi temp,1
sts onoff,temp
in temp,udr ; в udr приходит байт с компа
sts UUU,temp ;
Cpi temp,255 ;
breq begin ;
rjmp CopyByte ;
Begin:
ldi StPref,1
rjmp Ex
CopyByte:
cpi StPref,1
breq CopyB1
cpi StPref,2
breq CopyB2
cpi StPref,3
breq CopyB3
cpi StPref,4
breq CopyB4
cpi StPref,5
breq CopyB5
cpi StPref,6
breq CopyB6
cpi StPref,7
breq CopyB7
cpi StPref,8
breq CopyB8
cpi StPref,9
breq CopyB9
cpi StPref,10
breq CopyB10
cpi StPref,11
breq CopyB11
cpi StPref,12
breq CopyB12
cpi StPref,13
breq Ex
rjmp Ex
CopyB1:
lds temp,UUU
sts Br,temp
rjmp Ex1
CopyB2:
lds temp,UUU
sts Br+1,temp
rjmp Ex1
CopyB3:
lds temp,UUU
sts Br+2,temp
rjmp Ex1
CopyB4:
lds temp,UUU
sts Br+3,temp
rjmp Ex1
CopyB5:
lds temp,UUU
sts Br+4,temp
rjmp Ex1
CopyB6:
lds temp,UUU
sts Br+5,temp
rjmp Ex1
CopyB7:
lds temp,UUU
sts Br+6,temp
rjmp Ex1
CopyB8:
lds temp,UUU
sts Br+7,temp
rjmp Ex1
CopyB9:
lds temp,UUU
sts Br+8,temp
rjmp Ex1
CopyB10:
lds temp,UUU
sts Br+9,temp
rjmp Ex1
CopyB11:
lds temp,UUU
sts Br+10,temp
rjmp Ex1
CopyB12:
lds temp,UUU
sts Br+11,temp
rjmp Ex1
ex1:
inc StPref
ex:
sei
reti
;-----Обработчик прерывание таймера----------;
TIM_COMP1 :
ldi temp,0
out TCNT1H,temp
out TCNT1L,temp
rcall Pwm
reti
;---------------------PWM--------------------;
PWM:
lds temp,Schet
inc temp
sts Schet,temp
cpi temp,254
breq init
rjmp pwm1
Init:
lds r19,br
lds r20,br+1
lds r21,br+2
lds r22,br+3
lds r23,br+4
lds r24,br+5
lds r25,br+6
lds r26,br+7
lds r27,br+8
lds r28,br+9
lds r29,br+10
lds r30,br+11
ldi temp,0
sts Schet,temp
ldi temp,1 ;
sts status,temp ;
sts status+1,temp ;
sts status+2,temp ;
sts status+3,temp ;
sts status+4,temp ;
sts status+5,temp ;
sts status+6,temp ;
sts status+7,temp ;
sts status+8,temp ;
sts status+9,temp ;
sts status+10,temp ;
sts status+11,temp ;
Pwm1:
;-------------KANAL1---------------;
lds temp,status
cpi temp,0
breq kanal2
sbr OutPB,0b10000000
lds temp,Schet
CPSE temp,r19
rjmp kanal2
cbr OutPB,0b10000000
ldi temp,0
sts status,temp
;-------------KANAL2---------------;
kanal2:
lds temp,status+1
cpi temp,0
breq kanal3
sbr OutPB,0b01000000
lds temp,Schet
CPSE temp,r20
rjmp kanal3
cbr OutPB,0b01000000
ldi temp,0
sts status+1,temp
;-------------KANAL3---------------;
kanal3:
lds temp,status+2
cpi temp,0
breq kanal4
sbr OutPB,0b00100000
lds temp,Schet
CPSE temp,r21
rjmp kanal4
cbr OutPB,0b00100000
ldi temp,0
sts status+2,temp
;-------------KANAL4---------------;
kanal4:
lds temp,status+3
cpi temp,0
breq kanal5
sbr OutPB,0b00010000
lds temp,Schet
CPSE temp,r22
rjmp kanal5
cbr OutPB,0b00010000
ldi temp,0
sts status+3,temp
;-------------KANAL5---------------;
kanal5:
lds temp,status+4
cpi temp,0
breq kanal6
sbr OutPB,0b00001000
lds temp,Schet
CPSE temp,r23
rjmp kanal6
cbr OutPB,0b00001000
ldi temp,0
sts status+4,temp
;-------------KANAL6---------------;
kanal6:
lds temp,status+5
cpi temp,0
breq kanal7
sbr OutPB,0b00000100
lds temp,Schet
CPSE temp,r24
rjmp kanal7
cbr OutPB,0b00000100
ldi temp,0
sts status+5,temp
;-------------KANAL7---------------;
kanal7:
lds temp,status+6
cpi temp,0
breq Kanal8
sbr OutPB,0b00000010
lds temp,Schet
CPSE temp,r25
rjmp kanal8
cbr OutPB,0b00000010
ldi temp,0
sts status+6,temp
;-------------KANAL8---------------;
kanal8:
lds temp,status+7
cpi temp,0
breq kanal9
sbr OutPB,0b00000001
lds temp,Schet
CPSE temp,r26
rjmp kanal9
cbr OutPB,0b00000001
ldi temp,0
sts status+7,temp
kanal9:
lds temp,status+8
cpi temp,0
breq kanal10
sbr OutPD,0b01000000
lds temp,Schet
CPSE temp,r27
rjmp kanal10
cbr OutPD,0b01000000
ldi temp,0
sts status+8,temp
kanal10:
lds temp,status+9
cpi temp,0
breq kanal11
sbr OutPD,0b00100000
lds temp,Schet
CPSE temp,r28
rjmp kanal11
cbr OutPD,0b00100000
ldi temp,0
sts status+9,temp
kanal11:
lds temp,status+10
cpi temp,0
breq kanal12
sbr OutPD,0b00010000
lds temp,Schet
CPSE temp,r29
rjmp kanal12
cbr OutPD,0b00010000
ldi temp,0
sts status+10,temp
kanal12:
lds temp,status+11
cpi temp,0
breq OutPo
sbr OutPD,0b00001000
lds temp,Schet
CPSE temp,r30
rjmp OutPo
cbr OutPD,0b00001000
ldi temp,0
sts status+11,temp
;---------Вывод в порт-------------;
OutPo:
Out Portb,OutPB
Out Portd,OutPD
ret
ого!.. а тема смотрю жива и развивается... давно меня не было)
кстати, чтоб мне все не перечитывать, научили работать в медиацентре в фулскрине?
В медиацентре XBMC, мне он больше нравится чем виндовый
Вложение 10543
всем спасибо за консультации. в субботу буду пробовать, как раз шифты и сборки приедут. попробую - отпишусь
Для него есть куча плагинов и плагин webTV тоже есть
Нашел ошибку в скетче для Shift!
оригинальный текст
for (uint8_t bt=0; bt<8; bt++)
{
if(Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
i++;
byte_shift = byte_shift<<1;
}
Правильный текст.
for (uint8_t bt=0; bt<8; bt++)
{
byte_shift = byte_shift<<1;
if(Brightness[i]>PWM_Counter_v) byte_shift|= 1; // тут соответственно использщуем nbit
i++;
}
Изменено положение строки, сдвигающей byte_shift.
Из-за этого какой-то светодиод на каждом сдвиговом регистре не должен работать.
Здравствуйте уважаемые знатоки!
Пытаюсь собрать ambilight для 4 зон по описанной инструкции в ветке форума. Начал с самого маленького, только для одной зоны. Прошил Carduino Nano Duo со скетчем из "шапки" сообщений, запаял все на печатной плате с светодиодной лентой. Но ничего не получилось: загорается при подключении питания на доли секунды зеленый свет и медленно потухает. Подскажите, пожалуйста, в чем может быть проблема? Неправильно залился скетч? Транзисторы или резисторы по маркировке не подходят?
v.1.0.4
+ подсчет текущей частоты обновления
+ задержка для перезагрузки NANO (Linux)
ps по моим тестам:
- тема Aero в Win7 в 2 раза уменьшает частоту обновления
- количество каналов практически не сказывается на частоте обновления
v.1.0.5
fix: теперь в Windows работает выбор монитора
зы отпишитесь кто может проверить эту функцию
Подтверждаю, работает :), но курсор мышки по прежнему мерцает. Если включен только один монитор то мерцания не наблюдается.
Если можно то добавьте в программу возможность вывода окна настроек на передний план и возможность включения координатной сетки на предпросмотре.
Так же было бы не лишним изменения яркости по зонам, например добавить столбик в процентах от общей яркости во вкладке "зона")
На все 42 канала? Мне кажется что это как раз таки лишнее.Цитата:
Так же было бы не лишним изменения яркости по зонам
Eraser, думаю неплохо было б добавить, шаблоны для зон, допустим смотришь фильм используется одна заготовка, а слушаешь музыку и используешь в качестве светомузыки выбираешь другую заготовку.
Телевизор висит на стене под углом. В результате низ пересвечен. Теперь, спасибо Eraser нижние каналы можно регулировать. Да и по бокам от телевизора вполне может что то находитсо что будет как то иначе отражать свет. В общем функция однозначно полезная. :p
ЗЫ Исчо б курсор мышки не моргал вообще б щастье было :o
Теперь бы вот найти где нить схему на 42 канала...
Я почти сделал плату на 42 канала. В процессе тестирования.
SBorovkov 42 канала круто! ждемс платы!
на выходных буду собирать 24 канала на макетке!
мож выложите платку - бум тестить все вместе!
Микрухи - 74hc595 и uln2004, По шесть штук каждых. На плате - SO корпуса (1.27 мм между выводами). Плата двухсторонняя, но можно сделать и одностороннюю с перемычками (надо будет маленько перерисовать тогда). Скетч отлаживаю. Скажу так: ошибки в опубликованном варианте есть.
После сборки платы:
1. Дорабатываем ленту (режем на куски, паяем к ней разъемы)
2. Берем длинный шлейф 34 жилы (длиной высота+ширина), одеваем на него разъемы в нужных местах (их может быть от 5 и больше). Можно одеть сразу две ленты в один разъем, в разные стороны, как на фотографии. В каждый разъем ленты вставляются со сдвигом - в первый 1..4 контакты, во второй - 5..8, в третий - 9-12, четвертый - 13-16.
3. Повторяем пункт 2 для второго шлейфа.
На каждом из двух разъемов платы крепится по шлейфу, а на шлейфе - по 7 лент - итого 42 канала.
ну пусть то же самый AIMP, у него есть как все знают визуализация разворачивающаяся на весь экран, что позволит зажигать светодиоды под музыку. А шаблон позволить быстро выбирать нужную схему расположения зон. и будет происходить переключение так сказать между режимом просмотр фильма и светомузыки.
и если не сложно, то добавь кнопку "Поверх всех окон" а то как то и не удобно когда оно всегда сверху.
Я достиг зияющих высот! :-)
Во-первых у меня таки заработала полноценно плата. К сожалению, на ней были ошибки и из-за этого я сделал изменение - пришлось припаять проводочек, который виден на фотке платы и еще в двух местах чуть изменить разводку. Ошибка была дуракцая - выход в нижний разъем шел не с выводов q1..q7 микрух uln2004, а с CD+ и q1..q6 (ошибся на один вывод). Рисунок платы я выложил сразу правленный, но формально - я его не пробовал. У меня абсолютно такая же верхняя часть платы, а на нижней небольшие изменения.
Выявился и недостаток. По какой-то причине, через один из выводов каждой uln2004 даже в закрытом состоянии течет небольшой ток. Поэтому шесть линеек немного светятся. Красные и синие - вообще еле заметно, зеленая - сильнее. Яркость свечения на глаз примерно соответствует яркости 1 из 255.
По поводу программной части:
Мне удалось достигнуть выполнения таймера примерно за 370 тактов при работе на 42 канала. Это дает возможность обеспечить частоту мигания около 150 герц.
Если же откомпилировать проект с опцией компилятора, расчитанной на максимальное быстродействие, то получим около 315 тактов на выполнение прерывания, это дает возможность выставить частоту 180 герц. Это даже быстрее, чем нынешний вариант на 24 канала.
Ниже привожу исходник для avr atudio, который у меня работает. Если захотите взять отсюда исходники на 24 канала, потребуется из этих исходников взять:
#define TCNT2_Const 256-50
далее инициализация таймера
TCCR2B |= (1<<CS21); //установка предделителя 8
далее - основной цикл for(;;) можете перенести как есть в setup()
до loop() в этом случае дело не дойтет, и ладно. Там надо будет поменять две функции работы с serial (у меня uart... ).
Таймер - берете как есть и делаете изменение:
1. Изменяете цикл
for (j=6;j>0;j--)
на
for (j=3;j>0;j--)
2. Добавляете перед строками
SPDR = byte_shift; //отправляем в шину SPI
}
PWM_Counter++;
еще две строки
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
Тут дело в том, что у меня на плате на каждом шифте используется только 7 выводов из 8. Причем используются не 0..6 биты, а 1..7 (см. схему чуть выше). Поэтому я и формирую только 7 битов, а затем подвигаю эти биты на 1 влево, чтобы они попали на 1..7. Вам же в 0 бит после этого надо будет записать данные - этими двумя добавляемыми строками.
ps. Я с этой темой почти наигрался, дальше прыгать вроде некуда. На телек я это вешать не буду. Поэтому думаю, что через короткое время буду готов продать плату вместе с 5-ю метрами светодиодной ленты (частично порезанной на 14 20-см кусков). Для того, чтобы из нее сделать эмбилайт, вам потребуется купить шлейф 34 жилы с шагом 1.27мм (длиной в периметр телевизора) и десяток или чуть больше разъемов на него. Ну и если решите использовать не 20-см куски, то еще и надо чуть-чуть уметь паять.Код:#include <iopins.h>
#include <pinlist.h>
#include <latch.h>
#include "uart.h"
using namespace IO;
#include <avr/version.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define BrightnessSize 42
#define TCNT2_Const 256-45 //256-9
#define MaxBlank 65000
uint8_t volatile PWM_Counter=0;
uint8_t Brightness[BrightnessSize];
typedef Pb2 SSPin;
typedef Pd0 SerialIn_Pin;
typedef Pd1 SerialOut_Pin;
void Timer(void);
int main (void)
{
uint8_t i;
i=1;
DDRB=0;;
Pb5::SetDirWrite();
Pb3::SetDirWrite();
Pd7::SetDirWrite();
SSPin::SetDirWrite();
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;
}
uartInit();
uartSetBaudRate(115200);
SerialIn_Pin::SetDirRead();
SerialOut_Pin::SetDirWrite();
TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2
TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
TCCR2B |= (1<<CS21); //установка предделителя 64
ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
TCNT2 = TCNT2_Const; // 16000000/256/100/64=8 tcnt2=256-8=248.
TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2.
sei();
uint16_t blank=0;
uint8_t TimerCurrPWM=0;
for(;;)
{
if (!uartReceiveBufferIsEmpty())
{
uint8_t b=uartGetByte();
if (i==BrightnessSize)
{
if (b == 255)
{
i=0;
blank=0;
}
else
blank++;
}
else
{
Brightness[i]=b;
blank=0;
i++;
}
}
else
{
if (blank<MaxBlank)
{
if (TimerCurrPWM!=PWM_Counter)
{
blank++;
TimerCurrPWM=PWM_Counter;
}
}
else
{
for (uint8_t j = 0; j < BrightnessSize; j++)
Brightness[j] = 15;
blank=MaxBlank;
}
}
}
}
//void Timer(void)
SIGNAL(TIMER2_OVF_vect)
{
Pd7::Set();
Pd7::Set();
Pd7::Clear();; //формируем положительный импульс защелки
uint8_t PWM_Counter_v=PWM_Counter; // поскольку PWM_Counter объявлена как valotile, обращение к ней - всегда обращение в память. Поэтому создаем локальную копию, она будет храниться в регистре.
TCNT2 = TCNT2_Const;
uint8_t byte_shift;
uint8_t * CBright;
CBright = (uint8_t *)&Brightness[0];
uint8_t j=0;
for (j=6;j>0;j--)
{
byte_shift = 0;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
if(*CBright>PWM_Counter_v) byte_shift|= 1;
CBright++;
byte_shift = byte_shift<<1;
SPDR = byte_shift; //отправляем в шину SPI
}
PWM_Counter++;
}
Ну и, естественно, потребуется Carduino ;)
UPD. Приложил схему и плату в Eagle.
Как же это победить...Цитата:
Выявился и недостаток. По какой-то причине, через один из выводов каждой uln2004 даже в закрытом состоянии течет небольшой ток. Поэтому шесть линеек немного светятся. Красные и синие - вообще еле заметно, зеленая - сильнее. Яркость свечения на глаз примерно соответствует яркости 1 из 255.
Есть подозрение, что достаточно покупать uln2004 не на митинском рынке, а в магазине. Но учитывая, что сетодиоды реально светятся примерно с яркостью 1 из 255, я на это забил. Зеленые светятся заметно - видна зеленая точка внутри и освещена внутренность светодиода, а синие и красные - видны как еле-светящиеся точки внутри светодиодов.
Сфотографировать эффект, чтобы передать как он виден, мне не удалось.
UPD.
Выключил свет в комнате, зеленые светодиоды действительно светятся в какой-то степени. Свет от них в почти полной темноте позволяет увидеть наличие светлой стены сантиметрах в 50. При расстоянии 15 см стена заметно освещается. Повторюсь, в почти полной темноте, когда руки не видно без этих светодиодов.
Померял ток, текущий через линейку - 80 микроампер. Для этих светодиодов рабочий ток - 30 мА. То есть ток почти в 370 раз слабее рабочего. Ток короткого замыкания uln2004 в таком режиме - 150мкА. То есть такие эффекты спокойно можно давить резистором с номиналом около 20кОм, включенным на +12В.
И все же у меня есть большое подозрение, что дело в левых uln-ках. При внимательном рассмотрении выяснилось, что на разных микрухах разные выводы так "шалят".
Чтото я не нашел информации по твоим транзисторам