どうもkohaniiです。
aitendoのカテゴリを見ていると、マイコンの中に8051という項目があります。
なぜか8051カテゴリーには入っていませんが、STCMicro社のIntel 8051コアマイコンのSTC89C52RCが購入できます。
現在でもIntel 8051コアが入っているマイコンが製造されているそうです。
このマイコンは本家8051のバイナリと上位互換性があるようで、本家の80年代の仕様が一部引き継がれています。
1マシンサイクルは12/6クロック、パラレルでデータバスとアドレスバスが出て外部メモリ接続可能、
そしてなんといってもDIPパッケージがあることです。
STCのマイコンにはシリーズがありますが、中でもオリジナルに近い仕様の様です。(違うシリーズではADC搭載など)
現在のAVR megaシリーズなどと比べると性能は劣りますが、現在でも開発環境があり、歴史が長いので情報が多いのが利点でしょうか。
このマイコンをLCSCから購入してみました。
STC89C52RC
届いたマイコンです。
偽物感が強い気がしますが、これが本物です。
テストに使う回路です。ブレッドボードで組んでみました。
回路図のマイコンのピン配置はDIPパッケージのもので、LQFPパッケージなどでは異なります。
マイコンには内蔵クロックがないので、動作には外部クロックが必須です。とりあえず16MHzの水晶振動子を繋げておきました。
書き込みにはUARTを使います。
書き込み時は専用の内蔵クロックが使われる様です。
LEDの使い方や電源にスイッチが入っている理由は後述します。
開発環境
アセンブラには慣れていないので、C言語のコンパイラーを探すとSDCC - Small Device C Compilerというコンパイラーが見つかりました。
マルチプラットフォームでオープンソース、無料など これが良さそうです。
Macで開発したいので調べてみると、Homebrewで簡単にインストールできるようです。
Homebrewがインストールされた環境でターミナルに
brew install sdcc
と入力するだけでインストールできます。
そして書き込みソフトウェアです。
こちらもオープンソース、無料のstcgalというプログラムを見つけました。
このソフトはpython3で書かれていて、pythonが入っている環境のターミナルで
pip3 install stcgal
と入力するだけでインストールできます。
プログラム
プログラムはテキストエディタで書きました。
簡単なLチカプログラムです。"LedBlink.c"という名前で保存しました。
#include <8051.h> void delay(unsigned int length) { //forループを回して待つ for(unsigned int i = 0; i < length; i++) { } } void main() { P1 = 0xFF; // P1の全てのピンをプルアップ while(1) { if(P1 & 0x02) { // P1の1ピンがハイの間 P1 = 0xFE; // P1の0ピンをローに引っ張る それ以外のピンはプルアップ delay(30000); P1 = 0xFF; // P1の全てのピンをプルアップ delay(30000); } else { // P1の1ピンがローの間 P1 = 0xFF; // P1の全てのピンをプルアップ動作 } } }
ポート1の1ピンがハイの間、ポート1の0ピンをオンオフします。
ただし、このマイコンにはI/Oの入力と出力を切り替えるレジスタなどはありません。
ポート1の場合は、
P1レジスタのビットに1がセットされると。I/Oピンが2クロックだけハイが出力され、そのあとは弱くプルアップされます。
P1レジスタのビットに0がセットされている間は、I/Oピンがローに吸い込まれます。
なので入力として使う場合は、P1レジスタのビットに1をセットしておき、P1レジスタのビットを読みます。
そして出力の場合は吐き出しの電流がすごく少ないので、電流が必要な場合は吸い込みを使います。
コンパイル
これをコンパイルします。
ターミナルで以下を実行するとコンパイルできます。
sdcc --iram-size 256 --xram-size 1024 LedBlink.c
--verboseオプションをつけてコンパイルすると以下の様になります。
コンパイルすると以下のようにファイルがいろいろと生成されます。
.memファイルにはプログラムで使用されたROMのサイズとRAMのサイズがかかれています。
プログラムは158バイト使用された様です。
変数はCPUのレジスタで足りたようで、RAMは使用されていません。
.asmファイルにはコンパイルされたアセンブラが書かれています。
.ihxファイルにはマイコンに書き込むためのIntel HEX方式のテキストが書かれています。
書き込み
マイコンに5Vの電源とUSB シリアル変換したTX,RXを接続します。
USB シリアル変換のデバイス名を取得するためにターミナルで以下を実行します。
ls -1 /dev/tty.*
"/dev/tty.usbserial-2130"が認識されたデバイス名の様です。
デバイス名がわかったところで以下のコマンドで書き込みます。
stcgal --protocol stc89 --port /dev/tty.usbserial-2130 LedBlink.ihx
デバイスを指定するportオプション、ihxファイルは各自書き換えてください。
コマンドを実行すると、"Waiting for MCU, please cycle power:"と表示されます。
この状態でマイコンの電源をオフにしてからオンにすると書き込みが開始されます。
これで書き込みは完了です。
動いた!
書き込むと、LEDが点滅します。
スイッチを押している間はLEDが消灯します。
かなり簡単に8051コアマイコンを利用できました。
おわり
コメント