AVRのconst
AVRの定数をflashに置く
以前、flashにconstを作るときには、よく分からずにやっていたが、やり方が分かったので、書いておこう。まず、宣言のところでは、型の後に"PROGMEM"を入れるか、“prog_“が頭についた、flash専用の型で宣言する。以前のプログラムでは、
const prog_uint16_t number[0x60];
としていた。次に、定数の値を読むときには、pgm_read_byte, pgm_read_word,pgm_read_dwordを使う。
p=pgm_read_word(&number[c-0x20]);
などと、アドレスを引数にする必要がある。宣言はさておき、読み取るときの命令が面倒だと感じる。今後、定数を使うときには、flashを有効利用するようにしよう。
二年越し
AVRでデジットの液晶 二年以上前に、日本橋のデジットで買った規格の分からない液晶を動かすことに成功した。と言っても、私が解析したわけではなく、先人の解析を元にプログラムを書いただけである。液晶は裏にIN50175Hという刻印のあるもので、買った当時検索したが、何も分からなかった。最近検索すると、解析結果が分かったので、動かしてみた。 14セグメントの文字が8文字と9個の記号が表示できる。信号は三本で、各セグメントのon/offをクロックに合わせて送って、その後で表示を指示する。難しいのは、セグメントの順番が、一つの文字で連続していないことだ。いろいろと試行錯誤の結果できあがったattiny2313をつかって表示させるプログラムがこれ。
#include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000 /* 1MHz */ #include <util/delay.h> #include <avr/pgmspace.h> /* lcd controller for IN50175H */ // PORTB #define LATCH 3 #define DATA 4 #define CLOCK 5 // 1 Vcc // 2 NCC? // 3 NCC? // 4 latch // 5 data // 6 clock // 7 GND #define setbit(PORT,BIT) PORT|=_BV(BIT) #define clearbit(PORT,BIT) PORT&=~_BV(BIT) #define checkbit(PORT,BIT) (PORT&_BV(BIT)) static volatile unsigned char buf[20]; //static char segsign[14]={1,1,1,1,0,0,0,1,1,1,1,0,0,0}; /* 1:+,:-*/ static unsigned char offset[14]={1,2,3,4,72,71,70,81,82,83,84,152,151,150}; //static unsigned char chars[9]={36,78,79,80,116,117,118,119,120}; unsigned char seg(char c,char s){ /*c:0-7, s:0-13*/ // return c*4*((segsign[s]==0)?
液晶の修理
また壊れた
久々に秋葉に行って、部品を買ってきた。以前修理した液晶のディスプレイを修理するために、トランジスタを買ってきた。以前と同様に、2SC5707が壊れたので、その代わりに2SC3709Aを買って、入れ替えると、一応うまくバックライトが点灯した。しかし、直ったと思って組み立て終わって、もう一度チェックすると、また同じ症状になってしまった。一度取り替えた2SC5707がもう一度壊れているので、その原因が別にあるのだろう。トランジスタを取り替えると、しばらくはうまくいくが、また壊れる。今回もそれを再現したのだと思う。その原因を見つけないと、根本的な修理にはならないのだが、どうやってみつけようか。部品取り用の基板もあるので、あやしい部品を総とっかえしてみようかな。
2010/6/15追記
昨晩、もう一度動かしてみたら、普通にバックライトが点灯した。おかしいな、また壊れたはずなのに。どこかに浮いた半田でもあるのかな。もうしばらく様子を見ることにしよう。
impressiveでプレゼン
netbookで
これまで、プレゼンテーションが必要なときには、prosperで準備して、pdfに変換してacroreadで表示していた。知人がimpressiveというプレゼンテーションツールを使っていて、興味を持ったので試してみた。インストールはaptitude impressiveでできるが、日本語が表示できない。poppler-dataを入れると、表示できるようになる。しかし、非力なPCの場合には変換に時間がかかってしまう。ubuntuのレシピで工夫の仕方が紹介されていた。まず、
impressive --geometry 1024x768 -o presen presen.pdf
とすると、presenというフォルダに各ページがpngとして展開される。そして、実行するときには、
impressive -t none -c memory -g 1024x768 presen
とすると、変換に時間がかからなくなるので、快適に使うことができるようになる。しばらく使ってみることにしようかな。
引数の最後のカンマ
methodの引数と配列
rubyの引数を取るmethodでは、引数をカンマで区切って、丸括弧で囲む。
def test(*a)
puts a.class
end
などとすると、引数の数が可変になり、それが配列として受け取ることができる。このような場合に、引数を一行ごとに書いて、
test(
1,
2,
3,
)
などとしたくなるのだが、これだと最後のカンマの後に引数が無いのでエラーが起きてしまう。仕方がないので、これまでは
test(
1,
2,
3 )
と書いていたが、多少不便な点があった。例えば、2を除く時には行ごとコメントアウトすれば良いのだが、3を除くときには、少し書き換えなければいけない。これを回避する方法を見つけた。
test(*[
1,
2,
3,
])
と書くと、3を消すときも、一行コメントアウトすれば良いことになる。配列だと、最後のカンマは無視してくれることを利用している。しかし、引数を配列にしてから、もう一度展開するのは二度手間な気がする。そうするならば、初めから配列を引数にすれば良いのだが、必ず配列を渡すのも面倒な時もある。しばらくはこの書き方でいくことにしよう。
引越し完了
! tdiaryの更新
本日、Webサーバーの更新が行われた。rubyは1.8.5になったので、新しいtdiaryにした。見た目はほとんど変えていないが。ようやく基本的な設定が終わって、昔のデータも移し終えた。ユーザー権限では、apacheが作成したデータを書き換えられないので、細かい設定がうまくいかずに苦労した。新しいプラグインも使えると思うので、何か面白いものがないか探してみようと思う。少しずつスタイルを調整していこう。
tdiaryの引越し
webサーバーの更新
もうすぐ、このblogを動かしているサーバーが更新される。rubyも1.6から1.8になるようなので、新しいtdiaryを入れようと計画している。しかし問題なのは、データの移行である。まだtdiaryのデータ構造を理解していなので、この記事を投稿したときに、どのファイルのサイズが変化するか調べてみよう。
2010/5/30追記
201005.td2のサイズが変わったので、このバイナリが本文を記録しているファイルらしい。
Wineのfont
ttf-mscorefonts-installer
久しぶりにWindows用のソフトを使わざるを得なくなったので、仕方なくwineでインストールした。いざソフトを起動すると、いくつかのフォントが無いと言われた。aptitude searchでfontとmsで検索すると、ttf-mscorefonts-installerというものが見つかったので、インストールしてみたら、フォントが無いというエラーは無くなった。これでwineでうまく動くと良いな。
AVRのwait
ループは無視か
久々にAVRをいじって、制御用の装置を作っている。tiny2313をつかっているのだが、waitをかけるのに苦労した。昔はひたすらループを作っておいて、適当な時間になるように調整したら、うまくいった気がするのだが、なぜか数マイクロ秒しかかからない。コンパイラが最適化してしまってうまくいかないのかな。仕方が無いのでタイマーを使おうとしたが、割り込みを禁止していたので、うまく動かない。いろいろと調べていたら、ウェイトをかけるルーチンがあるようだ。
#define F_CPU 1000000 /* 1MHz */
#include <util/delay.h>
と宣言しておくと、_delay_us(100)とすると、マイクロ秒単位でwaitが指定できる。_delay_msも使えるようだ。これを使ったら、思ったとおりの挙動をしたが、装置の完成にはもう少し調整が必要なようだ。
rubyとpythonのnumeric
数値に関するコマンドの違い
数値に関するpythonとrubyコマンドをまとめてみた。通常の演算を除くと、意外に少ないが、これ以外にもいろいろとあると思う。
python | ruby
|
n=9999999999L | n=9999999999
|
0177 | 0177
|
0xff | 0xff
|
3+4J | Complex(3,4) (require "complex")
|
oct(314) | 314.to_s(8)
|
hex(314) | 314.to_s(16)
|
int('111',8) | '111'.to_i(8) or '111'.oct
|
int('111',16) | '111'.to_i(16) or '111'.hex
|
これで、もっともよく使う四つのオブジェクトの概要がなんとなく分かったので、あとはフロー制御を覚えれば、pythonで簡単なプログラムを書けるようになるかな。それとファイル操作も必須かな。