РадиоКот :: Светодиодная "сосулька": одна и много
Например TDA7294

РадиоКот >Конкурсы >Поздравь Кота по-человечески 2017! >

Теги статьи: Добавить тег

Светодиодная "сосулька": одна и много

Автор: *Trigger*
Опубликовано 20.09.2017
Создано при помощи КотоРед.
Участник Конкурса "Поздравь Кота по-человечески 2017!"

Предисловие

Последнее время всё чаще перед Новым Годом улицы городов украшают весьма необычными гирляндами: светодиодными сосульками. Такая гирлянда представляет собой несколько прозрачных трубочек, внутри каждой из которых находится плата со светодиодами, расположенными в одну линию. При подаче питания на такую "сосульку" по трубочке спускается световая "капля" через некоторые интервалы времени. Подробнее - на видео (взято из Интернета):

И вот, перед прошлым Новым Годом я решил сделать подобные сосульки. К тому же, у меня давно ждала своего часа сотня белых SMD-светодиодов типоразмера 3528.

Часть первая, базовая. Светодиодная сосулька

Каждая сосулька представляет собой законченное устройство, начинающее отображение "падающих капель" сразу после подачи питания.

Схема сосульки и принцип действия

Схема сосульки приведена ниже:

Для управления светодиодами был выбран микроконтроллер ATtiny2313 по причине его доступности и наличия у него достаточного количества выводов.  Резисторы R4 - R8 - токоограничивающие. R1 и C2 - цепь начального сброса микроконтроллера IC1. Конденсатор C1 - помехоподавляющий. Разъём J1 служит для программирования МК и подачи питания на устройство. Назначение переключателей S1 - S3, а также резисторов R2 и R3 будет описано во второй части статьи.

Светодиоды HL1 - HL20 включены в матрицу 5 x 5 с объединёнными строками и столбцами. Такое включение выбрано для удобства разводки узкой и длинной печатной платы со светодиодами в одном слое: требуется провести всего 5 проводников. При "традиционном" включении в матрицу 5 x 4 требуется 9 проводников, провести которые на узкой плате трудно. Однако, за удобство разводки приходится платить усложнением управления светодиодами.

В один момент времени горит только один светодиод. Для его зажигания на соответствующую строку матрицы подаётся лог. 1 с МК, а на столбец - лог. 0 (на диагонали матрицы светодиодов нет, поэтому строка и столбец различны). Остальные линии при этом находятся в высокоимпедансном состоянии. Таким образом, используется динамическая индикация со скважностью 20. Яркость светодиодов при этом достаточная, но всегда можно уменьшить сопротивление резисторов R4 - R8, если её будет не хватать. Для обеспечения независимой регулировки яркости каждого светодиода применяется 6-битная широтно-импульсная модуляция (ШИМ).

Как известно, человеческий глаз воспринимает яркость нелинейно. Для компенсации этого эффекта используется таблица перекодировки яркости, сопоставляющая каждому числу от 0 до 15 ширину импульса ШИМ (от 0 до 63). Таким образом, яркость любого светодиода может принимать одно из 16 значений.

При подаче питания МК начинает отображать на светодиодах световой эффект "падающая капля". При этом скорость "падения" и пауза между эффектами выбираются при помощи генератора псевдослучайных чисел.

Напряжение питания - 5 В.

Конструкция и детали

Сосулька выполнена на односторонней печатной плате, чертёж которой приведён ниже (файл печатной платы в формате Sprint Layout 6.0 можно скачать в конце статьи):

Микроконтроллер IC1 применён в корпусе SO-20. Светодиоды HL1 - HL20 - SMD типоразмера 3528. Все резисторы и конденсаторы - SMD типоразмера 0805. Разъём J1 - типа IDC-6M.

Ниже - монтажные схемы сосульки.

Верх Низ

 

После сборки и проверки сосульки печатная плата изолируется при помощи прозрачных термоусадочных трубок диаметрами 12,7 мм и 19 мм (до усадки). При этом тонкая трубка надевается на узкую часть платы сосульки до разъёма, а толстая подготавливается следующим образом: в ней проделывается прямоугольное отверстия для разъёма. Размеры отверстия следует подобрать экспериментально. Далее обе трубки усаживаются.

Готовые сосульки (до изоляции) выглядят так:

Программирование МК

Прошивка МК (а также исходники) доступна в конце статьи. Фьюз-биты МК следует установить следующим образом:

"Галочка" означает, что фьюз-бит запрограммирован, т.е. установлен в лог. 0.

Часть вторая, дополнительная. Контроллер светодиодных сосулек

 Для тех, кому одной сосульки мало...

Пришло время наконец рассказать, зачем же нужны упоминавшиеся ранее переключатели и резисторы на схеме сосульки.

А вот зачем. Каждая сосулька может работать как сама по себе, без внешнего управления (такой режим назовём автономным), так и с управлением по шине I2C. Почему выбран именно этот интерфейс? Всё просто: так можно использовать для связи с сосулькой разъём программирования, а работу с интерфейсом реализовать почти полностью на аппаратном уровне, используя модуль USI (Universal Serial Interface). Линия MOSI при этом становится линией SDA, а SCK превращается в SCL.

Протокол управления

Протокол управления - стандартный для I2C устройств.

Для записи в память сосульки используется следующая последовательность действий:

  1. Выдать на шину состояние Start.
  2. Записать на шину адрес сосульки, в которую нужно записать данные (см. далее про адресацию на шине) со сброшенным младшим битом (режим записи).
  3. Получить ACK.
  4. Записать на шину адрес начала записи в память сосульки (см. далее таблицу регистров сосульки).
  5. Получить ACK (при допустимом адресе).
  6. Записать последовательно нужное число байт данных, при этом счётчик адреса автоматически инкрементируется (с зацикливанием при достижении конца памяти).
  7. Выдать на шину состояние Stop.

Для чтения используется такая последовательность:

  1. Выдать на шину состояние Start
  2. Записать на шину адрес сосульки, из которой нужно считать данные (см. далее про адресацию на шине) со сброшенным младшим битом (режим записи).
  3. Получить ACK.
  4. Записать на шину адрес начала записи в память сосульки (см. далее таблицу регистров сосульки).
  5. Получить ACK (при допустимом адресе).
  6. Выдать на шину состояние Repeated Start (повторный старт).
  7. Записать на шину адрес сосульки, из которой нужно считать данные (см. далее про адресацию на шине) с установленным младшим битом (режим чтения).
  8. Считать последовательно нужное число байт данных, подтверждая каждый байт, кроме последнего, отправкой ACK. Последний байт подтверждать не обязательно. Счётчик адреса автоматически инкрементируется (с зацикливанием при достижении конца памяти).
  9. Выдать на шину состояние Stop.

Адрес сосульки на шине состоит из двух частей. Первые 4 бита адреса фиксированы и равны 0xB (0b1011). Следующие 3 бита соответствуют состоянию выводов PD5, PD4, PD3 микроконтроллера сосульки. Последний бит равен 1 при чтении и 0 при записи.

Номер бита 7 6 5 4 3 2 1 0
Значение 1 0 1 1 PD5 PD4 PD3 R/W

Таким образом, полный адрес сосульки на шине задаётся при помощи переключателей S1 - S3. Конструктивно они выполнены в виде близко расположенных контактных площадок на плате сосульки, которые замыкаются припоем. Замкнутый переключатель соответствует лог. 0 в соответствующем разряде адреса.

Также, при обращении по адресу 0x00 (0b00000000) (General Call Address) в обмене данными участвуют все устройства на шине. Это используется, например, для одновременного гашения всех светодиодов всех сосулек или синхронного зажигания первого светодиода.

Ниже приведена карта регистров сосульки:

Адрес Номер бита
7 6 5 4 3 2 1 0
0x00  EXT_CTRL EFFECT_EXEC  AUTO_START  0 0 0 EFF_SPEED  
0x01 Яркость HL2 Яркость HL1
0x02 Яркость HL4 Яркость HL3
0x03 Яркость HL6 Яркость HL5
0x04 Яркость HL8 Яркость HL7
0x05 Яркость HL10 Яркость HL9
0x06 Яркость HL12 Яркость HL11
0x07 Яркость HL14 Яркость HL13
0x08 Яркость HL16 Яркость HL15
0x09 Яркость HL18 Яркость HL17
0x0A Яркость HL20 Яркость HL19

Как видно из таблицы, по адресу 0x00 находится конфигурационный регистр, а остальные регистры задают яркость свечения светодиодов (по 4 бита на светодиод).

Биты конфигурационного регистра имеют следующие функции:

  • Бит 7 - EXT_CTRL (External Control). Если этот бит установлен (1), то яркости светодиодов соответствуют данным в памяти сосульки (регистры 0x01 - 0x0A). Если бит сброшен (0), то яркости определяются эффектом "падающая капля".
  • Бит 6 - EFFECT_EXEC (Effect Execution). Если при чтении этот бит сброшен, в данный момент выполняется эффект. Если он установлен, все светодиоды погашены. Запись лог. 1 в этот бит игнорируется. Если записывается лог. 0, то при сброшенных EXT_CTRL и AUTO_START начинается выполнение эффекта. После завершения выполнения эффекта этот бит автоматически устанавливается. Таким образом, можно выяснить, выполняется ли в данный момент эффект, и, при необходимости, запустить его выполнение.
  • Бит 5 - AUTO_START. При EXT_CTRL = 1 значение этого бита игнорируется. Если же EXT_CTRL = 0, то при AUTO_START = 1 разрешён автоматический запуск эффекта через случайные промежутки времени со случайной скоростью. Сосулька работает так, как при отсутствии внешнего управления по I2C.
  • Биты 4 - 2. Зарезервированные биты. Следует записывать туда 0.
  • Биты 1..0 - EFF_SPEED (Effect Speed). Эти биты определяют скорость эффекта при запуске сбросом бита EFFECT_EXEC (ручном запуске). Соответственно, доступно 4 различных значения скорости (0, 1, 2, 3). Чем больше значение, тем больше скорость.

Бит EFFECT_EXEC инвертирован не случайно. Поскольку выходные каскады устройств I2C выполнены с открытым коллектором, между всеми устройствами реализовано "монтажное И". При чтении некоторого регистра из всех устройств сразу (General Call Address) все подключенные сосульки выдают на шину значение своего регистра. Таким образом, ведущее устройство считывает с шины результат побитового И данного регистра всех сосулек. Благодаря инверсии бита EFFECT_EXEC, можно, считав конфигурационный регистр из всех устройств сразу, узнать, завершено ли выполнение эффекта на всех сосульках. Если хоть одна из них выполняет эффект, считанный бит EFFECT_EXEC будет равен 0.

Схема контроллера сосулек и его принцип действия

Схема контроллера сосулек приведена ниже:

Подключение микроконтроллера IC1 и светодиодного семисегментного индикатора с общим катодом HL1 - стандартное, тут описывать нечего. Две пары выводов МК объединены для использования аппаратного модуля TWI через разъём программирования J1. Цепочки R13VD1R17, R14VD2R18, R15VD3R19, R16VD4R22 служат для защиты входов устройства. R20, R21 - подтягивающие резисторы шины I2C. Для управления устройством используются тактовые кнопки S1 - S3.

Устройство питается от БП с выходным напряжением 5 В.

Конструкция и детали

Контроллер сосулек выполнен на односторонней печатной плате, чертёж которой приведён ниже:

Как обычно, в конце статьи можно скачать файл этой платы в формате Sprint Layout 6.0.

Микроконтроллер IC1 применён в корпусе TQFP-32, транзисторы VT1 - VT4 - в корпусах SOT-23. Все резисторы и конденсаторы, кроме C3, - SMD типоразмера 0805. C3 - электролитический, на напряжение не ниже 16 В. Стабилитроны VD1 - VD4 - маломощные выводные в миниатюрном стеклянном корпусе. Индикатор HL1 - светодиодный четырёхразрядный с общим катодом (зелёного цвета свечения). Кнопки S1 - S3 - тактовые размером 6 x 6 мм и общей высотой 13 мм. Разъём J1 типа IDC-6M.

Ниже приведены монтажные схемы контроллера сосулек:

Верх Низ

Как видно, на печатной плате имеются 4 проволочные перемычки (отмечены синим цветом на монтажной схеме).

Печатная плата размещена в стандартном пластмассовом корпусе размерами 83,5 х 57,5 х 24 мм. Она фиксируется четырьмя шурупами, скрепляющими половинки корпуса. На левой стенке корпуса установлен разъём питания 5,5 x 2,1 мм. В печатной плате сделан вырез, в который входит разъём.

В специальных углублениях на передней, задней и левой стенках корпуса расположены наклейки с поясняющими надписями. Передняя и левая наклейки заламинированы прозрачной плёнкой и приклеены на двусторонний скотч. Две задние наклейки покрыты с двух сторон обычным прозрачным скотчем, после чего приклеены клеем "Момент 1".

Изображения наклеек приведены ниже:

Задние наклейки имеют 2 варианта расцветок. В конце статьи можно скачать векторные изображения в форматах CorelDraw и PDF.

Сосульки подключаются к контроллеру при помощи 6-жильного плоского шлейфа с разъёмами IDC-6F.

Пояснение: резисторы R2 и R3 на схеме сосульки - дополнительные подтягивающие резисторы шины I2C. Их следует установить на плате последней (самой далёкой от контроллера) сосульки в цепи, если часто возникают ошибки обмена данными. Эти резисторы улучшат согласование линий SDA и SCL. Номинал - от 3,3 до 10 кОм. При низких номиналах нужно увеличить сопротивления резисторов R20, R21 в контроллере сосулек, чтобы не допустить перегрузки портов МК.

Программирование МК

В конце статьи доступен для скачивания файл прошивки *.hex, а также там можно скачать исходники (проект CVAVR). Фьюз-биты МК выставляются согласно этой картинке:

"Галочка" - запрограммировано, т.е. лог. 0.

Управление устройством и его функции

Чтобы понять, как управлять контроллером сосулек, а также увидеть доступные световые эффекты (программы), просмотрите видео ниже.

Модификация прошивки МК

Моей фантазии хватило на 20 эффектов (программ). Если Вам этого мало, и у Вас есть идея для новой программы (эффекта), Вы можете самостоятельно добавить её в прошивку МК. Конечно, требуются некоторые навыки программирования на языке C.

Итак, если Вы не боитесь написания программ, приступим.

Сначала нужно установить среду разработки CodeVision AVR 3.12 (можно и более новую версию). Программа платная, но не мне Вам объяснять, где её взять...

После чего загрузите архив с исходниками и распакуйте его куда-нибудь. Далее перейдите в папку "Программа управляющего модуля" и откройте файл *.prj в CVAVR.

Теперь несколько слов о структуре программы МК.

Каждый эффект (программа) разделяется на части, называемые "кадры" (frame) и "шаги" (step). Каждый кадр состоит из какого-то числа шагов. Рассмотрим, например, программу под номером 7 (см. видео). Она представляет собой следующее: все сосульки синхронно заполняются "падающими" сверху горящими светодиодами, а потом все синхронно очищаются сдвигом горящего столбика вниз. В данном случае шагом является перемещение "падающего" светодиода на 1 вниз (при заполнении) и уменьшение длины столбика на 1 при очистке. Кадры - все шаги данного "падающего" светодиода (при заполнении) и весь процесс сдвига столбика при очистке. Таким образом, есть 21 кадр (20 кадров для заполнения и 1 для очистки). Первые 20 кадров состоят из 20, 19, 18, ... , 1 шагов, последний кадр - из 20 шага.

У каждой программы есть такие параметры, как задержка (delay) и скорость (speed). Первая определяет время ожидания между двумя кадрами (после окончания одного кадра и перед началом следующего), а вторая - частоту выполнения шагов (в нашем случае - скорость движения горящего светодиода).

Определены следующие константы и переменные, которые можно (и нужно) использовать при написании нового эффекта:

#define LED_NUM 20                    //Количество светодиодов в сосульке.
#define FULL_ON 0xF                   //Константа полной яркости светодиода.
#define FULL_OFF 0x0                  //Константа для гашения светодиода.
#define MAX_ICICLE_COUNT 8            //Максимальное число сосулек на шине
#define PROGRAM_OFFSET 2              //Сдвиг номера программы (первая программа, кроме PROGRAM_OFF и
                                        //PROGRAM_AUTO_CHANGE). Не меняйте это значение!
#define PROGRAMS (20+PROGRAM_OFFSET)  //Общее количество программ, включая первые две. Здесь нужно менять 
                                        //число "20" на количество программ (не считая PROGRAM_OFF и
                                        //PROGRAM_AUTO_CHANGE)


#define DELAY 20                      //Единичная задержка в миллисекундах. Не менять!
#define TIMER1_FREQ 7813              //Тактовая частота таймера 1 в Герцах. Не менять!
#define DEFAULT_SPEED (TIMER1_FREQ/10-1) //Скорость программы по умолчанию. Используется для проверки
                                        //(поллинга) окончания выполнения сосулькой(-ами)
                                        //эффекта "падающая капля".

flash unsigned int prog_min_speed[PROGRAMS-PROGRAM_OFFSET]; //Минимальная скорость программы (частота шагов).
                                        //Реальная частота в Герцах равна 
                                        //TIMER1_FREQ / (prog_min_speed[i] + 1),
                                        //где TIMER1_FREQ - частота таймера 1.
flash unsigned int prog_max_speed[PROGRAMS-PROGRAM_OFFSET]; //Максимальная скорость программы (частота шагов).
                                        //Формула для частоты та же.
flash unsigned int prog_min_delay[PROGRAMS-PROGRAM_OFFSET]; //Минимальная задержка между кадрами.
                                        //Реальная задержка в миллисекундах равна
                                        //DELAY*prog_min_delay[i], где DELAY = 20 - единичная задержка.
flash unsigned int prog_max_delay[PROGRAMS-PROGRAM_OFFSET]; //Максимальная задержка между кадрами.
                                        //Формула для задержки та же.


unsigned char icicle_addrs[MAX_ICICLE_COUNT]; //Массив для хранения фактического порядка сосулек на шлейфе.
                                              //По индексу i находится адрес на шине (i+1)-й по счёту сосульки.
unsigned char icicle_count;           //Фактическое количество подключенных сосулек.


signed int frame_counter;             //Счётчик кадров. Автоматически обнуляется при запуске программы.
signed int step_counter;              //Счётчик шагов. Автоматически обнуляется при запуске программы.
signed char icicle_counter;           //Счётчик сосулек. Автоматически обнуляется при запуске программы.
                                      //Используется в некоторых программах вместо step_counter или frame_counter,
                                        //когда это лучше по смыслу.


unsigned char curr_program;           //Текущая реально исполняемая программа. Равно program (см. ниже), кроме
                                        //случая автоматической смены программ.
unsigned int curr_delay;              //Текущая установленная задержка.
unsigned int curr_speed;              //Текущая установленная скорость.
unsigned char program;                //Выбранная пользователем программа. Используется для проверки на равенство
                                        //PROGRAM_AUTO_CHANGE для инкремента repeat_made.
static unsigned char repeat_made;     //Число сделанных повторов данной программы. Используется в автоматическом
                                        //режиме. Обнуляется в начале программы.


char program_state;                   //Флаговая переменная состояния программы. Описания флагов - ниже.
#define PROGRAM_RESET_FLAG 0            //Флаг запроса сброса программы (то есть начала её заново). Вам он не нужен.
#define PROGRAM_DELAY_FLAG 1            //Флаг задержки между кадрами. Устанавливается, чтобы начать задержку.
#define PROGRAM_SPEED_CHANGE_FLAG 2     //Флаг изменения скорости. Вам он не нужен.
#define PROGRAM_DELAY_CHANGE_FLAG 3     //Флаг изменения задержки. Вам он не нужен.
#define PROGRAM_WAIT_FLAG 4             //Флаг ожидания завершения программы. Вам он не нужен.

//Номера битов и маски для конфигурационного регистра сосулек
#define EXT_CTRL 7
#define EFFECT_EXEC 6
#define AUTO_START 5
#define EFF_SPEED_MASK 0x03
#define EFF_SPEED 0


char icicles_lum_buffer[MAX_ICICLE_COUNT][LED_NUM]; //Буфер яркостей светодиодов. Первый индекс - адрес сосульки,
                                        //второй - номер светодиода.

signed char tmp,tmp1,tmp2;            //Вспомогательные переменные. Для реализации сложных эффектов.

Пожалуйста, всегда используйте определённые константы (#define) вместо "магических чисел" (в том числе, при обращении к флагам). Это сделает возможным изменение, например, количества светодиодов без переписывания всей программы.

Для управления сосульками используются следующие функции:

//Записывает в сосульку с адресом icicle_addr данные data по адресу памяти data_addr.
void icicle_write(char icicle_addr, char data_addr, char data);
//То же, но для всех сосулек одновременно.
void icicles_write(char data_addr, char data); 

//Записывает data в конфигурационный регистр всех сосулек сразу.
inline void icicles_write_settings(char data);
//То же, но для сосульки с адресом addr.
inline void icicle_write_settings(char addr, char data); 
//Возвращает конфигурационный регистр сосульки с адресом icicle_addr.
char icicle_read_settings(char icicle_addr);

//Запускает выполнение эффекта "падающая капля" на сосульке с адресом icicle_addr.
inline void icicle_start_effect_exec(char icicle_addr);
//То же, но для всех сосулек одновременно.
inline void icicles_start_effect_exec(void);

//Возвращает 1, если сосулька с адресом icicle_addr в данный момент выполняет эффект "падающая капля".
inline char icicle_check_effect_exec(char icicle_addr);
//То же, но для всех сосулек (1, если хотя бы одна сосулька выполняет эффект).
char icicles_check_effect_exec(void);

//Устанавливает яркость всех светодиодов сосульки с адресом icicle_addr равной lum.
void icicle_fill(char icicle_addr,char lum);
//То же, но для всех сосулек сразу.
void icicles_fill(char lum);

//Устанавливает яркость светодиода с номером led_num (0..LED_NUM, 0 - верхний светодиод)
//сосульки с адресом icicle_addr равной lum.
void icicle_set_led_lum(char icicle_addr,signed char led_num,char lum);
//То же, но для всех сосулек сразу.
void icicles_set_led_lum(signed char led_num,char lum);

//Записывает буфер яркостей светодиодов в память сосульки с адресом icicle_addr.
void icicle_write_lum_buffer(char icicle_addr);

//Во всех функциях выше при значении параметра led_num меньше 0 или больше LED_NUM-1 ничего записано
//в сосульки не будет, но это также не будет и ошибкой.

При добавлении новой программы (например, с номером 21) нужно сделать следующее:

1. Изменить количество программ:

#define PROGRAMS (21+PROGRAM_OFFSET)

2. Добавить соответсвующий #define:

#define PROG_21 (PROGRAM_OFFSET+20)

3. Добавить минимальные и максимальные значения скорости и задержки в соответствующие массивы. Скорости записываются в виде

TIMER1_FREQ / freq - 1

где freq - частота шагов в Герцах. 

Задержки записываются в виде

delay / DELAY

где delay - величина задержки в миллисекундах.

4. При необходимости модифицировать операторы switch в функции set_speed(), используемой для задания скорости программы. Обычно это нужно для программ, использующих эффект "падающая капля". В этом случае нужно добавить

case PROG_21:

в верхнюю часть обоих switch (после PROG_2, PROG_3, PROG_4).

5. Модифицировать функцию program_init(), которая вызывается перед началом программы. В оператор switch добавляется новая ветвь для PROG_21

6. Модифицировать прерывание по таймеру 1:

interrupt [TIM1_COMPA] void timer1_compa_isr(void){
...
}

Точнее, добавить новую ветвь

case PROG_21:

в оператор switch. Для примера ниже приведена ветвь для седьмой программы (с комментариями):

case PROG_7:
  if(frame_counter<LED_NUM){                        //первые LED_NUM кадров, "падение" горящих светодиодов
    icicles_set_led_lum(step_counter-1,FULL_OFF);   //сдвигаем горящий светодиод
    icicles_set_led_lum(step_counter,FULL_ON);      //на 1 вниз (выключаем предыдущий, включаем следующий)
    if(++step_counter==LED_NUM-frame_counter){      //в каждом кадре LED_NUM-frame_counter шагов
      step_counter=0;                               //шаги кончились, обнуляем счётчик шагов
      frame_counter++;                              //переходим к следующему кадру
      program_state|=(1<<PROGRAM_DELAY_FLAG);       //устанавливаем флаг задержки между кадрами
    }
  }
  else{                                             //последний кадр, сдвигаем горящий столбик вниз
    icicles_set_led_lum(step_counter,FULL_OFF);     //просто гасим по одному светодиоду
    if(++step_counter==LED_NUM){                    //шаги кончились, конец программы
      frame_counter=0;                              //обнуляем
      step_counter=0;                               //счётчики
      program_state|=(1<<PROGRAM_DELAY_FLAG);       //устанавливаем флаг задержки между кадрами
      if(program==PROGRAM_AUTO_CHANGE)              //если включена автоматическая смена программы,
        repeat_made++;                              //то инкрементируем счётчик сделанных повторов
    }
  }
break;

Небольшое дополнение: стоит минимизировать количество операций чтения / записи по I2C. Тактовая частота МК не очень высокая, а обмен по шине долгий. Например, для перемещения горящей точки не нужно перезаписывать всю таблицу яркостей сосульки: достаточно погасить один светодиод и зажечь другой.

После того, как Вы внесёте изменения в программу, её нужно скомпилировать. Для этого выберите пункт главного меню Project -> Build All (также можно нажать Ctrl + F9, или использовать соответствующую кнопку на панели инструментов). Если компиляция пройдёт успешно, Вы увидите окно с объёмом используемой памяти и некоторыми другими параметрами. Если же в программе допущена ошибка, то об этом будет написано в появившемся окне. Вам нужно будет перейти к соответствующей строке, в которой допущена ошибка, и исправить её. После этого снова можно запустить компиляцию.

После успешной компиляции готовый файл прошивки *.hex будет доступен по следующему пути:

Путь/к/папке/проекта/Release/Exe/название_файла.hex

 

На этом всё. Удачи!


Файлы:
Прошиква МК сосульки (ATtiny2313). Файл *.hex
Прошиква МК контроллера (ATMega8). Файл *.hex
Исходные файлы для сосульки (ATtiny2313). Проект CVAVR
Исходные файлы для контроллера (ATMega8). Проект CVAVR
Печатные платы (Sprint Layout 6.0)
Наклейки в форматах CorelDraw и PDF


Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

119 3 5
5 0 0