Пользователь
0,0
рейтинг
2 марта 2014 в 19:15

Разработка → Программируем микроволновку или контроллер 40-летней давности

Привет, недавно мне совершенно случайно попалась в руки такая железка:
image

Ну железка и железка, подумал я… На плате присутствует микроконтроллер РВЕ035, расширитель IO m5l8243p, ИР12 между РФ5 и контроллером и там еще где-то ЛН1 в стороне болтается. Мне сразу понравилась хорошая раритетная ПЗУ на 2Кб РФ5 в панельке в золоте. Думаю, сниму ее, а остальное смело в утиль, бо вся плата залита лаком по самое небалуйся..А потом все-таки стало интересно, а что это такое вообще?

Выяснилось, что это плата управления от советской микроволновки типа Электроника 23 (aka БУВИ-2 aka Фея aka Днепрянка). В интернете быстро нашлась даже схема девайса: http://www.elremont.ru/small_rbt/bt_rem32.php Теперь, когда стало понятно, что это такое, одна рука уверенно потянулась к мусорке, а другая нечаянно вбила в гугле «РВЕ035» и… И я заинтересовался и внимательно вгляделся в плату. Раз есть контроллер, значит для него можно писать программы. Еще прямо на плате есть какой-никакой экран (4 цифры) куда можно выводить всякие матерные ругательства (BABA, SISI, ну, вы поняли). Так же здесь еще есть пьезоэлемент, а значит можно пищать. Ко всему прочему можно 4x4 клавиатуру подключить. Это же прямо девборда какая-то получается, обрадовался я!

Как уже было сказано, на плате установлен контроллер РВЕ035. В России он больше известен по названию КР1816ВЕ35, а вообще, это великий и ужасный Intel 8035 серии MSC-48. Первые экземпляры начали производить в 1976, то есть примерно 40 лет назад. В контроллере нет своей памяти для программ, поэтому он общается по внешней шине с ПЗУ, откуда и читает инструкции на выполнение. Зато есть 64 байта ОЗУ, из которых примерно 32 байта можно использовать как угодно, а остальные предназначены для регистров и стека. Есть таймер, есть прерывание от таймера, есть внешнее прерывание, есть система приоритетов. Короче нормальный олдскульный контроллер, не чета жирным PIC'ам. То, что так долго ждали большевики. Сразу захотелось под него что-нибудь закодить.

Но сперва предстояло решить одну трудность, а именно подключить плату. Как видно из схемы, для питания цифровой части требуется просто +5V, а вот для питания индикатора нужно 2,5V и 30V переменного напряжения.

Кстати про индикатор — это же лампа! Да, теплая ламповая радиолампа, а не какие-то там попсовые светодиоды. И как у лампы у нее есть катод анод и сетка. Такой тип индикаторов называется люминесцентно-вакумный индикатор. Немного подумав над схемой, я увидел, что 30В переменки идут на диодный мостик, значит они выпрямляются. И даже 2.5В тоже идут на диоды и после них на сетку, значит они тоже выпрямляются. Значит, можно попробовать подключить плату к постоянному напряжению. Вместо 30V я подал 12V, вместо 2.5V я подал 3.3V со стандартного блока питания формата ATX. Для этого подпаялся проводками к плате. Получилось так:



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

Я воспользовался свободным кросс-платформенным ассемблером Asm48. Прикольно, что есть версия для MacOS, видимо авторы не обделены чувством юмора, по крайней мере я оценил. Ну значит скачиваем ассемблер, там все просто: ASM48 <имяфайла.asm> Первое, что я сделал, это «поморгал светодиодом», только вместо светодиода я дергал ногу динамика (пьезоэлемента) в бесконечном цикле с задержкой. Динамик подключен к порту 1, старший бит:
jmp main
nop
nop
nop
nop
nop
nop
main:
	mov r6,#0                                  ; в регистре r6 - 0 или 80h
forever:
	mov a,r6                                    ; пересылаем из регистра в ALU
	xrl a,#080h                                ; a = a xor 80h
	outl p1,a                                    ; выводим в порт 1
	mov r6,a                                    ; сохраняем значение в r6
	call onesec                              ; секундная задержка
	jmp forever                                ; бесконечный цикл

;---PROCEDURES
;;;;;;;;
delay100:
 	mov r1,#84
loopex:	mov r2,#236
loopin:	djnz r2,loopin
	djnz r1,loopex
	mov r3,#4
loopad: djnz r3,loopad
	ret

;;;;;;;;
onesec:
	mov r4,#10
loop_d: call delay100
        djnz r4,loop_d
	ret


Скомпилировав программу и зашив ее на программаторе в ПЗУ 2716, запускаю плату и слышу периодические щелчки с интервалом около секунды. Работает! Теперь предстояло разобраться с экраном. По схеме видно, что «маска» символа ABCDEFG подключена к порту 1. Причем сигнал инвертированный, то есть когда 1 — палочка не горит, когда 0 — горит. Для того, чтобы задать маску буквы «H» посмотрим картинку:

Начинаем обходить букву с G до A, так как здесь обратный порядок следования бит: G закрашена, значит 1; F закрашена, значит 1; E закрашена, значит 1; D не закрашена, значит 0 и тд. В итоге получается: 1110110b. Мы помним, что сигналы инвертированные, поэтому нужно проинвертировать саму маску: not 1110110b = 0001001b. Или 9h. Послав это число в порт 1 мы установим маску для буквы. Сложнее с выбором символа. Здесь применена динамическая индикация. Вкратце суть сводится к тому, что мы постоянно должны задать маску, зажечь первый символ, задать маску, зажечь второй символ и тд. За разрешение свечения символа отвечает второй порт, который с помощью микросхемы m5l8243p расширен до 4-ех четырех битных портов. Для обращения к таким портам служит команда MOVD, а сами порты имеют номера P4, P5, P6, P7. P4 по замыслу авторов отвечает за сканирование клавиатуры, а вот P5 как раз устанавливает один из четырех символов для отображения.
image
Сперва я пытался сделать динамическую индикацию в основном цикле программы, но потом использовал для этого таймер. А в основном цикле программы меняется буфер индикатора, отображающий с периодичностью в 1 секунду надписи «HELO» и «2014»
Исходный текст программы
;DATA
	.equ disp_buf, 030h			; 4 bytes buffer


;;;  reset vector 
	.org	0
	dis 	i			; disable interrupts
	jmp	main

;;;  external interrupt vector--trap
	.org	3
	jmp	$			; nop

;;;  timer interrupt vector
	.org	7
	sel 	rb1
	mov a,#0d5h
	mov t,a
	mov	a,#00FH
	orld	p5,a

	mov	a,disp_buf-1
	add	a,r5
	mov	r0,a
	mov 	a,@r0

	outl 	p1,a

	mov	a,r4
	movd	p5,a
	rl	a
	mov	r4,a

	djnz	r5,exit_tmr
	mov	r4,#0feh
	mov	r5,4

exit_tmr:
	sel 	rb0
	mov a,#0d8h
	mov t,a
;	strt 	t
	retr

;MAIN
main:
	;initialize

	dis 	tcnti			; turn off counter

	mov r1,#0
	mov r5,#0
	call copy_buf

	sel 	rb1			; timer variables
	mov	r4,#0feh		; 1110h - CT position
	mov	r5,4			; R5 = buf offset
	sel	rb0

	mov 	a,#0e5h
	mov 	t,a
	strt 	t
	en	tcnti

	mov a,#0ffh
	movd	p6,a
main_loop:

	call 	onesec
	mov a,r5
	xrl a,#4
	mov r5,a
	mov r1,a
	call copy_buf
	jmp main_loop

msg_table:
	.db #0c0h		;O
	.db #0c7h		;L
	.db #086h		;E
	.db #089h		;H

	.db #099h		;4
	.db #0f9h		;1
	.db #0c0h		;0
	.db #0a4h		;2

;;;;;;;;
delay100:
 	mov r6,#84
loopex:	mov r2,#236
loopin:	djnz r2,loopin
	djnz r6,loopex
	mov r6,#4
loopad: djnz r6,loopad
	ret

;;;;;;;;
onesec:
	mov r3,#10
loop_d: call delay100
        djnz r3,loop_d
	ret

;;;;;;;;
;copy from msg_table to display buffer 4 bytes
; R1 = msg_table offset
;;;;;;;;
copy_buf:
	mov r0,disp_buf
	mov r2,4
copy_lp:
	mov a,r1
	add a,#msg_table
	movp a,@a
	mov @r0,a
	inc r0
	inc r1
	djnz r2,copy_lp
	ret


Коротенькая видео-демонстрация работы девайса:

Пытливый хабраюзер наверняка заметил баг в конце ролика, когда вместо HELO высветилось не совсем то, что надо. Я его тоже заметил, да. А все потому, что когда в основной программе происходит пересылка в буффер дисплея я забыл остановить таймер. Перед call copy_buf нужно сделать DIS TCNTI а после EN TCNTI. Так то!

Теперь только остается сыграть на девайсе «в лесу родилась елочка» и миссию буду считать удачно завершенной. Всем добра!

Литературка:

1) MCS-48 AND UPI-41 ASSEMBLER LANGUAGE MANUAL 1976
2) 2 том Справочника Шахнова (Микропроцессоры и микропроцессорные комплекты интегральных микросхем)
3) Сташин В.В. и др. — Проектирование цифровых устройств на однокристальных микроконтроллерах
4) Знакосинтезирующие индикаторы: Справочник/ Под ред. В. П. Балашова
5) Быстров Ю.А. Сто схем с индикаторами
Сергей @tronix286
карма
107,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (48)

  • +2
    Не думал, что уже тогда в потребительских устройствах применялись микроконтроллеры. А для чего в программе нужна вот эта конструкция?
    jmp main
    nop
    nop
    nop
    nop
    nop
    nop
    main:
    

    И еще вопрос: каким программатором прошивали ПЗУ? Она не ультрафиолетом стирается?
    • 0
      По-моему, для устаканивания системы.
    • +6
      Там просто в начале вектора прерывания:
      .org 0 — старт программы
      .org 3 — вектор внешнего прерывания
      .org 7 — вектор прерывания счетчика/таймера.

      Чтоб не нарваться на прерывание сделал такую заглушку. Когда я разобрался, то уже написал по нормальному. (см код под спойлером).

      ПЗУ шил Willem 5.0. Стирается ультрафиолетом, у меня есть стирашка.
      • +4
        Лучше заглушки делать reti, иначе у тебя будет происходить фактически програмный ресет, если вдруг сработает прерывание.
    • +1
      > Не думал, что уже тогда в потребительских устройствах применялись микроконтроллеры. А для чего в программе нужна вот эта конструкция
      Ну как бы самые первые микропроцессоры (а затем и микроконтроллеры) и шли в потребительскую электронику, by design, так сказать.
      Тот же знаменитый Busicom 141 на i4004.
    • +1
      Это вектора прерывания. Правильно ставить не nop, а reti. Ибо, если будет случайное прерывание, то вернёшься откуда начинал
  • 0
    Ох уж эти «ВЕххх». 40 лет, обалдеть!
  • +3
    Большое спасибо автору, что он не выкинул девайс!
  • 0
    Ребят, а просветите пожалуйста почему 40 лет?
    Просто мне самому 43 и впервые микроволновку я увидел наверное лет в 22. Они с 70-х выпускались в СССР?
    • +12
      i8035 (микроконтроллеру) почти 40 лет. Микроволновка конкретно эта скорее всего 88 года рождения, о чем свидетельствует подпись карандашем на обратной стороне ПЗУ
      image
      • +3
        Спасибо. Э… но мне в 88 году было 17.
        Но я все равно не знал что тогда были микроволновки.
        Удивительно что все это еще в рабочем состоянии. Пощел дербанить свою сломанную микроволновку. Благо контроллер там цел.
        Есть еще стиральная машина с контроллером. Надо бы и с ней что нибуть придумать.
        • +4
          Вот так когда-нибудь очередной пост на Хабре приведёт к созданию машины времени…
        • 0
          Это ПЗУ было запрограммировано (или проверено) буквально через неделю после моего рождения.
          Мммм… раритеееет. \Вспомнить картинку с Гомером Симпсоном, пускающим слюни\
          Да и ламповая индикация — это тоже круто.
          Да… а я так и не поработал с такими контроллерами.
        • 0
          Были, у меня была дома была микроволновка Днепрянка с серийным номером 000054. Появилась в начале 90-х. Долго жила.
          • 0
            Только у них был какой-то прикольный косяк — при включении питания включался и все время работал вентилятор охлаждения, то есть настроить часы и оставить их работать невозможно было — сильно шумел вентилятор. По идее он должен был включаться только когда работает режим нагрева пищи.
    • 0
      Я видел микроволновки 84 года (первые Электроники), с такой элитной ручкой (не знаю как корректно назвать этот элемент управления) с отсечками времени и 2мя кнопками.
      • 0
        Вот тут говорят, что еще в 70-х их выпускали.
  • +29
    Ардуино напрягся! :)
    • –11
      А зря.
      В Атмелах уже встроенная ПЗУ. Ардуино следует напрягаться от STM32, но это опять же, на любителя.
      Кроме того к Ардуине идут полные тоолчейны и нет геммороя с облучением РФ5 ультрафиоленом.
      • +23
        понимаю, что на Хабре не очень любят смайлы и, конечно, не все знают откуда фраза «Apple напрягся», но я не знаю что с этим делать. Большой таблички «Сарказм» у меня нет.

        • +2
          На Хабре это чаще делают так:
          Большая табличка Сарказм
          image
  • +6
    Про археопрограммирование Винж уже писал. Видимо, надо выделять отдельное направление археоэмбедда, который находит и перепрограммирует микроконтроллеры Древнего СССР и Древнего США.
  • +5
    Эх! Нужно было заббакапить оригинальную прошивку микроволновки и посмотреть ее внутренности. Врядли конечно там пасхальные яйца, но все равно интересно же посмотреть.
    • +5
      Пасхальное яйцо у микроволновки — это когда в ней попробовать приготовить сырое яйцо в скорлупе. Вот это будет пасхалка на целый вечер.
      • +1
        Вообще опытные люди уже вычислили как сварить яйцо в микроволновке приемлемым способом.
        • 0
          Использовать воду — это то ещё читерство. С помощью воды можно много интересных опытов проводить и даже спасти микроволновку от потенциального выхода из строя в некоторых ситуациях.
          Правда, я не был знаком с этой высоконаучной работой по линку выше, был интересен процесс как они до этого доходили.
          Пойду тоже искать муху, а то у нас слон в зоопарке пропал.
    • +1
      Я забекапил. Оригинальная прошивка здесь: zx.pk.ru/showpost.php?p=680408&postcount=588 А внутренности я посмотреть никак не мог, поскольку отдали только плату.
  • +14
    Нельзя не упомянуть внешний вид микроволновки

    image
    • +2
      Вот уж где «Метро» интерфейс органично вписался, в отличие от попыток насильно заставить людей пользоваться им на десктопах и ноутбуках.
    • +1
      Она неплохая была, долго у товарища работала, в 2011 году сдох сначала диод, а потом за ним и магнетрон проследовал, кстати, производства LG (иначае как-то контора тогда называлась, наши видать как-то у корейцев магнетроны заказывали).
      На ней я впервые тренировался в ремонте микроволновок, спалив пару предохранителей…
      Удивляет совершенно неуместный выключатель на морде при стильных кнопках пленочной клавиатуры…
      В ней еще гриль есть, когда сдох магнетрон, сендвичи им делали, получались хорошо))
      • +2
        LG тогда назывался GoldStar.
  • +1
    Прекрасный ностальгический образец советской бытовой электроники — широкие дип-корпуса (доступный ИР12 в качестве простого регистра-защелки адреса вместо дефицитного тогда ИР22), ряды КТ315/361, электролиты К50-6, огромный кварц итд. Странно только, что ПЗУ оказалось в золоченом военном исполнении, а панелька судя по фото — одна из самых ненадежных советских с плоскими, а не цанговыми контактами. Но как бы ни было — это полноценный раритетный контроллер — можно сделать часы с будильником ;) — ресурсов должно хватить.
    PS — ВЕ48 применялись еще, в частности, в клавиатурах ЕС-1840 и Искра-1030.
    • +2
      Для часов придется выпаивать индикатор т.к. текущий форм-фактор неудобный. Часы получатся слишком высокими.

      PS. На ВЕ35 (ВЕ39) в Орле делали матричные принтеры, так, что ресурсов у контроллера более, чем достаточно.
  • 0
    Вопросец, компилятор для С51 подойдёт ведь для этих контроллеров? Надо только не использовать ассемблеровские команды, которых нет в твоём контроллере.

    Если будет возможность — попробуй компильни, для С51.

    Просто мы дизасмили прошивку дисплея покупателя, там был 8048 контроллер и внешнее ПЗУ. Дизасмили дебагером С51.
    • +1
      C51 сверху вниз совместим с 48, но не наоборот. У 8048 даже команды вычитания нет, что поначалу ставит несколько в тупик. О делении и умножении я не говорю. Таким образом код, написанный для 8048 можно почти без изменений юзать на 51, а наоборот нельзя.
      • 0
        Ты говоришь очевидные вещи. Я же о чём и говорю, что не использовать команды С51! У пикушек есть одна арифметическая команда — вычитание :). И ничего, вертелись.

        Просто компилятор для С51 найти было проще :))))
        • 0
          А как их не использовать? Компилятор же будет выдавать код для 51.
          • –1
            А в чём проблема. Нет у тебя сложения, так не используй. Если собрать твой код для С51 и залить в ПЗУ, работать не будет? Он же тупо ассемблеровские команды в машкоды транслирует. МалЪчик дэвочка — какая в попу разница
            • 0
              Не понял. Ассемблером для C51 собрать этот код? Ну 99% соберется и будет работать, только смысл то какой? Я вообще-то про компилятор Си говорил для C51
              • 0
                Про си-то всё понятно :). Просто если ты взял асм48, то кто мешал найти сразу для С51 :).

                Бро, я не пытаюсь подколоть, просто интересуюсь и так же когда-то с подобным сталкивался.
                • 0
                  Да, ждём «В лесу родилась ёлочка».

                  Можно, кстати брать примеры от С51
                  • 0
                    Примеры от C51 не годятся. Буду делать с нуля
                    • 0
                      А в чём сложность? Можешь показать и пояснить, если не сложно?
                • 0
                  Да их (ассемблеров) полно для 8048, так что здесь проблемы нет никакой.
  • +1
    Вот микроволновка для олд-скульных программистов,
    для тех, кто помнит, что такое перфокарты:

    image
    • 0
      ключик на кнопке о чем-то больно напоминает, но все же я не могу помнить перфокарты… поясните?
      • 0
        Ноль перечеркнут.
  • 0
    В современные микроволновки можно смело ставить посуду с металлизированным рисунком. В инструкции написано, что подгорающие части можно экранировать фольгой. А вот была у меня микроволновка Электроника (индекс не помню) в 90-е годы, так в нее вообще ничего металлического нельзя было ставить. Нечаянно поставленная тарелка с металлизированным ободком в виде золотой каемочки устраивала форменный апокалипсис :)

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.