Что-то я застрял с i2c..

За выходные сделал 2-ю плату, почитал про i2c для связи между контроллерами, пока почти ничего не понял, а «вкуривать» – не шло

Когда паял плату, соорудил себе приспособу для зажима платы: у меня есть тиски небольшие, удобно, но не всегда – а с 2-я кусками провода зажал плату, вот так:

DSC00719

DSC00720

Собственно из картинки все понятно. Нереально удобно; ну да, опереться сильно на плату нельзя конечно рукой, когда придерживаешь детальку, но нечего наваливаться :)

2-я половина..

Вчера приехал домой с распечатанной платой и кучкой деталей и выяснил, что у меня закончился текстолит (неудивительно, учитывая, что я 2 готовые протравленные и посверленные (!) платы выкинул из-за кривых рук)

Вторую плату «передумал»: я уже рисовал в уме поезд из контроллеров, 2 и дальше платки должны были содержать тини2313; так вот и подумал – а зачем изобретать, если можно взять сделать еще одну такую-же плату, как та, что уже успешно мигает на мониторе, только не подключать ее к сом-порту (соотв. выкинув эту часть из прошивки; один из аргументов за эту идею – 3 штуки мег16, которые у меня в запасах)

Теперь получается, что там 9 источников света, тут 9 == 18, + удвоить светодиоды по углам – и 22: как раз столько, сколько у меня их было куплено (2 на тесты и 20 на конструкцию). Распределю немного по другому по периметру и все!

Итак, вторая плата – точная копия первой, только разьемы для светодиодов слегка сместились и добавилась микросхема мах232 с обвязкой (потому что подключать буду таки к сом-порту – если он там есть, то я за него заплатил, а значит надо его использовать, иначе – неэкономно :) )

Идея следующая: нахожу планку с усб-разьемами, которой выводятся наружу из компьютера усб-порты, которые на «маме»; питание к этой планке подвожу с молексного разьема внутри компа (заодно решая проблему с током: 22 * 3 * 0.02 = 1.3 А), к средним контактам усб-разьема подключаю Rx/Tx с сом-порта на «маме»

Т.е. на компьютере – с виду обычный усб-разьем (надо его пометить как-то, чтобы не сунуть, чего не стоит совать); на моей плате тоже обычный усб-разьем, от которого идет питание на плату и на подключенную к ней вторую плату, данные идут на мах232 и дальше – на вторую плату; т.е. конструктивно вроде все получается неплохо, мне так кажется по крайней мере :)

Сегодня хорошо бы успеть плату сделать, потом – читать про i2c/twi и что-то пробовать..

Картинка..

Вчера хватило времени на допаивание всего на плату (разьемы закончились), сделать 4 шлейфа со светодиодами, залить тестовую прошивку, проверить, что все зажигается, выяснить, что используемый блок питания (старая зарядка от моторолы, написано 5 В 350 мА) выдает 6 вольт, из-за чего светодиоды немного греются, и пойти смотреть Бонда, Джеймса Бонда..

Но работает :)

В торчащие книзу разьемы (там их 2, 2-й 2-хпиновый пока не распаян) будет подключаться плата с остатком светодиодов, питание + uart + i2c; на нижней плате по идее кроме контроллера для светодиодов можно притулить и связь с компом (к сом или usb порту на max232 bли ft232 соотв.) и источник питания, раз такая байда с моим блоком питания сейчас.. Все не дойдут руки – если в htpc моем есть на «маме» колодка сом-порта, то с большой вероятностью мне даже не захочется с усб связываться

Тадам!

:)

“.. И снова пошел старик к самому синему морю.. И забросил невод..”

А, не – и снова пошел я вчера к принтеру, и проверил тщательно лично все настройки, и распечатал на страничке из “Популярной механики” свою плату, потом померял листиком в клетку расстояние между 10 ножками микросхемы, и вроде все правильно, и дома переутюжил картинку на плату, вытравил плату в свежекупленном хлорном железе (зараза, что-то слабо оно травило), и влезла панелька “как там и была”, и возрадовался я, и возопил “Ура!”

Ага, примерно так вчера все и происходило; опробовал новый паяльник, распаял почти все, помыл с мылом и положил сушиться – сегодня (если все будет хорошо) допаяю isp-разьем и буду потихоньку програмить

Озадачился на выходных, что моего софтового шима не хватит для управления таким количеством лампочек (примерная прикидка показала, что в прерывании почти все время процессора выюзается, а еще ж надо обмен с компом и другими контроллерами за счет чего-то делать.. Повыдумывал разное – сначала перешел на Counter1 – он же 16-битный, можно больше периоды срабатывания сделать – но методом научного тыка определилось, что больше 50 us начинается хорошо видимое глазом мерцание

При 50 us уже времени вроде остается, но дополнительно научный тык показал, что можно обойтись не 256, а всего 64 уровнями яркости, ставил эксперименты на своей “лампе”

План действий дальше:

  • “причесать” код
  • прицепить все излучатели
  • добавить процедуру self-диагностики при старте
  • дальше – обмен с хостом по rs232

Щастье было так возможно..

Это мне наказание за что-то, не помню за что..

«Перевел» плату, вытравил, высверлил, снава начал панельку прилаживать и снова эпик фейл: картинка распечаталась не 1-в-1, х.з. что там за настройки принтера были, но все меньше. Так что снова плата в мусор, а выходные – без пользы.

С горя «прибарахлился» – купил хлорного железа, все потратилось на последнюю неудачу; наконец купил подставку для паяльника нормальную (спиралька такая, в которую паяльник суется; может в процессе и окажется, что не-нормальная, но все лучше, чем плоскогубцы, на которые я обычно паяльник ложил.. но пока  вроде удобно; еще и губка, жало вытирать), и паяльник купил (с 8-го класса у меня был паяльник маломощный, 12-вольтовый с блоком питания на 2 варианта мощности.. уже жало почти догорело, оно хоть и сменное там, только менять нечем, да и сам паяльник не фонтан, ручка раскалялась сильно, температура не регулируется).. Паяльник в регулировкой температуры прямо на ручке, сменное жало, типа с покрытием, но скорее всего фейковое там покрытие, 100 грн ($13) всего, чуть получше – уже все $50, я наступил себе на горло – столько лет пользовался вон чем и ничего, паял, так что обойдусь

Жалко – паять пока нечего..

Epic fail..

Последние пару вечеров глажу, отмачиваю, лужу, паяю, в основном микроплатки со светодиодами; вчера случился эпик фейл с большой платой, которая будет обслуживать 9 источников света: накатал, отмочил бумагу, перенесся рисунок просто идеально; вытравил, насверлил дырок, начал «примеряться» и только тут увидел, что что-то не так

Забыл отзеркалить плату перед печатью, соотв. она получилась неправильно.. фуцк, что тут еще сказать..

Сегодня повторю процесс, воспользовался случаем чтобы улучшить кое-что на плате

Схема пока такая:

примерная схема для отладки

примерная схема для отладки

плата

плата такая пока получается

Раз плату переделывать – так добавил пинов, чтобы подпаивать jtag да программатор

Схема рисовалась в угоду плате, поэтому светодиоды подключаются черти-как, надеюсь, что проблем с этим не будет. Соорудил изящную (для моего знания си) конструкцию: в hardware.h (в этом файле собрано все, что касается конкретной железяки) описываю подключение примерно так:

#define L1_R PORTB, 2
#define L1_G PORTB, 1
#define L1_B PORTB, 0

#define L2_R PORTB, 5
#define L2_G PORTB, 4
#define L2_B PORTB, 3

что, кстати, уже не соотвествует реалиям – микроплатки для светодиодов то у меня тоже «зеркальные», это не мешает им светится, но R и B каналы по идее попутаны; потом придумал макрос

#define set(x,p)     ((x)?(sbi(p)):(cbi(p)))

чтобы в прерывании, где программный ШИМ зажигает «лампочки» просто написать:

ISR(TIMER0_OVF_vect)
{
 u08 * value;
 value = &data[0]; // 'то начало массива, где хранятся rgb-значения

 set((*value++) > counter, L1_R);
 set((*value++) > counter, L1_G);
 set((*value++) > counter, L1_B);
 set((*value++) > counter, L2_R);
 set((*value++) > counter, L2_B);
 set((*value++) > counter, L2_G);
 set((*value++) > counter, L3_R);
 ...

Т.е. в зависимости от того, пора включить или выключить светодиод будет устанавливаться или сниматься пин на порту соответствующем; плюс вроде в том, что если поменяется «распиновка» (вот как у меня случилось), так я просто в define поменяю цифирки; второй плюс (вроде.. мне просто лень сделать по другому и сравнить результат) – установка/снятие бита делается одной ассемблерной командой, так что это вроде должно быть ненапряжно:

 u08 * value;
 value = &data[0];

 set((*value++) > counter, L1_R);
  de:    80 91 60 00     lds    r24, 0x0060
  e2:    90 91 8a 00     lds    r25, 0x008A
  e6:    98 17           cp    r25, r24
  e8:    10 f4           brcc    .+4          ; 0xee <__vector_9+0x1e>
  ea:    c2 9a           sbi    0x18, 2    ; 24
  ec:    01 c0           rjmp    .+2          ; 0xf0 <__vector_9+0x20>
  ee:    c2 98           cbi    0x18, 2    ; 24
  f0:    88 b3           in    r24, 0x18    ; 24
 set((*value++) > counter, L1_G);
  f2:    80 91 61 00     lds    r24, 0x0061
  f6:    98 17           cp    r25, r24
  f8:    10 f4           brcc    .+4          ; 0xfe <__vector_9+0x2e>
  fa:    c1 9a           sbi    0x18, 1    ; 24
  fc:    01 c0           rjmp    .+2          ; 0x100 <__vector_9+0x30>
  fe:    c1 98           cbi    0x18, 1    ; 24
 100:    88 b3           in    r24, 0x18    ; 24

Продолжение марлезонского балета..

Borderlands прошел, светодиоды приехали, больше вроде ничего не мешает (ну, Splinter Cell разве что еще.. зараза.. прошел)

Игрался все это время с мелкими проектиками, все в основном в протеусе, и все в основном бился с ним, разбирался, как работает :)

Но надо чухаться, а чухается лучше всего, когда завидно – для «завидования» себе вот выбрал видео:

Читать запись полностью »

Мысли..

Начинаю думать, как все хозяйство будет за телевизором крепится :(

Прихожу к мысли, что поск. светодиодов много, то контроллер ведь столько тока не выдаст в пике (даже если переиграть все, и вместо кучи контроллеров использовать регистры, или как оно там называется) – значит на каждый канал надо по транзисторному ключу

Наверное отдельный диод будет на малюсенькой платке, со своими резисторами/транзисторами; к телевизору можно будет крепить например двусторонним скотчем в удобных местах, между собой платки/контроллер соединять плоским кабелем многожильным

Если окажется, что света будет мало, то можно платки сделать длинными, на 2 светодиода, параллельно включенных (т.е. количество зон для вычисления не меняется, просто вместо одной «лампочки» для зоны будет две)

Как-то так..

Ход работ..

Поключил к макетной плате программатор, подключил преобразователь уровней на аналоге max232, схема «обычная», типа такой:

только диоды конечно необязательны

Первым делом надо проверить работу собственно преобразователя – для этого надо замкнуть контакты, которые должны подключаться к контроллеру (на этой схеме – ножки 10 и 12), открыть терминальную программу (в w7 и кажется в висте в комплекте больше нет HiperTerminal-а, но можно скачать например здесь), настроить параметры порта, открыть порт и попечатать что-нибудь в терминал – в ответ должны тут же прийти такие же символы – значит преобразователь работает, иначе надо смотреть, где-то что-то напартачено. Обязательно ж при этой проверке поджно быть подключено питание к преобразователю!

Выбор железа, мысли про протокол..

Думаю над протоколом, а его не придумаешь, пока не продумаешь железо и связь между частями всей конструкции

Видится все примерно так: у меня есть ATtiny2313, он недорогой, но у него хватает ног/мозгов и сил делать практически все, что нужно для моего проекта: связываться с компом (uart), связываться с другим контроллером (usi), зажигать с заданной яркостью светодиоды; со светодиодами я игрался со встроенным генератором 8 МГц, хотя вчера для опытов с uart я поставил внешний кварц на 11 с чем-то МГц

Конструкция будет состоять из нескольких (одинаковых) контроллеров, из которых один будет главнее – подключаться к компу, а остальные  будут подключаться к нему последовательно

У основного контроллера вычитаем ноги: PA0, PA1 – используются для подключения кварца; PD0, PD1 – связь c сом-портом компьютера (или с ft232rt с usb портом); PB5, PB6, PB7 – связь с другими контроллерами по two/tree wire interface – остаются PD2-PD6, PB0-PB4 (еще PB6 если использовать two wire), т.е. всего 10 (11) выводов/каналов цвета или 3 полных источника цвета

У вспомогательных контроллеров – 12 выводов или 4 источника; всего у меня запланировано 14 светодиодов по периметру равномерно -> нужно 3 * 4 + 1 * 3 контроллера

Правда есть вариант сократить количество – у меня болтается с давних времен 3 меги16, одна в jtag, а две – для опытов; т.е. можно взять мегу для основного контроллера, в бенефитах – много ног + отладка в устройстве, если правильно считаю, то доступно будет PA0-PA7 + PB0-PB7 + PC6-PC7 + PD2-PD7 = 22 вывода -> 7 светодиодов сразу (это с учетом того, что jtag занимает 4 ножки); и памяти у него побольше, что с моим умением может оказаться аргументом..

Так что пока играюсь с макеткой с тини, а на вторую макетку вставлю мегу – как только прошью jtag, и с этой связкой буду разбираться с связью между контроллерами

С такими исходными можно думать про протокол; в любом случае (используется для главного контроллера тини или мега) понятно, что главный контроллер не такой как все остальные. Для подсветки всего экрана надо определить цвет в 14 точках экрана (накрыв экран сеткой 5 * 4) и передав в контроллер 42 значения компонентов цвета – или взяв цвет в 20 точках при другом разбиении и другом количестве контроллеров, и передав 60 значений компонентов цвета

В любом случае мастер (основной контроллер) получает пакет из компонент цвета, грубо говоря оставляет себе х * 3 значений (х – количество источников цвета, которое он поддерживает), а остальные значения передает дальше по цепочке

Следующий (рабочий) контроллер получает пакет, берет х * 3 значения из него (где опять же х – это количество источников цвета, которое он поддерживает), а остаток передает дальше

Но это я еще не изучал, если связь организована по принципу мастер-подчиненный, то контроллер может общаться только с мастером – и тогда механизм должен быть другим..