LoginSignup
0
0

【MSX0】BLINK.PAS【Turbo Pascal】

Last updated at Posted at 2024-01-20

はじめに

Seeed 社の 『Grove Beginner Kit for Arduino』 のセンサーのうち、MSX0 の IoT BASIC のサンプルがないものを『Turbo Pascal』で動作させてみます。

BLINK

LED [D4] を点滅させます。いわゆる L チカです。

MSX0 Stack での挙動

まず事前にモジュールをつないでおきます。MSX0 側は Port B (黒) に接続します。

image.png

センサー 接続方法 Grove ポート
[D4] LED Digital Port B (黒色)

左上のモジュールが LED です。黄色の部品は半固定抵抗で、LED の輝度を調整するものです。

image.png

GROVE ケーブルの修正 (クロスケーブルの作成)

MSX0 で L チカをするためには、GROVE ケーブルの黄色と白の線を入れ替える必要があります。

image.png

マイナスの精密ドライバー (100 均で買えます) でコネクタのツメを持ち上げながら線を引っ張ると、ピンを抜く事ができます。

image.png

Grove ケーブルの片方のコネクタの黄色と白の線を入れ替えてください。奥までカチっと差し込んで、線を軽く引っ張って抜けなければ OK です。ツメを持ち上げすぎるとコネクタが破損しますので注意してください。

ピン ケーブル モジュール Port B
1 SIG I
2 NC O
3 VCC V
4 GND G

モジュールの LED は Pin1 (外側: 黄色) に接続されていますが、MSX0 Stack Port B の出力ピンは Pin2 (内側: 白色) となっているため、線を入れ替える必要があります。

image.png

付属の Grove ケーブルを 1, 2 本、クロス接続にしておくとよいでしょう。コネクタを任意の色のマーカーペンで着色しておくと誤接続防止になります。

See also:

MSX-BASIC のコード

MSX-BASIC での Lチカについては HRA! さんの資料 (6.3. L チカ) を参考にしてください。

Turbo Pascal のコード

別途、SYSUTILS.LIBIOT.LIB が必要です。

BLINK.PAS
program BLINK;
type
  LibStr = string[80];
{$I SYSUTILS.LIB}
{$I IOT.LIB}
begin
  while not KeyPressed do
  begin
    IoTPutInt('device/analog/out', 4095);
    Delay(894);
    IoTPutInt('device/analog/out', 0);
    Delay(894);
  end;
end.

実行すると LED が 1 秒おきに点灯と消灯を繰り返します。

任意のキーで中断できます。

解説

IoTPutInt()

普通、L チカと言ったら Digital ピンで ON / OFF するものですが、MSX0 にはデジタル入出力用の IoT ノードが用意されていないので、アナログ出力用の IoT ノード (device/analog/out) で代用します。MSX0 の仕様によるとアナログ出力は 12bit なので、0..4095 の値をとります。ON (4095) / OFF (0) を繰り返し行う事で LED を点滅させます。

Delay()

本来は 1000 で 1 秒なのですが、Turbo Pascal の TINST では動作周波数を整数でしか入力できないので、4 MHz にするのが MSX の動作周波数 3.579545 MHz に最も近くなります。

LED を 1 秒おきで点灯 / 消灯するには、この誤差を修正する必要があります。Delay() の引数である 894 という値は 3.579545 / 4 * 1000 から来ています。1 カウントは 1/1000 秒 (1 ミリ秒) です。

See also:

Turbo Pascal のコード (その2)

もう一つ L チカのプログラムです。別途、MDLLIB.LIBSYSUTILS.LIBIOT.LIB が必要です。

BLINK2.PAS
program BLINK2;
{$I MDLLIB.LIB}
{$I SYSUTILS.LIB}
{$I IOT.LIB}
begin
  while not KeyPressed do
  begin
    sys_timer := 0;
    IoTPutInt('device/analog/out', 4095);
    while sys_timer < 60 do
      ;
    sys_timer := 0;
    IoTPutInt('device/analog/out', 0);
    while sys_timer < 60 do
      ;
  end;
end.

解説

sys_timer

MSX のタイマーを使って 1 秒を測定しています。sys_timer はワークエリアの FC9E (JIFFY) です。使い方は BASIC の TIME システム変数と同じで、1 カウントは 1/60 秒です。

おわりに

L チカは難しくありませんね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0