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

MyList

CPUボード

2025年2月 9日 (日)

CH559picoでTOYOSHIKI-BASIC (2)

CH559picoをCH55xduinoで豊四季BASICを実装したら何か変なので調べてみた。
実行したプログラムは、8Qeen問題を解くプログラム↓
豊四季BASICはtiny-basicだから WHILE が無いので IF と GOTO でループしている。
昔はこんな書き方だったよなぁ...


1  REM 8Qreen
10 T=(1=1); F=(1=2)
20 D=F
30 N=1
40 FOR I=1 TO 8; @(I)=0; NEXT I
50 X=1;Y=2;@(1)=1
100 REM
100 GOSUB 2000; REM Check
110 REM if C=T then
110 IF C=F GOTO 140
120   @(Y)=X; Y=Y+1; X=1
130   REM if Y=9 goub PrintTable
130   IF Y=9 GOSUB 3000
140   REM if C#F endif
140   IF C#F GOTO 190
150   X=X+1
160   IF X=9 Y=Y-1; X=@(Y)+1; @(Y)=0
170   IF X=9 Y=Y-1; X=@(Y)+1; @(Y)=0
180   IF Y=0 GOTO 210; REM End
190   REM EndIf
190   IF D GOSUB 3000
200 GOTO 100
210 REM END
210 STOP

2000 REM
2010 IF Y=9 C=F; RETURN
2020 C=T
2030 FOR L=1 TO Y-1
2040   IF @(L)=X C=F
2050   IF @(L)-X=Y-L C=F
2060   IF X-@(L)=Y-L C=F
2070   IF D PRINT "X=",X," Y=",Y," @(",L,")=",@(L)," C=",C
2080   IF C=F L=Y-1
2090   NEXT L
2100   IF D PRINT "< ",X,",",Y,":",C
2110 RETURN

3000 REM
3010 PRINT "--- ",N," ---",
3020 IF D PRINT X,",",Y,
3030 PRINT
3040 FOR L=1 TO 8
3050   FOR M=1 TO 8
3060     REM IF Y#L then
3060     IF Y=L GOTO 3090
3070       IF @(L)=M PRINT "|Q",
3080       IF @(L)#M PRINT "| ",
3090     REM else
3090       IF Y#L GOTO 3120
3100       IF X=M PRINT "|-",
3110       IF X#M PRINT "| ",
3120     REM EndIf
3120   NEXT M
3130   PRINT "|"
3140 NEXT L
3150 PRINT
3160 IF D INPUT A
3170 N=N+1
3180 RETURN


2060 IF X-@(L)=Y-L C=F

この行は必ず Flaseになる?
豊四季BASIC linux版で↑のソースを動かすと正常に動く。

PEEK() 関数を実装して中間言語バッファをダンプしたら中間言語は正しく変化されているようだった。

1 PRINT REM ABC
2 PRINT I-@(J)

00 0B 01 00 08 05 22 41 42 43 22 2A 0D 02 00 0B
28 08 14 20 18 28 09 19 2A 17 28 00 0A 29 0E 53


bacic.cppのipuluse()の戻り値 value の値がおかしいことが判った。
5行目の imul(),20行目の imul()の戻り値は正しいが、25行目で 0を返してしまう?

 1: // add or subtract calculation
 2: short iplus() {
 3: short value, tmp; //値と演算値
 4:
 5: 
value = imul(); //値を取得
 6: if (err) //もしエラーが生じたら
 7:   return -1; //終了
 8:
 9: while (1) //無限に繰り返す
10:  switch(*cip){ //中間コードで分岐
11: 
12:   case I_PLUS: //足し算の場合
13:     cip++; //中間コードポインタを次へ進める
14:     tmp = imul(); //演算値を取得
15:     value += tmp; //足し算を実行
16:     break; //ここで打ち切る
17: 
18:  case I_MINUS: //引き算の場合
19:    cip++; //中間コードポインタを次へ進める
20:    tmp = imul(); //演算値を取得
21:    value -= tmp; //引き算を実行
22:    break; //ここで打ち切る
23:    
24:  default: //以上のいずれにも該当しなかった場合
25:     return value; //値を持ち帰る
26:  } //中間コードで分岐の末尾
27: }


↓ -@(L)+X のように書くと正しい答えになる?

2060 IF -@(L)+X=Y-L C=F

1週間くらい悩んでいたのだが、このページにヒントがあった。
8Qenn(2011/09/15)←自分のページかいっ!!

SDCCは関数を呼ぶときの引数はレジスタ渡しにしたり、関数内のローカル変数をレジスタに割付けたりする。
このような関数に再入すると変数を上書きしてしまう。
スタックを使用するにはコンパイル・オプション --satck-auto を指定する必要があるが、ライブラリも --stack-autoでコンパイルされている必要がある。
CH55xduinoのコンパイルオプションに --satck-auto を追加したら、CH55x用ライブラリがコンパイルできなかった。

関数を __reentrant 修飾すると、その関数は再入可能な関数になる。
ttbasic.cpp内の iexpから呼び出される関数を __reentrant 修飾したら、期待した結果になった。

20250125-143220

CH55xduinoのライブラリは --int-long-reent, --float-reentでコンパイルさてているらしいのが、--stack-autoではないらしいのでどこかで不具合が出るかもしれない。



最近の投稿】【最近のCPUボード】【最近のプログラミング】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2025年1月26日 (日)

CH559picoでTOYOSHIKI-BASIC

今年の目標の一つ
積んCPUを使ってみることにした。

2020年に買ったCH559pico を使ってみることにした。
CH559picoボード↓
Ch559pico

CH559はざっくり8051core+USB I/F+Flash 60KB+RAM 6KBだ。

単体でBASIC 52が動きそうだ。
USB I/FがあるのでCDCクラスを実装すると、USBコネクタに刺すだけでお手軽BASIC マイコンになりそうだ。
昔、EZ-USBで遊んでいたときに、思いついたのだが、EZ-USBはメモリが少なくて実現出来なかった。

CH55xシリーズはarduinoIDEで開発できることがわかった。
しかも、CDCクラスのシリアルデバイスとして認識する。
何とお手軽

ここを参考にCH55xduinoをインストールし、blinkを書き込むとあっけなく動いた。
先達に感謝

arduinoでシリアルの入出力は、aerial.begin()で初期化してaerial.Read、Serial.write()でデータを送受信する。
USBSerialでは関数に先頭にUSBをつけてUSBSerial_Read()
Serial.Begin()での初期化は必要ない。

こんなスケッチを書いUSBシリアルのループバックテストをやってみた。

void setup() {
  while (!USBSerial());
}


// the loop function runs over and over again forever
void loop() {
  uint8_t c;

  if (USBSerial_available()) {
    c=USBSerial_read();
    USBSerial_write('[');
    USBSerial_write(c);
    USBSerial_write(']');
  }
}

1字づつ送受信出来ることが分かった。
大量のデータを転送するなら、パケットサイズを大きくして一度の転送で多くのデータを送受信した方が効率が良い。
今回は、BASICのコンソールに使うので、速度よりリアルタイム性が重要だ。BASIC52を実装する前に、
鈴木哲也氏の著書「タイニーBASICをCで書く」で、豊四季BASICがarduinoに実装されているのを思い出したので、これを動かしてみることにした。

arduino用の豊四季BASICはこのページ(https://vintagechips.wordpress.com/2015/12/06/豊四季タイニー BCbasic確定版 /)のリンクからダウンロードできる。

豊四季BASICは、c_getch, c_putch, c_kbhit, rand, を環境に合わせて実装すれば動くようになっている。
書籍では、Serial.read(), Serial.write(), Serial.available()を使う方法が説明されている。

今回は、USBシリアルを使用するので、

#define c_getch(c) USBSerial_read(c)
#define c_putch() USBSerial_write()
#define c_kbhit()  USBSerial_available()

rand() はCH55xduinoのコンパイラsdccにもあるのでそのまま使える。
rand()に使用するシードの初期化は、randomseed()になるべくランダムな値を使用しする。
組み込み用のCPUではアナログポートから読み取った値を使う方法が紹介されている。
今回は、USBシリアルの初期化が終了した時刻を取得してシードとした。

randomseed(moicros());

arduinoIDEのシリアルの設定をCOMx(CH559picoが認識されているポート)にすると、シリアルモニタが使える。
arduino用豊四季BASICは、ttbasic.ino 内のloop() から、ttbasic.ccpのbasic() 関数を呼び出している。 
arduinoIDEで検証(Check)すると、キャストのwarningが出るが、コンパイルできて、USB経由で書き込むことができる。
書き込むと自動的にリセットされて、バナーが表示されるはずだが、いくら待っても表示されない。

ENTERを連打すると、バナーが表示され、> OK がたくさん表示される。
コマンドを入力してもエコーバックされず、一定数キー入力するとまとめて入力されているようだ。

テストプログラムを書いて調べたら、
loop()の外でUSBSerial_read()を呼ぶと1文字づつ取得できないことが判った。

豊四季BASICはbasic()関数内の無限ループで、c_gets()で1行取得し、処理するようになっている。
c_gets()関数も、関数内のwhileループでENTERまで文字をバッファに格納するようになっている。

loop()関数の中なら1文字づつ取得できるので、basic()を初期化部、1行取得部、処理部に分けて、初期化部をsetup()に書いて、loop()内で1行取得して、BASICの処理部を呼ぶようにしたら、動くようになった。

ところが、INPUT A を実行しようとすると、1文字づつ取得できない。
調べてみると、INPUTコマンドで入力する数字を数値に変化する関数 getnum()のwhileループ内で文字入力していることが分かった。

c_gets(),getnum()で使用する文字入力でloop()を呼ぶようにすればよさそうだが、loop()関数内でarduinoの内部関数を呼んでいると良くないことが起こりそうだ、と考えソースを見てみたら、

main()関数の中の無限ループがloop()を呼ぶシンプル構成だった。
CH55xduinoの main()の部分

void main(void) {
  init();

  //!!!initVariant();

  setup();

  for (;;) {
    loop();
    if (1) {
#ifndef USER_USB_RAM
      USBSerial_flush();
#endif
      // serialEvent();
    }
  }

  //    return 0;
}
 

よく見ると、無限ループの中でUSBSerial_refresh()
を実行していることを発見した。
どうやらこれが解決方法のようだ。

ということで、
c_gets(), getnum()の中のループから、USBSerial_flush()を実行するように書き換えたら動いた。

BASICが動くようになったらお約束の8queen問題を解くプログラムを書てみたら挙動がおかしい。
同じプログラムを豊四季BASIC linux版で動かしたら正常だった。
A=5, B=2, @(2)=3 のとき、A-@(B)の結果が 0 になっている。

つづく...



最近の投稿】【最近のCPUボード】【最近のプログラミング】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2022年5月21日 (土)

久々の物欲

ワイヤレス・キーボードやワイヤレス・マウスに使われているチップnRF24LE1が気になって調べていたら、プロトコル互換のnRF52840が載ったドングルスイッチサイエンスで見つけた。

ついでにCH551(8051+USB)が載ったドングルを見つけた。カートを見たら、あと200円で送料無料と表示されるので、つい、RaspberryPI-picoもカートに入れてしまった。

ところが、決済する段になってほしかったnRF52840ドングルCH551ドングルが無いことが分かった。(;_;
仕方がないので、CH551ドングルの代わりにCH599が載ったボードを買うことにした。

nRF52840が載ったボードは何種類かあるのだけれど高価だった。あきらめきれずAamazonで探したら、nRF52832乗ったモジュールを見つけた。

最近Amazonで買っているちょっとアヤシイ製品は大陸から発送されるので到着まで1月くらいかかる。ところが、この製品は翌日に配送された。(これが本当のAmazonだよな)

開けてみると、小さっつ! 寄る年波には勝てず細かいはんだ付けができない。このモジュールが載ったボードを買うべきだった。orz
Nrf528321

表と裏 セラミックアンテナが載っている。
Nrf52832front Nrf52832rea

スイッチサイエンスからは翌々日に届いた。
スイッチサイエンスの箱にはメッセージがある。↓

Swsience

CH559搭載ボード↓ 謎ジャンパーがある (?_?
Ch559pico

CH559

Ch559_20220520231801

よくある8051を拡張したMCUと思ったら、USBホストが付いていたり、FATライブラリが付いていたり、結構面白いかも。

RaspberryPi pico
Razpipico

RaspberryPI だけどMdelA/ModelBのようにOSが載るわけではない。
RaspberryPI財団が作った、Cortex M0+のマイコンボードだ。

MCUはRP2040
・dualcore Cortex M0+ @133MHz
・SRAM 264KB Flash 2MB

ファームウェアはC/C++とMicroPythonがあるようだ。
arduinoIDEでもサポートしているらしい。
お手軽だなあ。


最近の投稿】【最近のCPUボード】【最近のプログラミング】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2021年2月21日 (日)

stcgal <質問に答える>

昔書いたSTC micro techのMCUにF/Wを書き込むツール stcgal について質問があった。Cygwinでstcgalを使うとFileNotFoundがでるらしい。
3年以上前のことなのですっかり忘れていて、PCも変えたので環境もないのでもう一度でやってみた。

〇結論

Cygwinでsctgalをつかったときに、「 FileNotFoundError(2, '指定 されたパスが見つかりません。', None, 3)」というエラーが発生した場合、↓の可能性がある。

  • Cygwinのpythonをインストールしていない
  • Windows版のpython.exeが実行されている

〇環境

  • windows版のpython3.8がインストールされている。
  • Windwos Subsystem for Linuxがインストールされている。
  • Cygwinはインストールしていない。

今回Cygwin-x86_64をインストールした。

〇USBシリアル

USBシリアルモジュールを接続するとWindowsではCOM6で認識している。

Usbserial

CygwinではttyS5として認識する。

~/Documents/src
$ ls /dev
clipboard  console  mqueue  scd0    sdb1    sdc     stderr  ttyS2 
conin      dsp      null    sda     sdb2    sdc1    stdin   urandom 
conout     fd       ptmx    sda1    sdb3    shm     stdout  windows 
cons0      full     random  sdb     sdb4    sr0     tty     zero

~/Documents/src
$ ls /dev
clipboard  console mqueue  scd0    sdb1     sdc     stderr  ttyS2   zero
conin      dsp     null    sda     sdb2     sdc1    stdin   ttyS5
conout     fd      ptmx    sda1    sdb3     shm     stdout  urandom
cons0      full    random  sdb     sdb4     sr0     tty     windows

〇sctgalインストール

$ pip3  install  stcgal 
Collecting stcgal 
Downloading stcgal-1.6-py3-none-any.whl (35 kB) 
Collecting pyserial>=3.0 
Downloading pyserial-3.5-py2.py3-none-any.whl (90 kB) 
|・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・| 90 kB 1.3 MB/s 
Collecting tqdm>=4.0.0 
Downloading tqdm-4.57.0-py2.py3-none-any.whl (72 kB) 
|・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・| 72 kB 150 kB/s 
Installing collected packages: tqdm, pyserial, stcgal 
Successfully installed pyserial-3.5 stcgal-1.6 tqdm-4.57.0 
WARNING: You are using pip version 20.1.1; however, version 21.0.1 is available.
You should consider upgrading via the 'c:\users\yshin\appdata\local\programs\python\python38\python.exe -m pip install --upgrade pip' command.
 

stcgalのページに書いてあるとおり。

〇Cygwinでstcgalを実行

~/Documents/src
$ stcgal -p /dev/ttyS5
Serial port error: could not open port '/dev/ttyS5': FileNotFoundError(2, '指定 されたパスが見つかりません。', None, 3)

本当だ。?_?)

〇stcgal.pyはどこにある

Cygwinでstcgalを探したけど見つからない。 /usr/local/lib/python3.8/site-pacagesにあるはずだけど...

そういえば、stcgalをインストールしたとき、WARNIGメッセージに"python.exe"と表示されていた。ひょっとして、Windows版pythonが実行されている?
調べたら、Cygwinのpythonをインストールしていななった。 (^^; 
CygwinはWindowsの環境変数を引き継ぐようだ。Cygwinでpythonをインストールしていない場合Windows版のpython.exeが実行されていたようだ。 Windows版だから、/dev/ttySxって知らないよね。

〇Cygwinのpython3.8をインストール

Cygwinのpython3.8をインストールして、stcgalを実行する。

手順は↓のとおり。

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

$ stcgal -p /dev/ttyS5
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.725 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!

ちゃんと認識した。(^^ めでたし、めでたし。

〇ちなみに

↑の方法で書き込む場合、電源にコンデンサがあると認識しないことが多い。(電源リセットだからね)

STC12C2052 (2017/09/24)にBash on Windowsでは使えないと書いたが、Windows10のWindows Subsystem for Linuxでもちゃんと使えた。ttySxの数字はWindowsのCOMxと同じ。(CygwinはttyS(x-1)=COMx)



最近の投稿】【最近のCPUボード】【最近のプログラミング】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2020年11月18日 (水)

micro:bitで跳び上がると表示する名札 <ウケ狙い>

 micro:bitで加速度センサーを使ってみた。
加速度センサーのY軸の値を監視して、一定値より小さくなったら表示が始まる。micro:bitを身に着けていると、飛び上がると表示が始まる。

Jumptostart

電池ホルダーを胸ポケットに入れてmicro:bitを外に出すと、跳び上がると表示する名札になる。

ダウンロード - makecode.microbit.org.lnk

micro:bitを初めて触る子どもたちにmicro:bitはどのようなもので何ができるのか説明するよりサンプルを見せたほうがイメージしやすい。

けっこうウケたので、ちょっと嬉しい。v(^^

ところで、

子どもたちにmicrobitを教えるときには、

  • ChromeでMakeCodeエディタを開くリンクを用意しておく
    IEが規定のブラウザに設定されていると、MakeCodeエディタのページを開くのに一手間二手間が必要。
    (makecode.microbit.org.lnk)

     
  • デバイス接続して直接書き込む方法を教える
    ダウンロードの設定でダウンロードフォルダが指定されている場合、ファームウェアを書き込むときに、ダウンロードフォルダからMICROBITドライブにコピー(D&D)が必要となり、パソコンの操作に慣れていないと結構手間がかかる。
      
  • ファームウェアが古くてデバイス接続できない場合は、Chromeのダウンロードの設定を変える
    chromeの詳細設定でダウンロードの前に保存場所を確認する設定にすると、ダウンロード時に保存場所を聞いてくるので、MICROBITドライブを選ぶと、プログラムが書き込まれる。
    Chromeの設定(右上の縦に3つ並んだ●)→設定→詳細設定(左下の▼)→ダウンロード→「ダウンロード前に各ファイルの保存場所を確認する」をON


最近の投稿】【最近のCPUボード】【最近のプログラミング】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2020年9月15日 (火)

micro:bit <BLEが乗った低価格マイコンボード>

ずいぶん前に買ったmicro:bitを出してきた。

Microbit_set

micro:bitは英BBCが作った教育用マイコンボードで、英国では2015年に11歳と12歳の小学生全員に無料で配布したらしい。

マイコンボードとしては、(https://tech.microbit.org/hardware/)

  • CPU:nRF51822 Cortex-M0 ROM:256kB RAM:16kB Clock:16MHz Bluetooth4.1内蔵
  • DAPLink:MKL26Z128VFM4 Cortex-M0+
  • IO:5x5LED, SWx2, SPI, I2C, GPIOx18(LED,SW,SPI,I2C排他使用)
  • Sensor: 3軸加速度センサー、地磁気センサー、温度センサー(on chip), 明るさセンサー(LED使用?)

マイコンボードとして見ると盛りだくさんで、¥2,000はお買い得かもしれない。


Microbit_rea


Microbit_front

プログラミング環境はOnlineで提供されている。(https://makecode.microbit.org/)
教育向けを謳っているだけあって、ブロック型ビジュアル・プログラミング環境が公開されている。
困らないくらいブロックは揃っているが、文字でプログラミングしたいと言う人向けにjavascriptでもプログラムが書ける。

micro:bitの最初のプログラムは、Lチカでなくハートマークを点滅させるらしい。

Microbitidem

これくらいなら、ブロックエディタで書けるけど、ちょっと大きくなるとブロックエディタでは見通しが悪くなる。

ダウンロードのリンクをクリックすると、HEXファイルがダウンロードされる。micro:bitにはDAPLinkが乗っているので、ダウンロードされたHEXファイルを"MICROBIT"という名前のドライブにコピーすることで、micro:bitに書きまれる。

左にシミュレータがあるので、micro:bitを書き換える前に動作を見ることができる。

ところで、このIDEはHEXファイルを読み込むと、プログラムを編集することができる。HEXファイルはバイナリデータなのになぜプログラムを復元することができるのか不思議だ。 HEXファイルの中にプログラムが書いてあるのかと思い覗いてみたが見当たらない。

調べてみると、micro:bitはMicroPythonで動いていて、IDEでダウンロードされるHEXファイルには、MicroPythonインタプリタのバイナリとMicroPythonのスクリプト(中間言語?)が入っているらしい。IDEはHEXファイルを読んでMicroPythonのスクリプト部分を読み出しているようだ。

関数も使えて、再帰呼び出しもできるようなので、5Queenをやってみた。深くなるとスタックが足りなくなるようだ。

blutooth LEがオンチップで乗っているので、micro:bitのセンサーの値をスマホやPCに送って処理させたり、スマホやPCからmicro:bitを制御したり、micro:bit同士でメッセージが送受信できる。


最近の投稿】【最近のCPUボード】【最近のプログラミング】【2017の投稿】【2016の投稿】【2015の投稿

2020年5月 1日 (金)

Google日本語モールス入力

 Googleは2012/4/1にモールス符号の入力システム「Google 日本語入力モールスバージョンbeta」を発表した。 体験版(自由に入力コース)があって、試してみることができる。(https://www.google.co.jp/ime/-.-.html#freeinput)

 スペースキー一つで日本語入力ができる優れものだ。紹介ビデオではUSB接続の電鍵使っている。^^) この入力デバイスを持っていない人はスペースキーで入力するのだが、スペースキーでモールスは打ちにくいので、電鍵をつないでみた。

↑接点が参加しているのでしっかり打たないとチャッタリング多い。

パドルでも入力できる。

ヘボいなあ。(^^;

 

USB接続の電鍵を買ってきたわけではなく、digisparkでエレキーのスケッチを書いて、キーダウンのときに、digisparkのUSBキーボードでスペースキーのコードを送るようにしている。

ちなみにAndroidとiOS用に配布しているIMEは本当にモールス符号(・と-)で入力できるらしい。



最近の投稿】【最近のAVR】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

 

 

 

2020年3月16日 (月)

ADALM2000(4) <変調波を出してみる>

 AWGの[Math]機能を使って変調波を出力してみる。

 変調がかけられると受信機の調整に使える。3

〇AM

 振幅変調(AM)波を出してみる。
キャリア(Vc)、変調波(Vs)を

vc = Vc・cos(ωc・t)
vs = Vs・cos(ωs・t)

とする。

 AM波は、Vcの大きさがVsで変化するから

Vam = (Vc+kVs・cos(ωs・t))・cos(ωc・t)

= Vc(1+m・cos(ωm・t))・cos(ωc・t)
= Vc・cos(ωc・t) + Vc・m/2・cos(ωc+ωm)t + Vc・m/2・cos(ωc-ωm)t

変調度:m=kVs/Vc

 これをAWGの[Math]で出力してみる。
変調波を1.5kHz、キャリアを1.125MHz=1.5kHz×750、変調度:m=0.6とすると

f(t)=5*(1+0.6*cos(t))*cos(750*t)

きれいなAM波だ。

Am_1k_125m_m06_awg

SAで見ると

Am_1k_1125m_m06_sa2

ちゃんと、キャリアと上側と下側にスペクトルがある。


〇DSB

 両側波帯(DSB)は、AMのキャリアがなくなったものだから、


Vdsb = Vc・m/2・cos(ωc+ωm)t + Vc・m/2・cos(ωc-ωm)t

 AM波の1項目(Vc・cos(ωc・t))を除いている。

f(t)=2.5*0.6*(cos(751*t)+cos(749*t))

SAで見ると、当然キャリアはない。まあ当然だけどね。

Ssb_1k_125m_sa

波形を見ると、

Ssb_1k_125m_awg

↑の波形をみて、キャリアがないとわかるのは見慣れているからか?

〇FM

 周波数変調(FM)波は、キャリアの周波数(Vc)が変調波(Vs)で変化する

Vfm = Vc・sin(ωct + m・sin(ωst)) 変調指数:m=Δf/fs

変調波を1.5kHz、キャリアを1.125MHz=1.5kHz×750、変調指数:m=3とすると

f(t)=5*sin(750*t + 3*sin(t))

帯域が広がっている。↓

Fm_15k_125m_m3_sa

変調指数が2.4になると、キャリアが消えると昔教えてもらった。

f(t)=5*sin(750*t + 2.4*sin(t))

キャリアが消えている。↓

Fm_15k_125m_m24_sa

 キャリアが消えて何が嬉しいかというと、この性質を利用すると最大周波数偏移の調整ができる。

 VHF帯FM(F3E)の占有帯域幅:Wは16kHz、最大変調周波数:fsは3kHだから最大周波数偏移:Δfは

W = 2(Δf + fs)
Δf = W/2 - fs

= 16/2 - 3
= ±5KHz

 FM送信機の最大周波数偏移Δfを調整するときには、スペアナでキャリアが消えるポイントを見て調整できる。
昔無線屋さんだった時にはスペアナは無ったので、局発がスイープできる電界強度測定器とオシロを使って狭帯域スペアナにしていた。

 m = Δf/fs = 2.4 のときキャリアが消えるので
 5kHz/2.4 = 2083Hz を入力してキャリアが消えるポイントに調整すると周波数偏移は±5kHzになってる。

 でも、いちいちスペアナ出してくるのは面倒だからFM直線検波器で調整してたんだけどね。;p

###

 [Math]で発生できる周波数は1つで、関数は、三角関数と指数関数、平方根しかない。もう一つ周波数があって、非線形の関数があるとデジタル変調波が生成できるのだが。 自分で計算して[Buffer]で出力するのかな。



最近の投稿】【最近のRF】【最近のFPGA】【最近のCPUボード】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2020年3月 1日 (日)

ADALM2000(3) <AWG,OS,SA>

ADALM2K用アプリはScopyAliceがある。Scpoyの方が使い勝手がよさそうだ。

 アプリの使い方に慣れるために、AWG(AnalogWaveGenerator)の出力をアナログ入力につないで、オシロスコープ、スペアナを動かしてみた。

〇AWG

 AWGのモードには、[Constant]、[Waveform]、[Buffer]、[Math]がある。

  • [Constant]は直流電圧を出力する。
  • [Waveform]で正弦波、矩形波、三角波、台形波、鋸歯状波、逆鋸歯状波が選択できる。
  • [Buffer]は波形データを読み込んで出力できる。
  • [Math]は数式で表した波形を出力できる。

1MHzの矩形波を出してみる。

Sqr_1m_50duty_awg

学校で先生に「すべての波形は正弦波の集合で荒らすことができる」なんていわれたけど、全然ピンとこなかった。
でも、これを、スペアナで見ると矩形波はたくさんの高調波を含んでいるのが見える。

Sqr_1m_50duty_sa
当時これを見たら、先生の説明も、「なるほど、そんなものか」と思うだろう。

 フーリエ変換を習うと、デューティサイクル50%だから偶数(2の倍数)次の高調波はなくなるはずだが、なくなっていないことに気づく。そして、理論を実現するには限界があることを学ぶ。限界を極めるのはもっと難しい。

 AWGはデューティサイクルが設定できるので、20%にしてみる。5の倍数の高調波がなくなるはずだ。

Sqrt_1m_20duty_awg

本当に消えてる。限界は一定ではない。

Sqr_10m_sa

 反対のことをやってみる。本当に正弦波を重ねると矩形波になるのか?[Math]モードで数式を入力すると波形を出力してくれる。

 正弦波はをフーリエ級数展開すると。

f(t)=1/4π{sin(t)+1/3sin(3t)+1/5sin(5t)+1/7sin(7t) ・・・}

と昔習ったので、9次くらいまでやってみる。
最初は基本波。振幅は5vにして f(t)=5*(sin(t)}

Sin_sinx1_sa

3次、5次、7次と増やして
9次まで f(t)=5*(sin(t)+sin(3*t)/3+sin(5*t)/5+sin(7*t)/7+sin(9*t)/9)

Sin_sinx9_awg

 9次くらいでは、ぜんせん矩形波らしくないけどそれっぽくはなってきた。じゃあ99次まで

Sin_sinx99_awg
理論と現実の壁だ。

〇オシロ

 2chあるのでXYモードがある。XYモードといえばリサージュ波形だ。
AWG1で1kHzの正弦波を出力して、AWG2で90°位相が遅れた正弦波を出す。それをそれぞれ、アナログ入力1,2に入力して、リサージュ波形を描かせる。

 90°位相差があると、リサージュ波形は円になる。教科書どおりだ。(図はX軸とY軸のスケールが違うので楕円になってる)

Sin_1k_ph90_os

オシロで位相差を図ってみたら、90.354°画面から読み取ったので誤差が大きいかも。

Sin_30m_ph90dig_2ch_os

45°ずれると45°傾いた楕円になる。

Sin_1k_ph45_os

周波数が高くなると誤差が増えるのではないかと思ったら。30MHzでも誤差は少ないようだ。

Sin_30m_ph90_os



最近の投稿】【最近のRF】【最近のFPGA】【最近のCPUボード】【2019の投稿】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

2020年2月18日 (火)

TMP92CM22FG

TMP92CM22FGは東芝の16bitCPU TLCS-900Hシリーズ

 秋月で見つけたので買っておいたもの。0.5mm 100pinQFPの半田付けはまだできると思っていたのだが、最近歳のせいか弱気になってきたので、知人に頼んで付けてもらった。さすがに綺麗に付いてる。

Tmp92cm22fg

 知人曰く実体顕微鏡を買えと。商売じゃないので年寄はDIPで遊ぶことにしよう。

 TLCS-900H1シリーズは、東芝のZ80上位互32bit.CPU
TLCS-900→TLCS-900/H→TLCS-900/H2→TLCS-900/H1らしい。H2よりH1の方が後発。
「TLCS-900/H&H2活用ハンドブック」をAmazonで買ってみた。

Tlcs900h

 ↑の本の付録CDにアセンブラが収録されている。コンパイラはメーカ製があるけれどFreeで公開されてない。gccでもサポートされてない。ここがSHやH8と違うところか。

 京セラが1998年に発売したPHS データスコープDS110にもTLCS-900/Lが使われていて、データスコープの開発キットにコンパイラもある。開発キットは当時無償で配布された。

Datascopecd

 コンパイラ(CC900.EXE)はあるけど16bitアプリだ。そのままでは64bit Windowsで動かないが、MS-DOS playerで動くようだ。

 ボードを作ろう。


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

より以前の記事一覧