Sim's blog

電子工作はじめてみました

PSoC3/5?

2009-07-30 23:18:22 | PSoC
今までのはPSoC1ということで、新しくPSoC3とPSoC5が出るらしいです。PSoC3はcpuが8051に、PSoC5はcpuがARM Cortex M3になって、より高速、大容量になるみたいです。
すでにパステルマジックさんではPSoC3の評価キットを販売しています。PSoC3はESという注意書きがあります。
Cypressのサイトで、ログインすると一応データシートとか見れます。
以前参加したセミナーではARMを載せたPSoCをそのうち出すとか言っていましたが、ついに出るみたいです。

ThinkpadのFan Error

2009-07-28 23:24:42 | その他
プリンタポートがついているので、メインマシンとして使っているThinkpad T42ですが、電源を入れるとFan Errorと出てシャットダウンしてしまいます。
あう、壊れたか・・・しくしく。
というわけで、様子を見るために開けてみました。
Thinkpadは、保守マニュアルをダウンロードできるので、持ち歩きマシンのNB100でpdfを眺めながらの作業です。ファン・アセンブリーという項目に交換の話が載っています。まずはバッテリーとコンセントをはずします。裏のネジをはずして、パームレストとキーボードをはずすと、ファンがむきだしになります。試しに電源をつないでみると、確かにファンが回っていません。・・・コネクタを挿し直したら、あっさり動きました。ゆるんでいたんでしょうか。とりあえずは動くからいいやと思って、元に戻しちゃいました。うーむ、でもなんかこわいです。
そろそろ新調しないと駄目かなあ。プリンタポートは必須です。

そういえば、今年にはいってからHDDレコーダ、予備ノートPC、と立て続けに壊れてしまったのでした。HDDレコーダとネットブックは新調しました。

若松のページでThinkpad用の保守部品を売っています。T4シリーズ用のFANは2種類あります。どっちなんでしょうね。8000円くらいします。結構高いかも・・・。

しまった、せっかく開けたんだから、写真でも撮っておけばよかった。でも、心理的にそんな余裕はなかったです。

DWMのJTAG回路

2009-07-27 22:44:37 | 電子工作
今は亡きDesignWave誌の2008年6月号にFT2232を使ったARM用JTAGの回路図が出ていました。回路図とサンプルはDesignWaveのダウンロードページから入手できます。hamayanさんは基板をおこして作られています(記事)。

自分の頭の整理のために、回路図を一部抜書きしてみました。

JTAGの通信用の信号のあたりです。

このJTAGケーブルは、nOEという信号を使ってターゲットとの間を電気的に切り離せる(ハイインピーダンス)ようになっています。nOEはプルアップされているので、FT2232のポートを初期設定する以前の状態だと、ハイインピーダンスになっていて安全サイドの設計になっています。
三角は74VHC125ですが、レベル変換もします。Interface 5月号付録のLPC2388基板だと3.3Vなので、レベル変換は不要です。
安全ということだと、74VHC125の入力側をプルアップしておく方がよいかもしれません。

ターゲットの電源センスです。

nTVCCはターゲットの電源が入っているときにL、電源が入っていないときにHになります。ソフト側でターゲットの電源をチェックするために使う信号です。

リセットその1(TRST)です。

JTAGのTAPをリセットするのに使う信号らしいです。TRSTもレベル変換用の74VHC125で接続されています。nTRST_OEがHのときハイインピーダンスになります。74VHC125は4回路入りなので、2個目になります。

リセットその2(SRST)です。

今までの信号と違って双方向になっています。SRSTはシステム全体のリセットということみたいです。双方向になっているのは、PC側のソフトからリセットしたいときもあるし、基板上のリセットボタンが押されたのを読み取りたいという、両方の用途があるからだと推察されます。単に出力同士がぶつかるのを防ぎたいだけかもしれません。nSRST_OEがHのときにハイインピーダンスになります。
PC側からリセットをかけたいときはnRST_OEをLにしてから、nSRSTをLにします。

さてさて、なんとなく雰囲気は分かりました(分かったつもり?)。秋月のFT2232DモジュールとLPC2388基板を試しにつないでみたくなってきました。

AVRスティック

2009-07-22 10:02:55 | AVR
スイッチサイエンスさんでSparkFunのAVRスティックの取り扱いが始まりました。

スイッチサイエンスさんの販売ページ
Spark Funの販売ページ

載っているのはATTiny85なのでROMが8kあります。見た目、もあさんのPepperを思い出します。改造してPepperになるかもしれません。

ずいぶん部品が少ないなあ、と思ってSpark Funのページにある回路図を見てみました。ぐはっ、これってUSBに5V直結なんですね。今どき保護回路はあると思いますが、さすがに5V直結は怖いです。うーむ。

ArduinoでI2C液晶

2009-07-21 01:31:17 | AVR
ストロベリーリナックスさんで販売しているI2C液晶にArduinoから出力してみる実験です。

注意!! I2C液晶は2.7-3.6Vでの動作が保証されています。Arduinoの5V出力での使用は仕様外です。

実験の様子です。


出力の様子です。


ArduinoにはWireというi2cライブラリが用意されているので、i2cの部分は簡単に実現できます。ストロベリーリナックスさんで公開しているソースの一部をArduinoに移植しました。移植していないのはアイコンの表示です。
 
#include <Wire.h>

// Arduino     i2c-lcd
// Dig 2 ----- 1pin rst (pull-up 10k ohm)
// Ana 5 ----- 2pin scl (pull-up 2.2k ohm)
// Ana 4 ----- 3pin sda (pull-up 2.2k ohm)
// GND ------- 4pin
// 5V -------- 5pin

int ledPin = 13;
int resetPin = 2;
int sdaPin = 18; // analog pin 4
int sclPin = 19; // analog pin 5
int i2cadr = 0x3e;
byte contrast = 7; // 0-63 5V系だとかなり少なくする

void lcd_cmd(byte x)
{
  Wire.beginTransmission(i2cadr);
  Wire.send(0x00);
  Wire.send(x);
  Wire.endTransmission();
}

void lcd_data(byte x)
{
  Wire.beginTransmission(i2cadr);
  Wire.send(0x40);
  Wire.send(x);
  Wire.endTransmission();
}

void lcd_puts(const char *s)
{
  while(*s) lcd_data(*s++);
}

void lcd_init()
{
  // reset
  delay(500);
  pinMode(resetPin, OUTPUT);
  digitalWrite(resetPin, LOW);
  delay(1);
  digitalWrite(resetPin, HIGH);
  delay(10);
  // LCD initialize
  delay(40);
  Wire.begin();
  lcd_cmd(0x38); // function set
  lcd_cmd(0x39); // function set
  lcd_cmd(0x14); // interval osc
  lcd_cmd(0x70 | (contrast & 15)); // contrast low
  lcd_cmd(0x5c | (contrast >> 4 & 3)); // contrast high / icon / power
  lcd_cmd(0x6c); // follower control
  delay(300);
  lcd_cmd(0x38); // function set
  lcd_cmd(0x0c); // display on
  lcd_cmd(0x01); // clear display
  delay(2);
}

void lcd_move(byte pos){
  lcd_cmd(0x80 | pos);
}

void setup()
{
  lcd_init();
  lcd_puts("Hello, Arduino!");
  lcd_move(0x40);
  lcd_puts("i2c LCD module");
  
  pinMode(ledPin, OUTPUT); // Lチカ
}

void loop()
{
  digitalWrite(ledPin, HIGH);
  delay(100);
  digitalWrite(ledPin, LOW);
  delay(500);
}

ArduinoのメニューTools→Copy as HTMLを使うと上のようなsketch風のソースを貼ることができます。
5Vなので、コントラストはむちゃくちゃ濃いです。コントラストは0から63まで指定できますが、7くらいでちょうどでした。
便利なライブラリがあるおかげで結構短く書けたと思います。
ライブラリにまとめることができれば、かっこいいんですが、ライブラリの作り方が分かっていません。

Arduinoモニタープログラム参加中
電子部品・半導体の通販サイト - チップワンストップ



FT2232DモジュールにEEPROMを載せました

2009-07-18 01:17:51 | 電子工作
ジャンクNICからはずした部品、その後・・・の続きになります。

秋月のFT2232Dモジュールに未実装だったEEPROMを載せました。EEPROMはAT93C56で入手先はdigikeyです。前回はジャンクNIC基板からはずしたEEPROMを載せようとしましたが、たぶんはずすときにICを壊してしまって、うまく動きませんでした。今回は新品なので余裕で動きました。

digikeyから届いた部品たち


AT93C56のレール


はんだづけしました。

結構、ぎりぎりです。ジャンパーピンをはずし忘れて、先っぽを焦がしてしまいました(写真右)。

今回はインストールしませんでしたが、デバイスドライバーはFTDIのページからダウンロードできます。

FT2232Dの設定をEEPROMに書き込むにはMProg3.5というツールを使います。MProg3.5はFTDIのユーティリティのページからダウンロードできます。

FT2232Dを初めてPCに挿したときは、COMポートが2つ見えます。JTAGを使うには片方をD2XXに変えます。DesignWave誌の2008年6月号に載っている設定にしてみました。

MProg3.5の画面です(クリックすると拡大します)。


新規作成(Fileメニュー → New)をすると、Device Typeを選べるようになります。FT2232Dを選びます。Device Typeを選ぶと他の設定もできるようになります。設定が終わったらセーブします。セーブしないと書き込めないみたいです。EraseしてからProgramすることで書き込み完了です。

USBケーブルを抜いて、挿しなおすと、今度はCOMポートが1つに減っています。

MProg3.5でToolメニュー → Readとすると、EEPROMの内容を読み出してダンプしてくれます。00-ffの256バイトしか使っていないみたいです。AT93C46は128バイトなので00-7fです。その場合は設定のメモリが足りないですが平気なんでしょうか?今回使ったAT93C56は256バイトなので00-ffまでメモリがあります。特にProduct Descriptionがa0番地あたりにいるので、JTAGで使うときはAT93C46でなく、AT93C56またはAT93C66にした方がよさそうです。

前回駄目だったので、もしかして壊しちゃったかと、びびってましたが動いてよかったです。

それはそれとして、digikeyから届くのがやたら速いです。16日の0時頃注文して届いたのが17日の15時頃だったので39時間です。

ストロベリーリナックスさんでSTM32 Primer2の販売開始

2009-07-17 23:52:04 | その他のマイコン
ストロベリーリナックスさんでSTM32 Primer2の販売が始まっています。
STマイクロがSTM32 Primer2を出したときのプレスリリース


以前からdigikeyでは取り扱いがあったのですが、国内では初めてではないでしょうか。

見た目、ゲーム機ですね。とにかく、やたらと色々なペリフェラルが搭載されています。stm32circle.comからスペックを抜書きしてみます。

- CPU STM32F103E (512k FLASH)、ST MicroのARM(Cortex M3)
- リチウムイオンバッテリー
- タッチパネル付128x160pixel TFTスクリーン
- オーディオ・コーデック、マイク、スピーカ、イヤホンジャック
- 4方向ジョイスティック、プッシュボタン
- マイクロSDカードソケット
- 赤外線送信機
- 20pin外部コネクタ
- 加速度センサ
- USBコネクタ(通信用とデバッグ用)

ほんと、すごいです。

8/10 追記 タイトルがST32になっていたのでSTM32に修正しました。秋月でも取り扱いが始まっています(記事)。

e-DISP

2009-07-13 21:43:32 | 電子工作
エレキジャックに「新製品 携帯電話のリユース液晶を使ったディスプレイ」という記事が出ていました。



(株)ディーディーエルという会社のe-DISPという液晶モジュールの紹介の記事です。制御線が1本だけで、漢字が表示できる液晶とコントローラが一体になったモジュールです(解像度は320x240)。何種類か製品があります。データシートを見てみると、電源は5Vですが、2.0V以上をHとみなすので、3.3V系のマイコンにつなぐことも可能です。データシートに載っている裏面の写真は中央に大きくICがいますが、フラッシュメモリのようです。コントローラが何かは分かりません。たぶん基板と液晶の間に挟まれているのだと思います。一番安いのってマイクロSDのソケットついてるのかな?他のはついてるっぽいです。
シリアルをつないで、出力するだけなので、たいていのマイコンで使えそうな一品です。5V可なので、Arduinoでもいけます。


diceをSystem Verilogに書き換えてみました

2009-07-12 22:15:51 | FPGA
diceをverilogに書き換えてみました」の続きになります。FPGAの部屋のmarseeさんが書かれたコードを別の言語に移植する第2弾です。元のコードはこちら(ISE11.1iのチュートリアル1(導入編))です。marseeさんのverilog 2001版はこちら( diceのVerilog版)になります。

LatticeのispLEVERではSystem Verilogが使えます。正確に言うとispLEVERは論理合成を外部ツールであるSynplifyに丸投げしていて、SynplifyではVerilog 2001やSystem Verilogを使えるということになります。ispLEVER自体はVerilog 1995しか分からないのですが、論理合成済みのEDIFファイルを入力としてやることでispLEVERがSystem Verilogを理解できなくても、論理合成の後の配置配線等を行えることになります。

ispLEVERでプロジェクトを作るときにEDIFファイルを入力するようにします。その後Synplifyを起動してEDIFファイルの名前を指定してやります。注意点としてはEDIFファイルのSynplifyのデフォルトの拡張子が.ediでispLEVERの方は.edfになっていることです。

System Verilogにしてみたdiceです。(<は全角です)。
// dice_top.vhd
`default_nettype none

typedef enum logic [2:0] {
    ST1, ST2, ST3, ST4, ST5, ST6
} STATE;

typedef struct packed {
    logic a_n, b_n, c_n, d_n, e_n, f_n, g_n;
} SEVENSEG;

module dice_top (
    input reset_sw,
    input clk,
    input roll,
    output [3:0] an_n,
    output a_n, b_n, c_n, d_n, e_n, f_n, g_n,
    output dp_n);

    logic roll_sig; // とりあえずなんでもlogic
    logic roll_ena;
    STATE state;

    assign an_n = 4'b1110;
    assign dp_n = 1'b1;

    reject_chatter inst_reject_chatter (
        .* // パラメータ完全省略
    );

    dice_state_machine inst_dice_sm (
        .*,
        .roll(roll_sig) // 違う所だけ書くのもあり
    );

    seven_seg_dec inst_seven_seg_dec (
        .state(state), // 全パラメータ記述
        .ss({a_n, b_n, c_n, d_n, e_n, f_n, g_n}) // packed構造体渡し
    );

endmodule

// reject_chatter.vhd
module reject_chatter (
    input reset_sw,
    input clk,
    input roll,
    output roll_sig,
    output logic roll_ena);

//  parameter frequency_KHz = 1;
    parameter frequency_KHz = 50000;
    parameter divided_200Hz = frequency_KHz * 5;

    logic [17:0] sw_cnt;
    logic [1:0] roll_cnt;
    logic roll_node;

    // 200Hz, 5ms
    always_ff @(posedge clk, negedge reset_sw) // FF指定 コンマ区切り
        if(~reset_sw)
            sw_cnt <= 18'h0;
        else if(sw_cnt == (divided_200Hz - 1))
            sw_cnt <= 18'h0;
        else
            sw_cnt <= sw_cnt + 1;

    always_ff @(posedge clk, negedge reset_sw)
        if(~reset_sw)
            roll_node <= 1'b1;
        else if(sw_cnt == (divided_200Hz - 1))
            roll_node <= roll;

    assign roll_sig = roll_node;

    // 50Hz, 20ms
    always_ff @(posedge clk, negedge reset_sw)
        if(~reset_sw) begin
            roll_cnt <= 2'b00;
            roll_ena <= 1'b0;
            end
        else if(sw_cnt == (divided_200Hz - 1))
            if(roll_cnt == 2'b11) begin
                roll_cnt <= 2'b00;
                roll_ena <= 1'b1;
                end
            else begin
                roll_cnt <= roll_cnt + 1;
                roll_ena <= 1'b0;
                end
        else
            roll_ena <= 1'b0;

endmodule

// dice_state_machine.vhd
module dice_state_machine (
    input reset_sw,
    input clk,
    input roll, roll_ena,
    output STATE state); // enum出力

    always_ff @(posedge clk, negedge reset_sw)
        if(~reset_sw)
            state <= ST1;
        else if(roll & roll_ena)
            unique case(state)
            ST1 : state <= ST2;
            ST2 : state <= ST3;
            ST3 : state <= ST4;
            ST4 : state <= ST5;
            ST5 : state <= ST6;
            ST6 : state <= ST1;
            default : state <= ST1;
            endcase
endmodule

// seven_seg_dec.vhd
module seven_seg_dec (
    input STATE state,
    output SEVENSEG ss);

    always_comb // 組み合わせ回路指定
        unique case(state) // uniqueなcase
        ST1: begin
            ss.a_n = 1'b1;
            ss.b_n = 1'b0;
            ss.c_n = 1'b0;
            ss.d_n = 1'b1;
            ss.e_n = 1'b1;
            ss.f_n = 1'b1;
            ss.g_n = 1'b1;
            end
        ST2: ss = 7'b0010010; // こんな書き方もあり
        ST3: ss = 7'b0_0_0_0_1_1_0;
        ST4: ss = {1'b1, 1'b0, 1'b0, 1'b1, 1'b1, 1'b0, 1'b0};
        ST5: ss = 7'b0100100;
        ST6: ss = 7'b0100000;
        default : ss = 7'b1001111;
        endcase
endmodule

意味もなくSystem Verilog固有の機能を使いまくっています。かなり無理矢理みたいなところもあります。

使ったSystem Verilogの機能です。
- logic。regとかwireは全部logicと書けます。VHDLのsignalみたいです。
- enum。Cのenumみたいなことが書けるようになりました。VHDLのtypeみたいなものです。
- typedef。やはりCの型の再定義であるtypedefが書けます。
- struct。構造体が使えます。構造体にはpackedとunpackの2種類があります。packedにすると、Cのフィールドみたいな使い方ができるようになります。
struct packed { logic x, y; } s;だと、s.x、s.yを個別にアクセスすることもsとして2ビットの変数にアクセスすることもできます。
構造体があることの利点は、詳細を隠すことができる点です。今回で言うと出力を7セグメントのLEDにしてますが、別の出力装置に変更したときに、構造体の中身と7セグメントデコーダの中身だけ書き換えて信号の増減を見かけ上隠すといったことができます。この手の隠蔽の仕組みはソフトではよく使われていて、詳細を隠すことで、後で書き換えやすくしたり、理解しやすくしたりします。
System Verilogにある別の隠蔽の仕組みはinterfaceです。これはCPUのバスみたいなものをパッケージにしたものです。
- インスタンスのパラメータの省略。.a(a)みたく信号名と渡す変数名が一致するときは.*として一気に省略できます。名前が違うものだけ記述することもできます。.b(c)だけ書きます。
- always_ff。フリップフロップにすることを指定したalwaysです。
- always_comb。組み合わせ回路にすることを指定したalwaysです。
- unique case。並列処理できることを指定したcaseです。他にpriority caseがあります。同じくunique ifとかpriority ifなんかもあります。

今回使ったのは、どちらかというと、本質的ではなく見かけの違いだけです。しかし言語というのは実は見かけが一番重要です。要は、言語の良さって、かっこよく書けるかどうかだけです。よく言われる生産性みたいな話でいうと、同じことを記述するのに何行で書けるかが一番重要ということになります。センシティビティリストにちゃんと全ての変数が書かれているかをプログラマがチェックするなんて、はっきり言ってありえません。機械の方が得意なことは機械にやらせた方がいいんです。その意味ではVerilog 1995よりはVerilog 2001の方が好きですし、さらにはSystem Verilogの方が好きです。

ところで、Verilog 2001で、`default_nettype noneを指定したとき、regでないinputとかoutputにinput wireとかoutput wireって書いた方がいいんでしょうか?xst、Veritak、Symplifyなんかはinput wireじゃなく、inputだけでも怒られないんですが、某論理合成ツールではinput wireと書かないと怒られるんだそうです。

論理合成結果は28sliceでした。

ちなみに、ステートマシンをワンホットにするには、以下のようにtypedefを変更するだけでいいです。
typedef enum logic [5:0] {
    ST1 = 6'b100000,
    ST2 = 6'b010000,
    ST3 = 6'b001000,
    ST4 = 6'b000100,
    ST5 = 6'b000010,
    ST6 = 6'b000001
} STATE;

論理合成結果は30sliceになりました。今回は元のverilogと違ってstateを直接デコードするようにしたので6入力セレクタができたせいだと思います。LUTが4入力1出力であることを考えると、3ビットの中間コードに落としているmarseeさんはFPGAのことを知り尽くしていると思いました。
非同期リセットを同期リセットに変えると27sliceに減ります。Synplifyは内部的にstateをワンホットに書き換えているので、stateをワンホットにしても同じです。非同期リセットのとき書き換えないのは謎です。

どちらかと言うと、せっかくSystem Verilogを使うんだったらassertionを使わないと意味ないですね。

DSUB25pin、2.54mm2列26ピン変換

2009-07-12 18:01:22 | その他
小ネタです。

PCのジャンクでたまに見かける↑みたいなのですが、オス-オスのジェンダチェンジャを使えば、あっというまにDSUB25⇔26pinの変換になっちゃいます。ついでにDSUB9ピン⇔10pinの変換も手に入りました。

ジェンダチェンジャは秋月でも売ってます(C-00046)。こちらは400円ですが、千石だと310円で買えました(確か2号店?)。

SparkfunのNokia6100新キャリーボード

2009-07-11 20:45:46 | 電子工作
スイッチサイエンスさんでNokia6100液晶のキャリーボード(Sparkfun製)の販売を始めるということで、商品ページ(ノキアカラー液晶ピッチ変換モジュールという商品名です)を見てみました。あれ、なんか形が違う。ボタンついてる?

私が以前ストロベリーリナックスさんから買ったものと明らかに形状が違います。
どうも新バージョンになっているみたいです。ストロベリーリナックスさんにも「基板の形状が変わりました。2009.6.1更新」と書かれています。へえ、知らなかったー。
新基板では、ボタンが2つとフルカラーLEDが1個搭載されています。昇圧用のICがTIのTPS61040から、MC34063SMDに変更されています。以前との違いはバックライトLEDのための昇圧回路の入力が独立していることです。以前のは3.3Vから全てまかなっていましたが、新しいのはバックライトLEDだけ別電源からの入力が可能です。

Sparkfun製品ページ