製作モジュール一覧

ラベル EEPROM の投稿を表示しています。 すべての投稿を表示
ラベル EEPROM の投稿を表示しています。 すべての投稿を表示

2017年1月6日金曜日

ベースマシン I/Oエクスパンダ―基板 でけた

Exio Board


I/OエキスパンダーのMCP23S17とEEPROMのAT24C1024を載せた基板。基板の入出力は、電源、I2C(AT24C1024用)、SPI(MCP23S17用)、GPIO×16本。

回路図

基板図


MISOをPull Downする抵抗を追加。MISOだけ無信号時にハイ・インピーダンスになるようなので1kΩのRでブルダウンした。ハイ・インピーダンスになるのはMCP23S17の出力の使用なのかな?
(参考:「I/OエキスパンダーのMCP23S17をNucleo F401RE(mbed)で使ってみる。 その2」

テスト用にGNDのテストポイント(JP6)を追加。

部品面


ハンダ面



今回も部品面で被覆付きの単線でジャンパを配線した。SMDとうで高密度配線をするのでなければこっちの方がよさそう。慣れればハンダ面でジャンパを這わすよりはんだ付けも楽だ。うっかりハンダ面を引っ掛けてジャンパ線を傷つける心配も少ないと思う。

Exio UI Board


ロータリーエンコーダ1個とタクトスイッチ6個。MCP23S17のGPIOに接続する。

回路図


基板図


部品面


ハンダ面


こちらはジャンパなしで配線できた。

ユニットテスト


今回制作した基板をつないでユニットテスト。はんだ付け作業より、ケーブルを作ったりテストする方が時間がかかった。

MCP23S17用テストプログラム
https://developer.mbed.org/users/ryood/code/ExioBufferdController_Test/ Revision:13

AT24C1024用テストプログラム

https://developer.mbed.org/users/ryood/code/AT24C1024_Test/ Revision:4

ベースマシンのUIパネルに固定


mbed repository
https://developer.mbed.org/users/ryood/code/BaseMachine/ Revision:19

メモ:


mbedのオンライン・コンパイラをWidows10のEdgeで使うとCtrl-Cでコピー出来ない。Chrome、FirefoxならOK。

考えていたハードウェアはだいたい出来たので、次回はまとめ(弱め)の予定です。

2016年12月30日金曜日

ベースマシン I/Oエクスパンダ―基板


下側のスイッチx8はパターン切替用。aitendoで購入。キートップはついていなかったが、艶消しの基板でなかなかかっちょいい。

上側のスイッチ類はパターンのロードセーブ、コピー&ペースト用。

真ん中はI/Oエクスパンダ―のMCP23S17とEEPROMのAT24C1024。

回路図



基板図(配線まだ)


基板は真ん中に電源ラインがあらかじめ配線されているユニバーサル基板を使ってみるつもり。

ずいぶん前に買ったはいいものの使いどころが難しい。

スイッチ類回路図


スイッチ類基板図(配線まだ)

2016年11月28日月曜日

ベースマシン パターンの保存(EEPROM使用)

SDカードではなく、EEPROM(AT24C1024B)を使ってシーケンスパターンをSave/Load出来るようにしてみた。

追加機能:

  • シーケンスパターンのSave/Load (16Slot)
  • パターンのCopy/Paste


配線図


mbed repository:

BaseMachineUIController Test
https://developer.mbed.org/users/ryood/code/BaseMachine_UIController_Test/ Revison:14

BaseMachine
https://developer.mbed.org/users/ryood/code/BaseMachine/ Revision:16

2016年11月25日金曜日

I2C EEPROM(AT24C1024B)をArduino UnoとNucleo F401RE(mbed)で使う。

1MbitのI2C EEPROMのAT24C1024Bの手持ちがあったのでテストしてみた。

仕様としては、I2C接続で電源電圧は2.5V~5.5VなのでArduinoでもNucleoでも気軽に使える。

書き込みはバイト単位、ページ単位、読み込みはランダムリードとシーケンシャルリードができる。

メモリの構成は、512Page × 256Byteになっていてアドレス指定は17bitで行う。

バイト単位の書き込み


1byte目 デバイス・アドレス ( 0x1010 | A2 | A1 | P0 | W )
2byte目 上位アドレス
3byte目 下位アドレス
4byte目 書き込みデータ

となっていて、1byte目のデバイスアドレスは、0x1010は固定、A2/A1はピンの接続と合わせて指定する(1個だけ使う場合はGNDに落として0を指定すると楽)。アドレス17bitのうち最上位1bitをP0で指定する。

バイト単位の読み込み


読み込みの場合は書き込みの1~3byte目と同じものをWモードで送信してアドレスを指定。4byte目のデータは送らずに、再びSTARTコンディションにしてRモードでデバイスアドレスを送信するとデータが返ってくる仕様。

Arduino


配線図


デバイスアドレスのA1/A2はGNDに落とし、I2CのSCL、SDAは1kΩでプルアップした。

ライブラリはArduinoのPlaygroundの「Arduino AT24C1024 I2C EEPROM Library」を使わせてもらった。(バイト単位の読み書きのみに対応)

http://playground.arduino.cc/Code/I2CEEPROM24C1024
https://github.com/jwhiddon/AT24C1024

ExampleのAT24C1024_EEPROM_Benchmarkをそのまま動作させることができた。全アドレスを読み書きするのでシリアル・コンソールにしばらく何も表示されないが、少し待てば「.」が表示されていく。

シリアル出力結果

AT24C1024 EEPROM Library Benchmark Sketch
--------------------------------
Write By Byte Test:
Writing data:...........................DONE
Total Time (seconds): 722
Write operations per second: 181
--------------------------------
--------------------------------
Read By Byte Test:
Reading data:..
Address: 9265 Should be: 25 Read val: 255
.........................DONE
Total Test Time (secs): 82
Read operations per second: 1598
Total errors: 1
--------------------------------

書き込みは181Byte/s、読み込みは1,598Byte/sで、1バイト読み書きに失敗したようだ。

I2C通信のようす

書き込み

ch1:SDA ch2:SCL

読み込み

Nucleo F401RE(mbed)

配線図


こちらも1kΩでプルアップ。

ライブラリはKenji Araiさんの「AT24C1024」ライブラリ(https://developer.mbed.org/users/kenjiArai/code/AT24C1024/)を使わせてもらった。こちらはページ単位の読み書きにも対応している。

テスト・プログラム main.cpp

#include "mbed.h"
#include "AT24C1024.h"

I2C         i2c(D14, D15);      // SDA, SCL
AT24C1024   at24c1024(i2c);     // Atmel 1Mbit EE-PROM

DigitalOut led1(LED1);

int main()
{
    printf("\r\n*** AT24C1024 Test ***\r\n");

    // Byte Read/Write
    // 
    uint8_t dt = 0x55;
    printf("Byte Write: %02x\r\n", dt);
    at24c1024.write(0, dt);     // write addr=0 data=dt
    wait_ms(5);
    dt = at24c1024.read(0);     // read addr=0
    printf("Byte Read: %02x\r\n", dt);

    // Page Read/Write
    // 
    uint8_t eep_buf[258];
    for (int i = 0; i < 256; i++) {
        eep_buf[i] = i;
    }
    printf("Page Write: 0..255\r\n");
    AT24C_STATUS status = at24c1024.write_page(0x1ff00, eep_buf, sizeof(eep_buf));
    wait_ms(5);
    printf("Status: %d\r\n", status);
    printf("Page Read:\r\n");
    status = at24c1024.read_page(0x1ff00, eep_buf, sizeof(eep_buf));
    printf("Status: %d\r\n", status);
    for (int i = 0; i < sizeof(eep_buf); i++) {
        printf("%d ", eep_buf[i]);
    }
    printf("\r\n");

    while(1) {
        led1 = !led1;
        wait(0.2);
    }
}

AT24C1024のWriteはDATASHEETを見ると5msかかるようなのでwait_ms(5)を入れている。waitをかけないと読み込みに失敗する。また、ページ単位の読み書きのバッファ、はメンバ関数内部でI2C通信用に2バイト使うので258バイト確保する必要がある。データはインデックス0から埋める。

<追記:2016.11.25>

write_page()とread_page()はエラーステータス(AT24C_STATUS)を返しますが、I2C通信がうまくいったかどうかは見ない仕様のようです。AT24C_OK = 0が返ってきても通信が失敗している場合もあります。

</追記>

I2C通信のようす


ch1:SDA ch2:SCL

メモ:


SDカードに比べるとR/Wの速度は遅いが、実装面積が節約できるし値段も安い。1Mbitの品種を使っているが、ベースマシンのデータ保存用ならそんなには必要ない。

2016年7月22日金曜日

PCM5102Aを使ったファンクションジェネレータの熱対策と小改良

夏場になってきてPCM5102Aを使ったファンクションジェネレータが誤動作するようになってきた。通電後しばらくすると出力波形がぐちゃぐちゃになる。(操作はできる)

プログラムでダイ温度を表示できるようにしているので見てみると40℃程度まで上がっていた。

なんちゃって放熱器をつけていたが、ちゃんとした(?)放熱器をaitendoで仕入れたので付け替えてみた。


共立で売っている熱伝導シールで接着した。


触ってみるとPCM5102Aも相当発熱していたので、もともと使っていたものはPCM5102Aの方につけた。

室温28℃で

旧ラジエーター:5分後38℃
新ラジエーター:5分後37℃

と効果はそれほどかわらなかった(^q^;

が、PCM5102Aの方にも放熱器を付けたおかげか、20分ぐらい様子を見ても波形がぐしゃぐしゃになることはなくなった。PCM5102Aの方が原因だったのかな?

小改良


この間PSoC 5LPのEEPROMを使ってみる実験をしたので、設定値をEEPROMに保存して電源再投入後も前の設定が呼び出されるように改良した。

電池がもったいないので電源を頻繁にオン・オフするので、これ、結構便利です(^q^/

Github:
https://github.com/ryood/I2S_FG/tree/master/PSoC/I2S_FG/PrototypingKit_FG.cydsn

2016年6月24日金曜日

PSoC5LP Prototyping KitでEEPROMを使ってみる。

シーケンサーで作ったシーケンスを永続化したいのだが、何が一番簡単か考えてみるとマイコンに内蔵されているflashメモリーに書いてしまえれば話が早そうだ。

だがしかし、ノイマン型ではない、なんだっけ名前忘れたが(^q^; プログラムをflashメモリにおいてSRAMを作業領域として分離して使うタイプのCPUだと、実行時にそうは簡単にflashメモリーに書き込めない仕組みになっているようだ。

flashメモリへの実行時書き込みは宿題として、簡単にアクセスできそうなメモリは

SDカード
EEPROM

ぐらいだと思う。

SDカードはハンダ付けしたり配線するのがめんどくさそうなのでEEPROMが内蔵されているPSoC 5LPでEEPROMを使ってみることにした。

試した見たのはPSoC CreatorのexampleのEEPROM_Designというプロジェクト。

基本的には「PSoC 5LP Prototyping KitでChar LCD(HD44780)を使う まとめ」と同じ配線で、プロジェクトのTopDesignに書いてあるように


Procedure:

2. Connect LED1 to pin P0[0], LED4 to P0[1] and SW1 to P0[2].

のとおり配線した。(LEDの1とか4の意味は分からないがCY8CKIT-001がそうなってるのかな?)


そのままではコンパイルが通らなかったので、PSoC CreatorのメニューからProject/Debice SelectorでPSoC 5LP Prototyping KitのCY8C5888-LP097を指定。

USBを引っこ抜いて挿しなおしても表示値は追随していたので、RST回数やERASE回数はEEPROMに保持されていると思う。

メモ:

PSoC5LPの型番は覚えにくいが、Prototyping KitはLP097、CQ出版のはLP035。

PSoCにはEm_EEPROMというコンポーネントがあって、EEPROMが実装されていないPSoC4てもflashメモリーでエミュレートできるようだ。

→製作中のベースマシンではmbedで使うNucleoF401REが親なのでSDカードで保持する方向で考えるべきか?