Змейка и Тетрис на микроконтроллере

Тетрис и Змейка
Увидел как-то интересный видеоролик в сети, в нем демонстрировалась игра змейка реализованная на микроконтроллере и светодиодной матрице 8х8, потом нашел еще несколько подобных роликов, которые заинтересовали меня. Среди них также был ролик, где на “мощном” микроконтроллере была собрана игра тетрис. После просмотра, я решил разработать собственный вариант устройства, в котором совмещены обе игры, с применением микроконтроллера PIC16F688 и двух светодиодных матриц, которые отображают игровое поле с разрешением 8х16 точек.Читать далее »

Прерывания

Прерывания в микроконтроллерах очень часто используются при разработке радиоэлектронных устройств, они позволяют реализовать многозадачность, то есть параллельное выполнение нескольких задач. Под прерыванием подразумевается условный переход из какой-либо области памяти программ (во время выполнения основной программы) на четко определенный адрес в этой памяти, данный адрес еще называют вектором прерываний. Векторов может быть несколько, но в микроконтроллерах PIC16 только один вектор прерываний, и это адрес в памяти программ равный 0004h. По этому адресу размещают подпрограмму обработки прерываний (обработчик прерываний). Читать далее »

Косвенная адресация

Косвенная адресация очень удобная штука, когда необходимо оперировать с большим количеством регистров, о ней я упоминал еще в первой статье, здесь же покажу, как можно применить данный вид адресации.
Для работы с косвенной адресацией используется регистр специального назначения FSR и физически не реализованный регистр INDF. Принцип работы простой, в регистр FSR записываем адрес какого-либо регистра, пусть это будет регистр с названием temp (то есть адресу этого регистра присвоено название temp с помощью директивы equ), после чего содержимое регистра temp “условно” оказывается в регистре INDF. Теперь все операции, проделанные над регистром INDF, будут выполнены и для регистра temp, на самом же деле обращение к регистру INDF вызовет действие непосредственно с регистром temp, поэтому я и употребил термин “условно”.Читать далее »

Арифметические операции. Умножение и деление

Умножение и деление
В микроконтроллерах PIC16 отсутствует аппаратный блок умножения и деления чисел, но эти арифметические операции можно реализовать программным путем.
Операцию умножения можно представить в виде многократного сложения, деление — многократным вычитанием. Например, выражение 8х3=24 равнозначно 8+8+8=24, для деления в качестве примера возьмем следующее выражение 36:10=3,6. Алгоритм деления можно представить так: 36-10-10-10-10=-4, то есть вычитаем из 36 число 10 до тех пор, пока не получим отрицательный результат. При этом результатом операции деления является количество вычитаний, но только без учета последнего вычитания, которое привело к отрицательному результату, так как я рассматриваю здесь только целочисленные операции без дробных частей. В данном примере после четырех вычитаний получаем -4, соответственно ответ равен 3, без учета последнего вычитания.Читать далее »

Бесконечное зеркало

Бесконечное зеркало
В очередной раз, копаясь в сети, набрел на интересную штуковину, так называемое бесконечное зеркало. Эта конструкция из зеркал и светодиодов создающая эффект бесконечного светового туннеля в пространстве. Смотрелось это красиво, и я решил повторить данную конструкцию. Сам эффект возникает в результате многократного отражения света между двумя зеркалами, одно из которых является полупрозрачным.

Изготовить данную конструкцию несложно, потребуется обычное зеркало, а также полупрозрачное, светодиоды, ну и конструкционные материалы для того чтобы собрать все вместе.Читать далее »

Арифметические операции. Сложение и вычитание

Сложение и вычитание
Иногда при написании программ требуется выполнить простые арифметические операции с многобайтными числами. С однобайтными числами все просто, сложение и вычитание выполняются стандартными командами addwf, addlw, subwf, sublw, для многобайтных чисел придется писать небольшие подпрограммы. Я буду рассказывать только про целочисленные операции, без дробных частей.
В тексте статьи и в коде я буду использовать приставки к названиям регистров, чтобы легче разобрать старшие и младшие регистры чисел. Ограничусь четырехбайтными числами, соответствующие приставки, начиная от старшего регистра до младшего: HH, HL, LH, LL.Читать далее »

Таблица данных

Таблица данных применяется для задания большого количества констант (чисел) в памяти программ. Например, требуется получить сигнал заданной формы с помощью ШИМ или резистивного ЦАП (R-2R), для этого необходимо загнать в таблицу заранее рассчитанные коэффициенты, и считывать их через определенные промежутки времени, как это сделано в статье про регулировку яркости светодиода. Также таблица данных используется для реализации знакогенератора при выводе символов на жидкокристаллический индикатор (например, дисплей мобильного телефона).Читать далее »

Подключение кнопки к микроконтроллеру

Кнопка и микроконтроллер
Кнопку к микроконтроллеру можно подключить двумя основными способами, с подтяжкой линии порта к высокому логическому уровню или низкому через резистор, как показано на картинке ниже.
Я обычно использую первый вариант подключения, можно конечно использовать внутренние подтягивающие резисторы на входах PORTB, но мне еще не доводилось применять такой способ.Читать далее »