人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

2016年 08月 21日 ( 3 )

(2018/1/31 修正)
Gtags -f %が間違っていた。%の後の半角スペースを削除する。
(ここまで)

(2016/8/25 修正)
前々回の記事で、arduino IDEの「analogWrite」関数はPWMか?という事で、
arduino1.0.5-r2のソースをダウンロードして、(必要なかった)自動的にctagsのような物を作って解析しやすくしてくれるGNU Globalというツールを入れてみた。
下の方にArduino 1.0.x の source code に arduino-1.0.5-src.tar.gzがあるので、有名どころの解凍ツールならtarもgzipもサポートしてるのでそれで解凍。

このあとWindows10 Anniversary Updateで入れたBashとX-Windowで、lxterminalを起動して、GNU Globalをapt-getする。
Ubuntuが入っているので足りないパッケージはその都度入れてもらうとして、コンソール上はほぼフルに動く。

まずはBash on Ubuntu on WindowsのショートカットとVcXsrvのショートカットを起動して、Bash起動。
lxterminal &
sudo apt-get install global (だったかな?)
こちらのサイト様を参考に。
[Linux][開発] GNU GLOBALとvimで快適な開発環境を手に入れる
cd /mnt/c/(arduino-1.0.5-r2のソースを展開したディレクトリ)/arduino-1.0.5-src
global -v

cd /mnt/c/(ソースではなくarduino-1.0.5-r2自体を展開したディレクトリ)
gtags
ls -CでGPATH 等の解析結果が出来ていることを確認。
プロンプトが長いので別シェル起動。
sh
試しにanalogWriteをチェック
global analogWrite
global -x analogWriteで詳細。
cd /usr/share/doc/global/examples
gzに圧縮されておいてあるのでホームへコピー
mkdir -p ~/.vim/plugin
cp gtags.vim.gz ~/.vim/plugin
cd ~/.vim/plugin
gzip -d gtags.vim.gz
あと次の内容を .vimrc に書込み。

map <c-g> :Gtags
map <c-h> :Gtags -f %<cr>
map <c-j> :GtagsCursor<cr>
map <c-n> :cn<cr>
map <c-p> :cp<cr>
<>は半角にする

元のディレクトリに戻るためにシェルを終わらせる。
exit
最初の解析済みディレクトリに移動したので、
vi .
viとの連携はこちらのサイト様を参考に。
GNU GLOBALとvimで巨大なコードでも快適にコードリーディング

あとは色々参考にして。ctagsはUnix/LinuxのツールだがSystem Vにはあったが最近はどうだっただろうか。lintとかもなくなったような気が。秀丸にもtagsを作る機能があるのでそれを使えばこれよりは機能は少ないが関数ジャンプくらいは出来たはず。grepがキー割り当てが惜しいのでctl+Gを再割り当てすればよい。
sakuraエディタもctagsを持って来て入れれば関数ジャンプや変数定義参照は出来る。Grepもあるし、検索に正規表現をONにし、ベースディレクトリ表示ONにすればctl+Gで呼び出せるし、さらにアウトライン解析をメインウィンドウにドッキングするとgrep結果画面でメソッドツリーという関数一覧が出てかなり使える。
あれ?globalいらない?

globalなら
vi .
ctl+G
analogWrite
で行ける。

sakuraエディタなら、
[開く][Arduino.h(何でもいい)]
ctl+G
検索キーワードにanalogWrite、ディレクトリに現在のディレクトリを選んで実行。
1行ずつしか表示されないgrep結果からアタリを付けて選ぶ。
アウトライン解析(あらかじめ実行)画面から関数名analogWriteを選ぶ。

globalの方が手数は全然少ないし、アタリを付けなくてもダイレクトに正しい定義に飛ぶ。調べたい単語のどこにでもカーソルを置いてctl+Gで、さらにEnterキーでその単語を補完してくれるので、入力も省略できる。
不便でいいならWindows上だけでいいが、やはりglobalの方が圧倒的に早い(キーを覚えるのはちょっと大変かも)。(ctl+I,Oで進む戻る :q 2回で終わるなど)

結局digitalWriteを0と255の時使って、中間値は下のようにタイマーでPWMをセットしてる。
// connect pwm to pin on timer 0
sbi(TCCR0, COM00);
OCR0 = val; // set pwm duty
アナログ出力をデジタル的に実現している。

あー、エディタはMS ゴシックが欲しいな。

by k1segawa | 2016-08-21 21:41 | X-Window | Comments(0)
前の記事の続きだが、LEDが光らなくて 部品を壊したかと思ったら、ブレッドボードの配線に使ってる百均のガーデニング用品の0.5mmワイヤーかまたはLEDが接触不良だった。ビニール被膜もあり、安くて重宝していたのだが、カット済みのしまいこんでいたのが錆びていたのかもしれない。

LEDの足と一緒にサンドペーパーでこすった。
ボタン電池で動くセットを作っておいてよかった。部品を入れ替えて動作確認できた。
昔は部品の足をやすりで磨くとか基本中の基本だったなあ。

蛇足:
そうそう、ATtiny13のデータシートだが、12ページにアセンブラとC言語の比較ソースが載っている。
EEPROMの例だが、Cはアセンブラと1対1で対応している。
だからCソースのマクロはアセンブラの命名規則を踏襲しているのか~
Cなら以下のような殆ど似たようなマクロ名なら意味が同じはずなんだが、
EECR |= (<<EEPE);
このEECRはアセンブラではレジスタ名で、EEPEはビットを表す数値。
上のマクロは一瞬EECRっていう変数にEEPRの値をシフトして代入するのかと思うよ。
でもEECRは、*EEPROM_REGSTORっていう定義になってるはず。
アセンブラなら、
LDI EECR, EEPR で(LDIは何でもいい)
左のEECRはレジスタ名で、EEPRは値。
マクロ定義はアセンブラソースを置き換えているから実はポインタなのに変数に見えるのか~
やー、80系アセンブラは確かに「第一オペランド←第二オペランドを代入」が多いから、
こんなマクロになるのだろうけど、他のCPUはそうでもないんじゃないだろうか。

脱線:
ということで68系のCPUのアセンブラを調べてたら、X68000のADPCMですごい事をやってた人がいたらしい。
Z80 vs 6502 - 魔法使いの森 Programming Tips
こちらのサイト様の「X68k の PCM8 など、膨大なテーブルを導入して、誰もが「リアルタイム処理は無理」と考えていた処理を実現している例もある」の方(故人)は、リンク先に詳細があるが、1声しかないADPCMで同時に4声出すという素晴らしい音楽演奏ドライバを作成された。
たぶんリンク先のページの上の方にあるようにX68000のゲーム「ボスコニアン」は他の機種よりずっと音がよかった。

テーブルゲーム ボスコニアン BGM - Youtube


X68000 ボスコニアン サウンドトラック - Youtube



by k1segawa | 2016-08-21 20:03 | arduino, AVR | Comments(0)
(2016/8/25 Pin 5を6に修正)
まずはPWMをやってみる。
a0034780_13004029.jpg

この図からPin 5,6のPB0,1がOC0A,0Bという機能で、PWMに出来るピンらしい。
Pin 2,3,7のPB2,3,4がADC1,2,3となってるのでこちらかと思ったが、このピンを指定してもON/OFFにしかならなかった。いやいやADCだからアナログ入力でしょ、って。
実際ICはデジタル入出力は得意なのだが、アナログ入出力は昔のICでは外付けの回路だった事が多い。
だからATtiny13でアナログ入力を4ポートもサポートしているのはさすが最近のICという感じだ。
で、アナログ出力もと考えるけど、それは今でも本当のアナログ出力は高周波やインピーダンスなど色々複雑なので、内蔵されているICはプロの使うようなICにしかない。

だから普通ICには、デジタルでアナログ出力をエミュレートするPWM機能を載せている。
ATtiny13のOC0A,BというのがPWM0,1の事で、Output Compare(比較出力器)の省略形で、タイマーと一緒に使うPinだ。
こういうマイコンで必ず出てくるタイマーとコンペアというキーワード、それがPWMの正体。そしてarduino IDEのanalogWrite関数の実体(のはず)。

だから、アナログ出力したいと思ったらOCかPWMというPin機能を探すといい。
ATtiny13のデータシート - (日本語のPDFファイル)にもPWMとは記述されておらず、タイマーとかコンペアとしか記述されていないのだ。

BASCOM-AVRで最初試みたが、アナログ出力とは書いておらず、タイマーやコンペアの機能がマイコンそのもので、そこの所慣れていないためよくわからなかった。
arduino IDE の [ファイル][スケッチの例][03.Analog][Fading]を開き、
int ledPin = 9→1に変更し、回路をPin 2(PB3:ADC3)→Pin 5Pin 6(PB1:OC0B)に繋ぎ直して(ややこしい)、実験。
ゆっくりフェードアウト、フェードインし出した。
(ここまで来るのに実はPin 2=PB3:ADC3につないで単に遅いON/OFFだったのでおかしいなと思っていた。色んなサイトを回ってやっとわかった。OCってなんだよーって事。)
やっぱりarduino IDEは簡単だ。アナログ出力は単にanalogWrite関数でいいんだから。まあPWMのピンを使ってる事を理解してないと指定もできなかったけどな。

それにしても遅くないか?
フェードアウトがゆっくり過ぎて消えないのかと思った。
どうも分周比とやらを遅くしてしまったか。分周比というのはICが動作する周波数をさらに1/1,1/2,1/4,1/8等に間引いて動作するように設定する機能のようだ。遅いのはたぶん1/8にしてしまったのだと予想される。
もしくは動作周波数が1MHzになっているかだ。出荷時は遅いらしいが、fuseビットを書き換えると9.6MHz(大体合ってる)に高速化できる。fuseビットは間違えると、このjapanino に書込んだスケッチarduinoISPで出来たライタ(ややこしいがプログラマとも言う)では書き換えられなくなってしまう。12Vを必要とするのだ。

ん~、とりあえずPWMはarduio IDEでは動作出来るのだから少しdelayを減らしておくか~。30→3にしたらちょうどよかった。
容量的に大丈夫だったのかな?ログをさかのぼって見ていくと、avrdude: 958 bytes of flash verified とある。ギリギリだ。


by k1segawa | 2016-08-21 13:15 | arduino, AVR | Comments(0)