Что-то я застрял с 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 и что-то пробовать..

Видео для привлечения внимания..

Диодам не хватает яркости; раньше заметил, что они достаточно ощутимо грелись, выяснилось, что блок питания выдавал 6 вольт (а резисторы то расчитаны на 5), добавил крен-ку; теперь рылся в коде, искал ошибку, потом додумался померять напряжение – а там 4 вольта всего..

6 В было, когда подключал всего пару rgb-светодиодов, а когда 9 штук (да * 3 канала)  – ток большой, а блок питания всего 350 мА обещает, вот напряжение и проседает.. Есть старый АТ-блок питания комповый небольшой, с ним светится веселее, но он неудобный..

Нашел пару очепяток в прошивке, цвета путались.. нашел ошибку в коде управляющей программы, цвета более адекватно определятся стали (и одинаково слева и справа экрана.. а то было – на фаре в фул-скрине с одной стороны цвет синий, с другой – черти что..)

Чувствую много мороки будет с этим определением цвета.. если цвет превалирует на картинке, то и светодиоды подсвечиваются адекватно, но если цвет средний «ни вашим, ни нашим», то светодиод светит «серым», вроде правильно, но визуально некрасиво.. Есть мысль – брать тройку цветов, определять «сильнейший» и усиливать его искусственно.. но надо пробовать. Надо еще развернуть светодиоды назад, когда они в глаза светят – оно не то; но проблема, у меня монитор в углу стоит, соотв. назад светить не на что.. А на телевизор цеплять рано еще – он в другой комнате, а програмить/отлаживать еще много..

Картинка для привлечения внимания..

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

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

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

Картинка..

Вчера хватило времени на допаивание всего на плату (разьемы закончились), сделать 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