40年前の電子レンジまたはコントローラーのプログラミング

こんにちは、最近、私は誤ってそのような鉄片の手に落ちました:

画像



さて、鉄片と鉄片だと思いました...ボード上にPBE035マイクロコントローラー、IO m5l8243pエクスパンダー、RF5とコントローラーの間にIR12があり、LN1がどこかにハングアップしています。 私はすぐに、金色のソケットに収められた珍しい2Kb RF5 ROMが気に入った。 ボード全体が最も楽しいためにラッカー塗装されているので、私はそれを脱ぎ、残りは大胆に廃棄されると思います。



これは、ソビエトのマイクロ波タイプの電子機器23(別名BUVI-2、別名Fa​​iry、別名Dneprjanka)の制御ボードであることが判明しました。 デバイスダイアグラムでさえ、インターネット上ですぐに見つかりました ...そして、私は興味を持ち、ボードを注意深く見ました。 コントローラーがあれば、そのためのプログラムを作成できます。 ボードのすぐ上に、あらゆる種類の宣誓の呪い(BABA、SISI、よくわかります)を表示できる画面(4桁)があります。 また、圧電素子が残っているため、きしむことができます。 それ以外はすべて4x4キーボードに接続できます。 ある種の開発ボードであることがわかったので、嬉しかったです!



すでに述べたように、ボードにはPBE035コントローラーがあります。 ロシアでは、KR1816BE35という名前でよく知られていますが、一般に、それは偉大で恐ろしいIntel 8035 MSC-48シリーズです。 最初のコピーは、1976年、つまり約40年前に作成され始めました。 コントローラにはプログラム用の独自のメモリがないため、ROMを介してROMと通信し、そこから実行命令を読み取ります。 ただし、64バイトのRAMがあり、そのうち約32バイトは必要に応じて使用でき、残りはレジスタとスタック用です。 タイマーがあり、タイマーからの割り込みがあり、外部割り込みがあり、優先システムがあります。 要するに、通常の旧式のコントローラーであり、大胆なPICでさえありません。 ボルシェビキが長い間待っていたもの。 私はすぐに彼のために何かをコーディングしたかった。



しかし、最初に、ボードを接続するという1つの問題を解決する必要がありました。 図からわかるように、デジタル部品に電力を供給するのに+ 5Vだけが必要ですが、インジケータに電力を供給するには2.5Vと30Vの交流電圧が必要です。



ところで、インジケータについて-それはランプです! はい、温かいチューブランプがあり、ポップアップLEDはありません。 そして、ランプのように、陰極陽極とグリッドを持っています。 このタイプのインジケータは、発光真空インジケータと呼ばれます。 回路を少し考えてみると、30Vの変化がダイオードブリッジに流れることがわかりました。 そして、2.5Vでさえダイオードに送られ、その後、グリッドに送られます。つまり、ダイオードもまっすぐになります。 そのため、ボードを定電圧に接続してみることができます。 30Vの代わりに、2.5Vの代わりに12Vを印加し、標準のATX形式の電源から3.3Vを印加しました。 これを行うには、配線をボードにはんだ付けします。 次のようになりました。







しかし、ボードを起動すると、最初は失望しました。 ディスプレイ上の一部のセグメントが点灯しませんでした。 最初は12ボルトでは不十分だと思っていましたが、ボードの2か所でネプロペイを慎重に調べました。 私は電話した、私は姿を消した。 ボードが起動し、画面に数字が表示されて時間を設定し、プログラムモードを選択しました。 それで、私はそれを捨てたかったのですが、結局それを修正しました。 炒める時間です。



無料のクロスプラットフォームアセンブラAsm48を使用しました。 MacOS用のバージョンがあるのはクールです。明らかに著者はユーモアのセンスを奪われていないようです。少なくとも私は感謝しています。 それは、アセンブラをダウンロードすることを意味します。すべてが簡単です:ASM48 <filename.asm>最初にしたことは「LEDを点滅させる」ことでしたが、LEDの代わりに、スピーカー(圧電素子)の脚を延々とループで引っ張りました。 スピーカーは、最上位ビットであるポート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
      
      







プログラムをコンパイルし、ROM 2716のプログラマーにステッチした後、ボードを起動すると、約1秒間隔で定期的なクリック音が聞こえます。 うまくいく! 今、私はスクリーンに対処しなければなりませんでした。 図によると、ABCDEFGシンボルの「マスク」はポート1に接続されています。さらに、信号が反転します。つまり、1のとき-スティックがオフのとき、0がオンのときです。 文字「H」のマスクを設定するために、写真を見てみましょう。



ここではビットの逆順であるため、GからAへの文字のバイパスを開始します。Gが満たされ、次に1、 Fが塗りつぶされた後、1が描画されます。 Eが塗りつぶされ、次に1。 Dは塗りつぶされず、0などが続きます。 結果は1110110bです。 信号が反転していることを覚えているので、マスク自体を反転する必要があります:1110110b = 0001001bではありません。 または9時間。 この番号をポート1に送信して、レターのマスクを設定します。 キャラクターを選択するのがより難しい。 ここでは、動的な指示が適用されます。 要するに、エッセンスは、マスクを設定し、最初のキャラクターを照明し、マスクを設定し、2番目のキャラクターを照明するなど、常に必要であるという事実に要約されます。 2番目のポートは、m5l8243pマイクロチップの助けを借りて4つの4ビットポートに拡張されたシンボルの輝きを解決します。 これらのポートにアクセスするには、 MOVDコマンドを使用します。ポート自体にはP4、P5、P6、P7の番号が付けられます。 著者によると、P4はキーボードのスキャンを担当しますが、P5は表示する4文字の1つを設定するだけです。

画像

最初は、プログラムのメインループで動的な指示を作成しようとしましたが、そのためにタイマーを使用しました。 プログラムのメインサイクルでは、インジケーターバッファーが変更され、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
      
      







デバイスの短いビデオデモ:



好奇心ha盛なhabrayuzerは、ビデオの最後に、HELOの代わりに、必要なものがまったく表示されないバグに気付いたと思われます。 私も彼に気づいた、はい。 そしてすべては、メインプログラムで表示バッファへの転送があるときに、タイマーを停止するのを忘れていたためです。 copy_bufを呼び出す前に、DIS TCNTIを実行し、EN TCNTIを実行する必要があります。 それで!



今では、「クリスマスツリーが森に生まれた」というデバイスで遊ぶだけで、ミッションが正常に完了したと考えます。 すべてに良い!



文学:


1)MCS-48およびUPI-41アセンブラー言語マニュアル1976

2)2冊のShakhnovディレクトリ(マイクロプロセッサおよび集積回路のマイクロプロセッサセット)

3)Stashin V.V. et al。-シングルチップマイクロコントローラーでのデジタルデバイスの設計

4)サイン合成指標:ハンドブック/ Ed。 V.P.バラショバ

5)Bystrov Yu.A. インジケーター付き100チャート



All Articles