Главная » Микроконтроллеры
Призовой фонд
на декабрь 2019 г.
1. 1000 руб
Паяльник
2. 100 руб.
От пользователей

Ну, погоди! - игра 80-ых

Лирическое отступление

Мой знакомый, увидев старую добрую игру «Ну, погоди!» (электроника им-02) в интернете начал ностальгировать по тем временам и решил ее купить. Но шло время, а маленькая мечта оставалась мечтой...

Электроника им-02

Тут мне в руки попал «наглухо» умерший телефон Samsung GT-S5230. Данный телефон имеет TFT дисплей 3.0' размером 400х240 пикселей, 8-ми битной шиной и шлейфом “шириной” 31 пин.

Дисплей оказался жив и мне пришла идея накидать программку для микроконтроллера (далее МК) а-ля «эхо 80-х – волк ловит яйца».

Как вы уже догадались речь пойдет о разработке собрата игры «Ну, погоди!» и никакой пользы человечеству не несет кроме «фо фан».

 

Об оригинале ...

 Электроника им-02 «Ну, погоди!» начала выпускаться в 1984 г. (по началу не имела порядкового номера 02) и являлась точной копией Nintendo “ Game&watch EG-26 EGG” 1981 года (Только там волк со шляпой). «Начинкой» игры являлись: пьезокерамический звонок ЗП, часовой кварц, однокристальная 4-х разрядная ЭВМ КБ1013ВК1-2, дисплей ИЖМ2-71 и немного «рассыпухи». Однокристальная ЭВМ КБ1013ВК1-2 представляет собой законченное устройство с контроллером жидкокристаллических дисплеев, центральным процессором и т.д.. Программа для него была написана на ассемблере длинной около 2000 строк. Контроллер не особо был трудягой, т к дисплей ИЖМ2-71 представлял из себя жидкокристаллический мнемонический индикатор (с уже нанесенным рисунком) работающим при освещении. Т. е. прорисовки каждого пикселя от него не требовалось. Да и частота в 32кГц не способствовала этому (часы важнее:)).

Поехали...

В нашей схеме используется PIC18F2455 производительностью 12 MIPS.

Чтобы «прорисовать» картинку 400х240 пикселей с глубиной цвета 16 бит (к слову сказать дисплей от S5230 на пару сантиметров по более дисплея ИЖМ2-71), требуется объем памяти 192000 байт, что для нашего МК непозволительная роскошь, а усложнять устройство добавлением внешней памяти нам не нужно. PIC18F2455 имеет 24 кБ памяти программ и 2 кБ данных. Для того, чтоб вся картинка поместилась в память МК – она была разбита на блоки. Блок представляет собой массив, где каждый пиксель описан не двумя байтами цвета, а одним битом. Массив ссылается на свою палитру цветности (2 цвета.) Чтоб прорисовка динамических объектов была менее заметна глазу, в особенности больших объектов типа волка, создана функция вывода с «зацикливанием» байта (не бита).

void Draw_highS(unsigned char Bt)
{
   RS = 1;    // data
   masw=0x80;   // mask
   if (Bt&masw)
   {
   PORTB = Font_RG;
   WR = 0;   //clock
   WR = 1;
   PORTB = Font_GB;
   WR = 0;   //clock
   WR = 1;   }
              else
   {
.......
   else
   {
   PORTB = Color_rg;
   WR = 0;   //clock
   WR = 1;
   PORTB = Color_gb;
   WR = 0;   //clock
   WR = 1;   }
}

Код этой части программы получился более объемный, чем с побитным «зацикливанием», но и «выигрыш» в скорости прорисовки получается около десяток тактов МК на каждый цикл, коих несколько тысяч. Данный код можно было организовать ассемблерной вставкой, но дизасм показывает нам четкое выполнение команд без лишней шелухи за исключением NOP:

MOVFF Font_RG, PORTB
NOP
BCF LATA, 1, ACCESS
BSF LATA, 1, ACCESS

Как отмечалось ранее – картинка разбита на блоки, в том числе и динамические объекты на ней. Так волк, оставаясь на месте, меняя только положение корзины, прорисовывается только частично. Так же из-за специфики алгоритма корзина тоже разделена на части.

Картинка разбитая на блоки

Так же для вывода изображения используются функции:

LCD_Draw_Line()

для рисования линий, основанной на алгоритме Брезенхема и:

Draw_16b()

для вывода массивов с двухбайтными значениями.

Общий алгоритм игры «завязан» на прерывании от таймера. Максимальное время между двумя ближайшими событиями на экране (движением яиц) около 0,7 сек. В нашем МК данную длительность обеспечивает 16-ти битный таймер TMR0 с делителем 128. Дальнейшее снижение тайминга (увеличение скорости движения яиц) достигается предварительной записью в старший TMR0H и младший TMR0L байты таймера определенных констант. Время присутствия/отсутствия зайца на экране (порядка 5 с.) тоже складывается из суммы временных отрезков TMR0. Константы привязаны к общеизвестным контрольным точкам - набранным очкам (5..100…200…500…999 и тд.), при достижении которых происходит смена скорости/сброс разбитых яиц/увеличение кол-ва катящихся яиц и т.д.. Вообще все временные и очковые значения по возможности, приближенные к оригиналу.

Выбор лотка, на котором появится очередное яйцо осуществляется генератором псевдослучайных чисел:

rand()%3;

запись «%3» ограничивает случайное число максимальным значением 2. Т. е. результат операции – это остаток от деления на 3, а как известно из математики остаток не может быть больше делителя или равен ему. Таким образом, можно получить значения 0,1,2, что соответствует порядковому номеру лотка. Если лоток №0 (левый нижний, далее по «часовой стрелке») в данный момент не может быть задействован (что видно при старте оригинальной игры), то он автоматически заменяется на лоток №3 (правый нижний).

В оригинальной игре кол-во яиц одновременно находящихся на экране не превышает 5 шт. Для хранения информации о яйцах на экране создан массив размером 5х2. (Data_b[5][2]). Каждая строчка массива содержит номер лотка (0,1,2 или 3), по которому катится яйцо и позиция самого яйца до попадания в корзину (от курицы до корзины 5 позиций). Каждое вновь появившееся яйцо записывается в предыдущую свободную ячейку массива (т. к. в очереди оно будет последним). Указатель на массив позволяет отслеживать очередность движения каждого яйца. Исключение составляет случай, когда на одном лотке несколько яиц: они, если обратить внимание на оригинал игры, двигаются синхронно.

В итоге весь код занял практически всю память программ, хотя при желании можно еще «ужать»

Объем памяти МК

Биты конфигурации МК так же прописаны программно.

Звук с RC2/CCP1 выводится на старый добрый звонок пьезокерамический (ЗП-3) примененный все в той же серии игр «электроника». ШИМ – режим формирования звука позволяет освободить дополнительное время МК для выполнения других задач, но не так гибок в подборе «звукового оформления».

"Ну погоди!" - вид сзади

Информация на дисплей, как уже отмечалось, выводится по 8-ми битной шине. При инициализации применен альбомный режим.

"Ну погоди!" - вид спереди

 

Ниже приведена электрическая схема девайса:

Схема электрическая принципиальная Ну, погоди

Даташит на PIC18F2455 говорит нам, что «…Standard devices with Enhanced Flash memory, designated with an “F” in the part number (such as PIC18F2550), accommodate an operating VDD range of 4.2V to 5.5V. Low-voltage parts, designated by “LF” (such as PIC18LF2550), function over an extended VDD range of 2.0V to 5.5V.», а вот питание дисплея S5230 2.8 - 3.3В. Но практика показывает что F-ки и при снижении питания до 3В отлично «трудятся» даже в режиме PLL. Устройство тестировалось на батарейках и аккумуляторах (в том числе от мобил) в диапазоне 2.9-3.8В. Проблем не возникло (разве что яркость экрана чуть меняется).

При 3В устройство потребляет около 70мА. Львиную долю конечно «съедает» дисплей, т. к. дисплеи от сотовых очень прожорливы.

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
DD1 МК PIC 8-бит
PIC18F2455
1 Поиск в Utsource В блокнот
С1, С2 Конденсатор1206-15пФ±5%2 Поиск в Utsource В блокнот
С3 Конденсатор1206-2.2 мкФ ±10%1 Поиск в Utsource В блокнот
С4 Конденсатор1206-0.1 мкФ ±20%1 Поиск в Utsource В блокнот
R1-R5 Резистор1206-5.1 кОм±5%5 Поиск в Utsource В блокнот
R6 Резистор1206-5.1 Ом±5%1 Поиск в Utsource В блокнот
R7 Резистор0805-1 кОм±10%1 Поиск в Utsource В блокнот
HG1 LCD-дисплейДисплей жидкокристаллический S52301 Поиск в Utsource В блокнот
SB1-SB4 КнопкаПКн150-14 Поиск в Utsource В блокнот
BQ1 ДинамикПьезоизлучатель ЗП-31 Поиск в Utsource В блокнот
ZQ1 Кварцевый резонатор8.0000 MHz - HC49/U1 Поиск в Utsource В блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 25.11.2019 0 3
Я собрал 0 Участие в конкурсе 5
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 5 чел.

Комментарии (8) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
руня #
Так какой дисплей нужен S5230 или S5250? А так классно получилось! Буду собирать!
Ответить
0

[Автор]
Fuckir #
По тексту верно 5230 (s5250 имеет дисплей больше : 3.2').
В перечне элементов опечатка, исправлю. Спасибо.
Ответить
+1
zab_ig #
А мультик в конце будет? :)
Ответить
0

[Автор]
Fuckir #
Так и знал, что кто-нибудь спросит!
В полной версии, что дарил другу: небольшой комикс написал, чтоб память забить до конца.
Ответить
0
Критик #
Нормалэк, но если учиться, то сразу на STM32, тогда и ZX запихнуть можно.
Ответить
0
Сергей #
А архив у всех открывается?
Ответить
0

[Автор]
Fuckir #
Сергей
Скачал - открывается без проблем
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
ELM327 OBD II — адаптер с поддержкой CAN Конструктор для сборки: предусилитель на лампе 6N3
вверх