Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 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 Поиск в магазине ОтронВ блокнот
С1, С2 Конденсатор1206-15пФ±5%2 Поиск в магазине ОтронВ блокнот
С3 Конденсатор1206-2.2 мкФ ±10%1 Поиск в магазине ОтронВ блокнот
С4 Конденсатор1206-0.1 мкФ ±20%1 Поиск в магазине ОтронВ блокнот
R1-R5 Резистор1206-5.1 кОм±5%5 Поиск в магазине ОтронВ блокнот
R6 Резистор1206-5.1 Ом±5%1 Поиск в магазине ОтронВ блокнот
R7 Резистор0805-1 кОм±10%1 Поиск в магазине ОтронВ блокнот
HG1 LCD-дисплейДисплей жидкокристаллический S52301 Поиск в магазине ОтронВ блокнот
SB1-SB4 КнопкаПКн150-14 Поиск в магазине ОтронВ блокнот
BQ1 ДинамикПьезоизлучатель ЗП-31 Поиск в магазине ОтронВ блокнот
ZQ1 Кварцевый резонатор8.0000 MHz - HC49/U1 Поиск в магазине ОтронВ блокнот
Добавить все

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

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

Теги:

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

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

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

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

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

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

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

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

[Автор]
Fuckir #
Сергей
Скачал - открывается без проблем
Ответить
+1
sseg #
Выложьте пожалуйста прошивку в hex? Спасибо!
Ответить
0
sarapova #
Ошибки компиляции проекта в MPLAB X IDE v5.35
Прикрепленный файл: Annotation 2020-04-10 174231.png
Ответить
0
sseg #
В настройках MPLAB надо что-то изменить. Мне на радиокоте компильнули. Плату в лай нарисовал. Теперь вот думаю, как разъем отпаять, он плавится быстро.
Прошивку прикрепил.
Отредактирован 11.04.2020 10:04
Прикрепленный файл: 123.rar
Ответить
0
sarapova #
Спасибо за прошивку! Но есть желание править код, добью MPLAB и отпишусь.
Ответить
0
sseg #
Там в настройках, что-то вроде по памяти. Не успел инструкцию сохранить.
Может пробуйте делать и другие прошивки с играми, если умеете.
Ответить
0
Sergey #
Можно и файлик платы в ЛАЙ.
Ответить
0
sseg #
Да.
Прикрепленный файл: igra.rar
Ответить
0
sarapova #
Использовал MPLAB C18 v3.47 и все получилось. И вот мой НЕХ файл
Прикрепленный файл: PIC18F2455.X.production.hex
Прикрепленный файл: PIC18F2455.X.production.png
Ответить
0
sarapova #
Прежде чем взяться за паяльник - симулируем все в Proteus 8 Professional. Осталось код подправить для экрана ILI9341 320х240, а так все работает и со звуком.
Прикрепленный файл: proteus5.jpg
Прикрепленный файл: proteus6.jpg
Прикрепленный файл: proteus8.jpg
Ответить
0
Harmah #
Проект Proteus 8 Professional не приложите?
Ответить
0
sarapova #
HEX file ниже в комментариях.
Прикрепленный файл: ILI9341.zip
Ответить
0
sseg #
А как со шлейфа разъем для дисплея отпаять без плавки пластмассы?
Ответить
0
Sergey #
А пробовали греть с другой стороны платы?
Ответить
0
sseg #
Это на шлейфе, плавится.
Ответить
0

[Автор]
Fuckir #
Именно так и делал аккуратно феном. Все получилось
Ответить
0
Sergey #
Подскажите где берете дисплеи с платами?
Ответить
0
sarapova #
Платы нужно изготовить самому.
Ответить
0
Sergey #
Я про плату с разъемом дисплея.
Ответить
0
sarapova #
Именно поэтому и переделал код под разрешение 320х240 чтобы можно было использовать стандартные дисплеи с модулями ILI9341, ILI9486 (320х480). В них с разьемами все в порядке.
Ответить
0
Sergey #
Да спасибо уже все увидел. Комментарий писался еще до этого!
Ответить
+1
sarapova #
Переделал код для экрана ILI9341 320х240. Симуляцию можете посмотреть тут https://www.youtube.com/watch?v=OLSWoqbwTac
Прикрепленный файл: PIC18F2550.X.production.hex
Ответить
0
Андрей #
А можно этот же код для PIC18F2455? Заранее спасибо!
Ответить
0
sarapova #
Пожалуйста
Прикрепленный файл: PIC18F2455.X.production.zip
Ответить
0
Васо #
Мультика в конце не было. Я набирал 999, а потом все начиналось заново с 0,но более увеличенной скоростью.
Ответить
0
Ришат #
Статичный фон выводится на экран или просто нарисован, как на оригинале?
Ответить
0

[Автор]
Fuckir #
Выводится
Ответить
0
szabi #
Привет.
Максимальное количество одновременно 5 яиц на экране не совсем правда. Взгляните на это видео:
https://www.youtube.com/watch?v=0uzfr0nisQs
Особенно около отметки 1000 пунктов одновременно присутствует 6 и даже 7 яиц.
Ответить
0

[Автор]
Fuckir #
Максимальное количество одновременно 5 яиц на экране не совсем правда.
Совсем правда для режима Игра А

Ваше же видео демонстрирует режим Игра Б - здесь не спорю.
Ответить
0
sarapova #
Ну, погоди! - игра на PIC18F4550 и ILI9341. Тут некоторые просили НЕХ на готовых сборках (думаю не противоречит правилам сайта). Вот видео https://www.youtube.com/watch?v=Im-Wrh8RiRQ там ссылки на PIC board with USB function PIC18F4550-I/PT и 2.8'' LCD 8-Bit Parallel Bus Monitor Module ILI9341 ну соответственно и демонстрация.
Отредактирован 27.04.2021 17:06
Прикрепленный файл: PIC18F4550_ILI9341.production.rar
Ответить
+2
Александр Севостьянов #
В схеме ошибка, R1 и R2 подключены параллельно!!! На плате правильно.
Ответить
0
Sergey #
Всем привет. Читаю и уже запутался. Связка ILI9341 320х240 и PIC18F2550 работают? Можно схемку и прошивку.
Ответить
+1
Игорь #
Попробовал повторить игру на PIC2550 и дисплеем на ili9341 320*240 с прошивкой, выложенной в комментариях. Изображение отзеркалено и перевернуто вверх ногами. Думал, что ошибка в сборке, но проверил файл прошивки в протеусе, и там тоже самое. Пришлось переделать.
Прикрепленный файл: wolf.X.production.hex
Ответить
0
Sergey #
А можно схемку?
Ответить
+1
Игорь #
Схема выше (скриншот из протеуса) https://cxem.net/mc/mc460.php#comment-77769. Только вывод CS дисплея посадить на землю.
Ответить
0
TEXnik-os6 #
Будьте добры, поделитесь пожалуйста схемкой для связки ILI9341 320х240 и PIC18F2550
Ответить
0
Михаил #
Игорь, а можете собрать HEX для PIC2455 из исправленного кода для 9341 320х240. Буду благодарен.
Ответить
0
Mih_Mih #
Подскажите, а в чем вы предварительно рисовали картинки и конвертили их в массив байт для записи в МК ? Если можно скиньте эти данные.
Ответить
0

[Автор]
Fuckir #
Брал изображение оригинала, переводил в монохром (чб изображение в формате BMP) и просто вскрывал файл.
Ответить
0
Mih_Mih #
Понял. Спасибо большое!
Ответить
0
Sevlik #
Ради интереса решил повторить. Сделал свою печатку под дип. Все работает. Но вот дисплей еле светится. Пробовал 3 дисплея, подсветка еле светится. Какие контакты дисплея, отвечают за подсветку? Даташит на дисплей не нашел. Помогите пожалуйста разобраться.
Ответить
0

[Автор]
Fuckir #
Пин 23 это плюсовой контакт подсветки.
Ответить
+1
Sevlik #
Спасибо большое за ответ. Моя вина. Собирал ночью и перепутал 5.1 ом с 5.1 Ком, вот и бледно светился экран. Прилагаю гербер под дип, может кому и надо. Еще и платы остались.
Прикрепленный файл: Gerber volk .zip
Ответить
0
Михаил #
Прошивка от Игоря wolf.X.production.hex для экрана 320х240 - наиболее совершенная, но остался досадный изъян: у 2 куриц уехали гребни.
Прикрепленный файл: IMG_20230903_093854.jpg
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Pickit 2 - USB-программатор PIC-микроконтроллеров
Pickit 2 - USB-программатор PIC-микроконтроллеров
Паяльная станция Hakko 936 Ветрогенератор
вверх