フォト
無料ブログはココログ

CPUボード

2017年11月 4日 (土)

秋葉で買い物 <千石も模様替え>

久々に秋月が開いている時間に秋葉に行ったので前から欲しかったものを買ってきた。

Lcmxo22561 Lcmxo2256
↑LCMXO2-256
LatticeのMachXO2の一番小さいやつ。Mico8が載りそうな気がする。

Tmp92mc22fg1 Tmp92mc22fg
↑TMP92CM22FGと変換基板

TMP92CM22FGは東芝のTLCS-900/H1シリーズのマイコン。

TLCS-900/H1売ってる!と思って思わず買ってしまった。QFP100の変換基板も買ってきたけど、最近はんだ付けしていないから腕がなまっているだろうな。

TLCS-900/H1はZ80ライクのTLCS-90を16ビット化したTLCS-900を32ビット化したもの。
キングジムのポメラに使われているらしい。(↑じゃないけど。)
面白そうなので、ヤフオクでポメラの中古を探したのだけれど高くて断念した。

Irmodule
↑赤外線受信モジュール。安くなったよね。

 ついでに千石にも寄ったら旧本店がなくなって隣り2店舗に変わっていた。
どこに何を売っているか分からなくなったので一通り回ってみた。
本店地下は旧本店のB1,2Fが合体したような感じ。

↓こんなのを売っていたので買ってきた。

Coil Coil1
↑角型コイル 400μHと800μHの2種類があったので、800μHの方を買ってきた。


最近の投稿】【最近のCPUボード】【2016の投稿】【2015の投稿

2017年10月 8日 (日)

STC12C2052(2) <8Queen問題>

aitendoで買ったSTCmicroのSTC12C2052でプログラミングできるようになったので、8Queen問題を解くプログラムを走らせてみた。

 以前作った8031SBC用に書いたソースを変更した。 (8Queen2011/09/15)
 8031(8051のROM無し)は内臓RAMが128byteしかないので、スタックを消費する再帰プログラムは厳しい。
 ↓オプション --idata_loc 0x0000 --idata_size 128(8031用)でコンパイルするとスタックは98byteとれた。

-- 8031; ---
Internal RAM layout:
      0 1 2 3 4 5 6 7 8 9 A B C D E F
0x00:|0|0|0|0|0|0|0|0|a|b|b|c|d|e|e| |
0x10:| | | | | | | | | | | | | | | | |
0x20:|T|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0x80:| | | | | | | | | | | | | | | | |
0x90:| | | | | | | | | | | | | | | | |
0xa0:| | | | | | | | | | | | | | | | |
0xb0:| | | | | | | | | | | | | | | | |
0xc0:| | | | | | | | | | | | | | | | |
0xd0:| | | | | | | | | | | | | | | | |
0xe0:| | | | | | | | | | | | | | | | |
0xf0:| | | | | | | | | | | | | | | | |
0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute

STC12C2052は256byteの内臓RAMが載っているので、オプション --idata_size 240でコンパイルするとスタックは192byte確保できている。(なぜ--idata_size 256で無いかは後で)

-- STC12C2052 ---
Internal RAM layout:       0 1 2 3 4 5 6 7 8 9 A B C D E F 0x00:|0|0|0|0|0|0|0|0|a|a|a|a|a|a|a|a| 0x10:|a|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b| 0x20:|b|b|b|b|b|b|b|b|b|c|d|d|e|Q|Q|Q| 0x30:|Q|Q|Q|Q|Q|S|S|S|S|S|S|S|S|S|S|S| 0x40:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0x50:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0x60:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0x70:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| 0xf0:| | | | | | | | | | | | | | | | | 0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute

 プログラム用のメモリが2kbyteしかないので、printf()は使えない。
↓実行結果

Stc12c2052_8q

 ところで、内蔵のR/C発振器でUARTを使おうとしたら、一発では動かない。ソースはそのままで動くと思っていた。

 通信速度の設定はTH1、TL1に設定する値で決まる。

   TH1 = TL1 = 256 - (クロック周波数 / 12 / 32 / 通信速度)

 SDCCのライブラリに autobaud()と言う関数がある。この関数を呼んでRxDにCR(0Dh)を送ると1byte(8bit)分の時間を測ってTH1、TL1レジスタを自動的に設定してくれるという便利な関数だ。 

 この関数を使ってみると、4,800bpsでは文字化けが多い、4,800bpsで動いていも次の日には文字化けが多くて使い物にならなくなる。確実に動かすには1,200bpsまで下げなければならない。

 TH1、TL1レジスタにセットされている値を表示させてみると大きい。 (TH1,TL1=FDh @4,800bps)
この値が大きいとズレが大きくなる。または正確なクロック周波数の発振器が必要だ。

 データーシートではクロック周波数は18.234MHzと書いてあることが多いので、R/C発振器の周波数も18.234MHzかと思っていた。 よく読むとそんなことは書いてない。

 データーシートに「R/C発振器の周波数を知る方法」が載っている。
電源ON直後、内蔵RAMのF8h~FBh、FCh~FFhを読むことで分かるのだそうだ。F8h~FBhに直前の設定値、FCh~FFhに工場出荷時の設定値が書かれている。この領域はRAMとして普通に使えるので当然データを書いたり読んだりできる。

 確認してみようと、この領域を読みだすと全て 00hだ。 (?_?

 SDCCはstart_up時にIDATA領域をクリアする。 (SDCC/lib/src/mcs51/crtclean.asm) つまり、IDATA領域の末尾の部分(F8h~FFh)も00hでクリアされているようだ。

 SDCCは --idata_loc と --idata_size オプションでIDATAのサイズと位置を指定できる。そこで、内蔵RAM(IDATA)は256byteあるけど --idata_size 240 とすると、F8h~FFhがクリアされなくなる。

 読んでみた。
Stc12c2052_freq  

 工場出荷時の設定値は 5,619776MHz、電源投入時の設定値は5,669,485MHzのようだ。

 よく見たら、stcgal.pyのメッセージで表示される値だ。



最近の投稿】【最近のCPUボード】【8031/8052 SBC】【2016の投稿】【2015の投稿

2017年9月24日 (日)

STC12C2052

aitendoSTCmicro Technologyのマイコンを売っている。 8051コアのCPUは特に珍しくもないのだが、前から気になっていたので買ってみた。

 どちらも、8051の上位コンパチでいろいろ拡張されている。

Stc12c2052_s

 STC12C2052は8051のSRAMを256byteにして、2kのフラッシュメモリを内蔵して、外部バス(AD0-7)とポート2(P2.0-7)を取って、SPI、I2C を付けたような感じだ。

 何と言っても安い100円。SBL(Serial Boot Loader)を持っているので、専用のプログラマがなくてもファームウェアを書くことができる。

Stc12le5604ad_s

 STC12LE5604ADは8051のSRAMを256byteにして、4kのフラッシュメモリ、256byteのRAMを内蔵して、外部バス(AD0-7)とポート2.6,P2.7を取って、A/D,SPI,PCA を付けたような感じだ。

 STC12C2052で遊んでみた。

コンパイラ

 SDCCが使えるので、F/W(ファームウエア)はCで書ける。
8051コンパチだからプロセッサオプションは -mmcs51でよい。include/mcs51/stc12.hに拡張されたレジスタが定義されている。

 コンパイルオプション、リンクオプションは↓

sdcc -o testuart.c.rel -I. -mmcs51 --model-small --no-xinit-opt -c test.c
sdcc -o test.ihx   -mmcs51 --model-small --code-loc 0x0000 --code-size 2048 \
     --idata-loc 0x0000  --iram-size 256  --out-fmt-ihx   test.c.rel obj

ライタ

 このMCUはPowerOnReset時にP1.0とP1.1がGNDに落ちていると。内蔵のISP monitorが走るので、ライタ用のハードウェアを用意しなくてもシリアル経由でプログラムを書き込むことができる。

 とはいえ、PC側のツールは必要だ。ネットを探すと、STCmicroからDLできるSTC-ISP.exeを使った説明が多いのだが、STC-ISP.exeは一部のワクチンソフトに引っかかるらしい。 他のツールを探すと stcgalが見付かった。

 stcgal (https://github.com/grigorig/stcgal)はpythonで書かれていてver3.2以降のpythonが必要らしい。Windowsでpythonを使うにはいくつか方法がある。

  1. Windows版のpythonを使う
  2. Cygwinのpythonを使う
  3. Bash On Windowsのpythonをつかう

1と2は使えることを確認した。3はシリアルデバイス(ttyS?)が見えない。

シリアルポート
 stcgalは/dev/ttyUSB0をデフォルトで使うので、ポートを指定しなければならない。
  1. Windows版のpythonは
    C:> python stcgal.py -p COMx 
    COMxはデバイスマネジャーで探す。
  2. Cgywinのpythonは
    $ python -p /dev/ttySx  
    ttySxは ls /dev で探す
ISP確認

 データシートの「1.6 STC12C2052AD series MCU Typical Application Circuit for ISP」にある回路図は、X'talとRST(Pin1)にCRが繋がっている。STC12C2052はR/C発信器を内蔵しているので、外付けX'talは接続しなくてよいようだ。また、RSTのCRも接続しなくてもよいようだ。

↓手前の青白ジャンパーはシリアル、奥側の白ジャンパー×2はP10,P11をGNDに接続、左側の赤ジャンパーは電源(未接続状態)

Stc12c2052_s

 ISPの手順は↓のとおり。

  1. GNDだけ接続。(VCCはまだ接続しない)
  2. STC12C2052のP3.0/RxD、P3.1/TxDをパソコンのシリアルに接
  3. STC12C2052のP1.0とP1.1をGNDに接続
  4. stcgal.py -p /dev/ttyS2  ←stcgal実行
  5. "Waiting for MCU, please cycle power:" ←が表示される。
  6. 電源投入(VCC接続)
  7. ↓のようなメッセージが表示される

$  ~/stcgal/stcgal.py  -p /dev/ttyS2
Waiting for MCU, please cycle power: done   
Protocol detected: stc12a
Target model:
  Name: STC12C2052
  Magic: F202
  Code flash: 2.0 KB
  EEPROM flash: 4.0 KB
Target frequency: 5.654 MHz
Target BSL version: 5.8D
Target options:
  low_voltage_reset=low
  clock_source=internal
  watchdog_por_enabled=False
  watchdog_stop_idle=False
  watchdog_prescale=256
  eeprom_erase_enabled=False
  bsl_pindetect_enabled=False
Disconnected!

 電源を接続しても "Waiting for MCU, please cycle power:" から進まないときは、一旦電源を切断して電源を接続しなおす。 タイミングがあるようで、1回で良い場合もあるし何度も接続しなおさなけば進まないいこともある。

Lチカ

書き込んだプログラムが動くか、Lチカで確認してみた。

$ stcgal -p /dev/ttyS2 testled.hex
Waiting for MCU, please cycle power: done
Protocol detected: stc12a
Target model:
  Name: STC12C2052
  Magic: F202
  Code flash: 2.0 KB
  EEPROM flash: 4.0 KB
Target frequency: 5.627 MHz
Target BSL version: 5.8D
Target options:
  low_voltage_reset=low
  clock_source=internal
  watchdog_por_enabled=False
  watchdog_stop_idle=False
  watchdog_prescale=256
  eeprom_erase_enabled=False
  bsl_pindetect_enabled=False
Loading flash: 807 bytes (Intel HEX)
Switching to 19200 baud: checking setting testing done 
Erasing 4 blocks: done
Writing 1024 bytes: ........ done
Setting options: done
Disconnected!

Lchika
↑リンク先に STC12C2052_Lchika.avi (1189.7K)


最近の投稿】【最近のCPUボード】【2016の投稿】【2015の投稿

2017年8月14日 (月)

赤外線送受信モジュール

 勉強会でaitendoの赤外線送受信モジュール[M1838-NEC-4P]の話題が出た。

 受信はできるけど送信できないらしい。興味がわいたので注文した。

 届く前に素性を調べてみた。aitendoには、このモジュールの素性は詳しく書かれていない。

 ぐーぐる先生に「ir receiver transmitter module」で尋ねてみると、同じ製品がたくさん引っかかる。

 aliexpressでは送料無料で $1.60で売っていたりする。

 使用されているIC(16pinSOP)の型番は見えないけれど、(http://www.valuehobby.com/nec-infrared-receiver-transmitter-encode-decode-module-for-arduino.html)には回路図もある。

 使われているICはSTC11F02Eらしい。(http://www.uctronics.com/infrared-remote-ir-decoder-encoding-transmitter-receiver-wireless-module-nec.html)の画像を見ると、 たしかに、STC11F02E と読める。

 STC11F02Eは STCが売ってるi8052コンパチのCPUらしく、専用チップではないらしい。
どおりでチップの情報が見つからないはずだ。

 このサイト(http://www.uctronics.com/download/U3107_Infrared_decoding_module.zip)にはマニュアルもあるのだが、「NOTE:There is only Chinese Manual.」だって。

 簡単なマニュアルだから、ぐーぐる先生に翻訳してもらうと大体わかる。

 NECフォーマット専用のようだから、家電を制御しようとすると動かないものがあるということか。

 バイナリデータが送信できるターミナルソフトがあればテストできそうだ。


最近の投稿

2016年10月23日 (日)

FON2100EでOpenWrt 

FON2100EにOpenWrtをインストールしてレピータとして使う。

OpenWrtのインストールは→「FON2100EでOpenWRT」(2016/10/17)

設定はOpenWrtのサイトの「 Routed Client with relayd (Pseudobridge) 」(https://wiki.openwrt.org/doc/recipes/relayclient)を参考にした。


(https://wiki.openwrt.org/_media/doc/howto/802.11-routed-relay.png)

この設定は、WANに繋がっているAP(192.168.1.1)のクライアント(192.168.1.30)として動きながら同時にAPを起動して、クライアントとAPをrelaydで中継するというしかけだ。

 右側のAP(192.168.1.1)でDHCPが動いているなら、左側のエリアでも左側のAPを経由して右側のAP(192.168.1.1)からDHCPでIPアドレスが貰える。

 このページには、uciコマンドと設定ファイルの記述が公開されている。 オヤジは自分で設定ファイルを編集しないと安心できないので、/etc/config以下の設定ファイルを直接書き換えた。

 途中で引っ掛かったのは、

/etc/init.d/relayd enable

/etc/init.d/relayd が無い!と怒られる。

relaydは 解説どおり

opkg update
opkg install relayd

でインストールした。/etc/init.dを見ると本当にrelaydが無い。(当然)
その他のファイルはちゃんとインストールされていた。

 OpenWrtの掲示板に、
10.03.01 on WNDR3700: /etc/init.d/relayd doesn't exist」(https://forum.openwrt.org/viewtopic.php?id=40925)
というエントリがある。同じ問題で困っている人がいるもんだ。

 この質問に対しては、「relaydをインストールしていないと、有るわけね~だろ。何考えてんだ!!」的な回答だ。どこの国にも 2ch的な人はいるもんだ。

 それはさておき、Ver10.03.01にはこのファイルが無いらしいので、OpenWrtのサイトからソースファイル(https://dev.openwrt.org/browser/trunk/package/network/services/relayd/files/relay.init)を/etc/init.d/relaydという名前で保存した。

 速度は思ったほど遅くない。1人で使っているし動画を見るわけではないので、十分使える。firewallを止めるともう少し早くなるかもしれない。

###
 今時は、RaspberryPiを使うんだろうな。 そういえば買ったまま仕舞い込んでいるPi1 BもPi2 Bもある。

 FON2100EはMIPS32 184MHz メモリ16Mだけど、RPi1 BでもARM11 700MHz メモリ512Mだからレピータに使うにはオーバースペックかな。、RPi2 BはCortex-A7 900MHz QuadCore メモリ1Gだからもったいない。

 おまけに、FON2022(USB2.0付)もあったよなぁ...


最近の投稿】【最近のCPUボード


2016年10月17日 (月)

FON2100EでOpenWRT

 昔買ってしまいこんでいたFON2100E。1,980円のFONルータをAPにするのが流行ったときに買った。

Fon2100e

 なぜ今更取り出してきたかというと、大きな家ではないのに作業机がある部屋で無線LANの電界が低く、頻繁にリンクが切れるのでFONをレピータにしようという算段だ。FON用のOpenWRTが公開されているので、F/Wを書き換えれば無線LANルータとして使える。

 当時はFON2100Eはケースを開けてシリアル経由でないとF/Wが書き換えられなかった。SD-RAMを取り替えてメモリを増やしたり、SDカードを搭載する改造もあった。

 そのうちと思っているうちに、違うことに興味が移って、しまい込んでいた。(よくあるパターンだ)

 久しぶりに調べてみるとシリアル経由でなくてもSSHで書き換えられるらしい。ということでOpenWRTをインストールしてみることにした。

 メモリは増やしていないので最新版Ver12は使えなくて、Ver10までしか使えないらしい。書き換える方法は、ググるとたくさん見つかる。

 OpenWRTをインストールするとtelnetでログインできて、パスワードを設定するとSSHしかログインできなくなる。

↓ログイン画面。 中身はLinuxでashが使えるので困らない。

yoshi@KYORO:~$ ssh root@192.168.1.1
root@192.168.1.1's password:


BusyBox v1.15.3 (2011-11-24 02:38:24 CET) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 Backfire (10.03.1, r29592) ------------------------
  * 1/3 shot Kahlua    In a shot glass, layer Kahlua
  * 1/3 shot Bailey's  on the bottom, then Bailey's,
  * 1/3 shot Vodka     then Vodka.
 ---------------------------------------------------
root@OpenWrt:~#

と思っていたら。なんとWebインタフェースのGUIで設定ができるらしい。

Openwrt

便利になったもんだと思ったが、設定がどこに反映されるか分からない。uciコマンドを使うと/etc/config/下のファイルが設定できるCUIインタフェースもあるようだ。

 でも、オヤジは設定ファイルを直接編集しないと安心できなかったりする...

 設定は、OpenWRTのサイトのRouted Client with relayd (Pseudobridge) (https://wiki.openwrt.org/doc/recipes/relayclient)を参考に設定すればよさそうだ。


最近の投稿】【最近のCPUボード

2016年3月31日 (木)

X-NUCLEO <キャンペーンに弱い>

ChipOneStopからDMが来た。

STマイコン開発ボード、期間限定プレゼント中! らしく、 X-Nucleoを買うとSTM32Nucleoがもらえるという。

もらえるSTM32Nucleo(NUCLEO-F401RE)は、STのCortex-M4が載った安価な開発ボードで(秋月では1,500円) 、ボードには、LEDとスイッチしか載っていないけど、Arduinoコンパチのコネクタが載っているので、Arduino用のシールドで拡張できる。

X-NULEOはSTM32Nucleo用のシールド(Arduinoピンコンパチ)でセンサーやBluetooth、モータドライバなど色々なモジュールが載った製品がある。

今回のキャンペーンは、これらの拡張用シールドをどれか一つ買うと、STM32Nucleo(マイコンボード)をくれるというものだ。

はっきり言ってキャンペーンには弱い!!。
しかも3/31までというので、安価なボードを買ってみることにした。 BLEが載った、X-NUCLEO-IDB04A1が1,980円だったので買っみた。 1,980円のシールドを買って、1,500円のマイコンボードがオマケって、STは太っ腹だ。

Xnucleoidb04a11

BLEチップ BLUENRG 311円

Bluenrg78a4k

ところが、NUCLEO-F401RE が入ってない。 オマケで付くんじゃないのか?

キャンペーンのページには

本キャンペーンは、予定数を完了した場合や、その他の事情により予告なく終了する場合があります。

と書いてある。だったらDMなんかばら撒くなよ!!

ということで、メールしておいたら返信があった。やっぱり、メーカの在庫切れらしい。

でも、あとから送ってくれるそうだ。ヨカッタ。

2015年11月17日 (火)

IchigoJam(10) <8x8LEDを光センサーにする>

 飽きもしないでIchigoJamと8x8マトリクスLEDで遊んでいる。

 一度試してみようと思いながら先送りしていた、LEDを光センサーとして使うアイディアを試してみた。このアイディアをは古くからあって、初めて読んだのはエレクトロニクスライフと記憶している。

 その他にも

に実装例がある。

 IchigoJamはVer1.1b5から、ポートの出力、入力を切り替えられるようになったので、IchigoJamと8X8マトリクスLEDでやってみた。 IchigoJam(8) <8x8LED>IchigoJam(9) <8x8LEDで8Qeen問題>で使用したハードウェア使う。

 表示しながら、LEDをスイッチ代わりに使える。(はずだ。)

Ichigo8x8sensor

基本動作は

OUT 1,-1 : '入力ポートに切り替える
A=ANA(5): '電圧を読む
OUT 1,0   : '出力ポートに切り替える

で、光が当たっているときと指で光を遮ったときで読み取った電圧に差が生じるはずである。

↓のようなプログラムを作って試してみると、ちゃんと変化が読み取れた。

1 'Nov.2015/Yoshi
1 'LED Senser Test
10 GOSUB 1000

100 FOR P=1 TO 2
110  M=#7FFF: X=0
120  A=0: OUT P,-1: FOR I=0 TO 19: [I]=ANA(P+4): NEXT
130  FOR I=0 TO 19
140   IF [I]<M M=[I]
150   IF X<[I] X=[I]
160   A=A+[I]
170  NEXT
180  ?"ANA(";P+4;") MIN:";M,"MAX:";X,"AVE:";A/20
190 NEXT
199 END

1000 'Initialize
1000 VIDEO 0
1020 OUT 8,0: OUT 9,0: OUT 10,0: OUT 11,0
1100 RETURN
list

run
ANA(5) MIN:57   MAX:78  AVE:65   
ANA(6) MIN:48   MAX:84  AVE:63

run
ANA(5) MIN:0    MAX:18  AVE:3
ANA(6) MIN:0    MAX:35  AVE:10

run
ANA(5) MIN:2    MAX:34  AVE:18
ANA(6) MIN:22   MAX:77  AVE:44

上から

  • 隠していない状態(8個のLEDに光が当たっている)
  • 全て隠した状態(8個のLEDに光が当たっていない)
  • 半分隠した状態(4個のLEDに光が当たっている)

 マトリクスLEDは1列のLEDのアノード側が繋がっているので、隠したLEDの数によって電圧に差が出ている。 IchigoJamの速度では隠した列の判定はできるが、座標まで特定するのは難しそうだ。

 ということで、指で触れると表示がカウントアップするプログラムを書いてみた。

1 'Nov.2015/Yoshi
1 'LED Senser Demo
10 GOSUB 500

100 'Main loop
100 I=(I+1)&7: OUT (I<<8)|[I+C]: GOSUB P: GOTO 100

200 '
200 OUT 1,-1: L=L+ANA(5): OUT 1,0: IF J=7 GOTO 280
201 GOTO 290
210 OUT 2,-1: R=R+ANA(6): OUT 2,0: IF J=15 GOTO 280
211 GOTO 290
220 L=L>>3: R=R>>3: IF D=1 GSB 700
221 GOTO 280
230 IF L<T AND U<R C=(C+8)%80: GOTO 270
231 GOTO 280
240 IF T<L AND R<U C=(C+72)%80: GOTO 270
241 GOTO 280
250 J=J+1: IF J<100 RTN
260 J=0: L=0: R=0: P=200: RTN
270 P=250: BEEP: RTN
280 P=P+10
290 J=J+1: RTN

500 'Initialize
500 VIDEO 0: FOR I=8 TO 11: OUT I,0: NEXT: CLV: P=200
510 D=1: T=55: U=40
510 T=55: U=40

600 'bit pattern
600 LET[0],#00,#3C,#E4,#EC,#F4,#E4,#E4,#3C
610 LET[8],#00,#18,#18,#38,#18,#18,#18,#FC
620 LET[16],#00,#3C,#E4,#84,#0C,#30,#60,#FC
630 LET[24],#00,#3C,#E4,#84,#1C,#84,#E4,#3C
640 LET[32],#00,#0C,#1C,#3C,#4C,#FC,#0C,#0C
650 LET[40],#00,#FC,#60,#7C,#84,#84,#E4,#3C
660 LET[48],#00,#3C,#E4,#60,#7C,#E4,#E4,#3C
670 LET[56],#00,#FC,#E4,#0C,#18,#18,#18,#18
680 LET[64],#00,#3C,#E4,#E4,#3C,#E4,#E4,#3C
690 LET[72],#00,#3C,#E4,#E4,#BC,#84,#E4,#3C
699 RETURN

700 'debug
700 ?"L:";L,"R:";R: RTN
list

 8x8LEDの両端の列を表示用兼光センサとして使っている。片方の端はOUT 1に繋がっているのでOUT 1、ANA(5)で使える。もう片方の列は OUT 8に繋がっているので ANA(1)で使えるのかと思ったが使えないようなので、OUT 2とOUT 8を入れ替えている。

 数字を表示する合間にLEDの電圧を読んでいる。ばらつきがあるので8回読んで平均を取るようにした。

 510行目のTとUが閾値だ。D=1を指定すると、電圧を表示するので、ちゃんと動くようにTとUの値を指定しなければならない。(VIDEO 0なのでシリアルで確認する)

Ichigo8x8sensor_2
ダウンロード Ichigo8x8Sensor1M.avi (981.6K)

 LEDを光センサとして使っているので周囲の明るさで読み取る電圧が変化する。ちゃんと使えるようにするには周囲の明るさに合わせて閾値を自動的に変化させる工夫が必要だ。


2015年11月10日 (火)

IchigoJam(9) <8x8LEDで8Qeen問題>

IchigoJamだけで8x8マトリクスLEDが表示できるようになった(IchigoJam,(8) <8x8LED>(2015/10/))
BASICではダイナミック表示に必要な処理速度が足りないようで、スクロールさせるだけでもチラつきがある。

 ダイナミック表示+何かの処理ができると簡単なゲームならIchigoJamだけでできるのではないかと考え、8Queen問題を解きながら8x8LEDのダイナミック表示ができるかやってみた。

 8Qeen問題はチェス盤(8x8)の上にQueen(将棋の飛車と角を合わせた動きができる駒)を、互いに進路を邪魔しないように配置する問題だ。これを解くプログラムをFORループで書くとこんな感じだ。→(IchigoJam BASICのFOR/NEXT(2)(2015/04/07))

 FORループの中でLEDの表示(OUT xx)を行うと、処理によってOUT命令の間隔が変わるのでチラつきが激しくなるだろう。

 そこで、考え方を変えて、8Queenを解くルーチンを分割して、メインループ(100行)でLEDの表示を行い、合間に分割したルーチンを順次呼び出す方式にした。

1 '8Queen for IchigoJam 
2 'Oct. 2015/Yoshi
3 GOSUB 1000

100 'Main loop
100 N=(N+1)&7: OUT (N<<8)|[N]: GOSUB P: GOTO 100

200 IF [I]=X GOTO 420 ELSE GOTO 410
210 IF [I]=X>>(Y-I) GOTO 420 ELSE GOTO 410
220 IF [I]=X<<(Y-I) GOTO 420 ELSE GOTO 410
230 'CHK OK
230 I=I+1: IF I<Y GOTO 400 ELSE GOTO 410
240 X=1: I=0: GOTO 410
250 Y=Y+1: [Y]=X: IF Y=8 GOTO 430 ELSE GOTO 400
260 'CHK NG
260 X=X<<1: IF X=#100 [Y]=0: Y=Y-1: X=[Y]: RETURN ELSE GOTO 410
270 [Y]=X: I=0: GOTO 400

400 P=200: RETURN
410 P=P+10: RETURN
420 P=260: RETURN
430 P=430: IF BTN()=1 Y=7: GOTO 420 ELSE RETURN

900 'Print table
900 PRINT
910 FOR J=0 TO 7
920  FOR K=0 TO 7
930   IF [J]&(1<<K)=0 ?" "; ELSE ?"Q";
940   ?"|";
950  NEXT: ?
960 NEXT
970 RETURN

1000 'Initialize
1000 OUT 8,0: OUT 9,0: OUT 10,0: OUT 11,0
1010 VIDEO 0: CLV
1020 [0]=1
1030 Y=0: X=1: I=0: N=0: R=0: P=250
1100 RETURN
list

 8Queenを解くルーチン(200行~270行)は、駒を置こうとする座標(X,Y) 既に置いた駒が進路にあるかを調べている行(I)、置けるか置けないかの判定(R)によって処理が決まるので、X,Y,I,Rを保存してあれば処理を分割することが可能だ。

 メインループ(100行目)の(GOSUB P)で分割している処理を順次呼び出す。分割された処理からRETURNする前に、次に呼び出す行番号を更新している。

Ichigo8x88q千石の袋はフィルタ代わり(^^;
リンク先に(Ichigo8x88Q.avi (2,031KB)) サイト外に接続します


2015年11月 4日 (水)

IchigoJam(8) <8x8LED>

IchigoJamだけでダイナミック表示ができたので8x8マトリクスLEDを点けてみた。

Ichigo8x8led

 IchigoJamの出力ポートはOUT1~OUT11の11本しかないので、OUT1~OUT8をマトリクスLEDのR1~R8に接続して、カラム側は74HC138(3-8Decoder)を使ってOUT9~OUT11でC1~C8をドライブする。R1~R8は0Ωに(直結)した。LEDが転倒する数によって明るさが違う。

 C1~C7を駆動する74HC138の出力は負論理なので、例えば入力が"101"ならば出力Y4に"L"が出力される。したがってR1~R7は正論理で駆動すればよい。

 例えば、2列目に「○●○●●○●○」(C1→C8、○ON、●OFF)のパターンを表示する場合、OUT #2A5 とする。

 とりあえずテストプログラムを書いてみた。4つのパターンで点灯する。

  1. 順に点灯
  2. 渦巻き
  3. ランダム
  4. 反射

1 '8x8LED TEST
10 GOSUB 1000
20 GOSUB 100: GOSUB 200: GOSUB 300: GOSUB 400
30 FOR Z=0 TO 4
40  R=RND(4): R=(R+1)*100: GOSUB R
50 NEXT
90 END

100 'ALL LED ZigZag
100 FOR Y=0 TO 7
110  IF Y%2=0 T=0: E=7: S=1 ELSE T=7: E=0: S=-1
120  FOR X=T TO E STEP S
130   GOSUB 900
140  NEXT
150 NEXT
160 RETURN

200 'Spilal
200 X=0:
210 FOR A=0 TO 3: B=7-A
220  FOR Y=A TO B: GOSUB 900: NEXT
230  FOR X=X+1 TO B : GOSUB 900: NEXT
240  FOR Y=Y-1 TO A STEP -1: GOSUB 900: NEXT
250  IF A<3 FOR X=X-1 TO A+1 STEP -1: GOSUB 900: NEXT
260 NEXT 
270 RETURN

300 'Random
300 FOR P=0 TO 63
310  R=RND(63): Y=R/8: X=R%8: GOSUB 900
320 NEXT
330 RETURN

400 'Reflect
400 A=1: B=2: X=3: Y=4
410 FOR P=0 TO 63
420  GOSUB 900
430  X=X+A: Y=Y+B
440  IF X<0 X=0: A=RND(2): A=A+1: GOTO 460
450  IF 7<X X=7: A=-A
460  IF Y<0 Y=0: B=RND(2): B=B+1: GOTO 480
470  IF 7<Y Y=7: B=-B
480 NEXT
490 RETURN

900 'LED(X,Y) ON
900 OUT (X<<8)|(1<<Y): WAIT 5: RETURN

1000 'Initialize
1000 FOR I=8 TO 11: OUT I,0: NEXT
1100 RETURN
LIST

Ichigo8x8ledtest
↑リンク先に Ichigo8x8LEDtest.avi (999.2K)

↑はLEDの同時点灯数1個だから簡単だ。結構簡単にできたので 気をよくして、パターンを表示させてみた。

1 '8x8LED display
2 'NOV. 2015/ Yoshi
10 GOSUB 1000: GOSUB 1200

100 'Main loop
100 I=I+1: J=(I&7): D=(I&T)>>5: OUT (J<<8)|[D+J]: IF I&#1FF=0 GOSUB 500
110 GOTO 100

500 'button
500 IF BTN()=0 B=0: RETURN
510 'ELSE
510  P=P+1: IF P=2 P=0
520  IF P=0 T=#3E0: GOTO 540
530  IF P=1 T=#700: GOTO 540
540  IF B=0 B=1: BEEP: ELSE END
550 RETURN

1000 'Initialize
1000 CLV: VIDEO 0
1010 V=60: N=V: P=1: S=0: T=#700
1020 OUT 8,0: OUT 9,0: OUT 10,0: OUT 11,0
1030 CLT
1100 RETURN

1200 'Bit pattern
1200 LET [0],#00,#03,#0F,#1C,#F8,#F0,#0C,#03
1210 LET [8],#00,#3C,#7E,#FF,#81,#C3,#7E,#3C
1220 LET [16],#00,#46,#8F,#9F,#B9,#F9,#F1,#62
1230 LET [24],#00,#FF,#FF,#FF,#18,#18,#FF,#FF
1240 LET [32],#00,#00,#81,#FF,#FF,#FF,#81,#00
1250 LET [40],#00,#88,#58,#7C,#3F,#7C,#58,#88
1300 RETURN
LIST

1200行から1250行までが表示パターン。

例えば、1200行は、配列[0]~[7]に"Y"のパターンを格納している。

[0][1][2][3][4][5][6][7]
・ ○ ○ ・ ・ ・ ・ ○ 01h
・ ○ ○ ・ ・ ・ ・ ○ 02h
・ ・ ○ ○ ・ ・ ○ ・ 04h
・ ・ ○ ○ ○ ・ ○ ・ 08h
・ ・ ・ ○ ○ ○ ・ ・ 10h
・ ・ ・ ・ ○ ○ ・ ・ 20h
・ ・ ・ ・ ○ ○ ・ ・ 30h
・ ・ ・ ・ ○ ○ ・ ・ 40h
00 03 0F 1C F8 F0 0C 03

のように格納してある。

 メインループ(100行110行)を、どれだけ速く書くかでチラつきかたが変わってくる。(もう少し速くなるかも) 効果があるのは行数を減らすことだった。

Ichigo8x8leddisp
↑リンク先に Ichigo8x8LEDdisp.avi (900.5K)

 さすがにチラつくなあ。ビデオではわからないけどLEDの点灯数で明るさが違うのが、はっきり分かる。

メインループを早くするアイディア

  • 74HC138(3-8Decoder)でなく74HC4017(JohnsonCounter)を使う
  • 配列アクセスをPOKEに変える

くらいかなあ。

 タイマー割り込みが欲しい。


より以前の記事一覧