免責事項

注意、免責事項について
・高電圧、大電流その他高エネルギを扱う実験を行う際にはくれぐれも安全に配慮し、細心の注意を払って行うようにしてください。
・当ブログの記事を参考にして発生した損害についてFEL研究室はいかなる責任も負えませんでご了承ください。
ラベル AVR の投稿を表示しています。 すべての投稿を表示
ラベル AVR の投稿を表示しています。 すべての投稿を表示

2018年12月15日土曜日

Aliで買ったATmega8が動いた

こんばんは。KKTの方です。
前回の続きで題名の通りパチもん(?)のmega8が動きました。

画像が90度回転させられてしまっていますが左が今回Aliで購入したチップで右が本物(たぶん秋月)です。前回書いた通りプログラム書き込みはできたのですが果たして動くのか。

タイマーモジュールでLチカしてみたところ問題なく動きました。
余談ですが、PINxレジスタに1を書き込むと対応するPORTxレジスタのビットが反転するっていう機能はAVRマイコン標準だと思っていたのですがmega8には無いんですね。あると信じ込んで動かないなぁと思っていたらデーターシートにはPINxは読み出しのみと記載がありました。
他のペリフェラルはまだ試してませんがこの感じだと動きそうですね。よかった。

それでは、今日はこの辺で
http://clap.webclap.com/clap.php?id=fellabo

2018年12月9日日曜日

Aliで買ったATmega8が届いた

こんにちは。KKTの方です。
特に進捗が無いので買い物記事になりました。

AliExpressで買ったATmega8が届きました。

静電気対策とかしてらっしゃるんですかね

近づいて写真取るのがめんどうだったので刻印が写っていませんが明らかに本物とは違うので動くか心配になってきました。

 試しに適当なソースを書き込んでみたところ、普通にシグネチャも返って来て書き込めました。普通に使えるじゃん

また後日他の個体やピン、ペリフェラルのチェックをしようと思います。

それでは、今日はこの辺で
http://clap.webclap.com/clap.php?id=fellabo

2018年12月7日金曜日

W5500モジュールを動かしてみる

ご無沙汰しております。KKTの方です。
季節の変わり目ですから体調を崩される方も多いかもしれませんが如何お過ごしでしょうか。私は既に2回くらい軽い風邪をひきました。

さて、世間はIoT一色ということで流行に乗って私もインターネットなるものに自作機器をつなぎたくなってきました。そこで、マイコン等で簡単にLANに繋げて遊べるものはないかと探していたところWiznetという会社からEthernetの便利なICがあったので紹介します。
W5500
https://www.wiznet.io/product-item/w5500/ 
ネットワーク初心者なので用語がいまいちよくわかっていないのですが、簡単に言うとW5500に対してSPIでいろいろ書き込んでやるだけでTCP/IPで他の機器と情報をやり取りすることができるようです。DIPパッケージは無く、QFPだけみたいなので今回はモジュール化されたものをAliで購入しました。激安でビビりました。
で、届いたのがこちら

いいじゃん。

本当はもうちょっと突っ込んだ記事を書くつもりでしたが力尽きたのでまた次回詳細は書こうと思います。ちなみに現在はATtiny13AでW5500と通信させて簡易httpサーバーにするところまでできました。

それでは、今日はこの辺で


http://clap.webclap.com/clap.php?id=fellabo

2018年2月4日日曜日

AVRで正確にタイマー割り込みを使いたい

お久しぶりです。随分と間が空いてしまったような気がします。
日付が変わったところですが、昨日は節分という祝日でした。豆まきをしたり、恵方巻きを食べたりするのが一般的ですが、私はスパゲッティを食べたことを報告しておきます。

AVRでタイマー割り込みを使う時に、普段はメインルーチンを回していて、一定期間ごとにタイマー割り込みが入るような構成になることがよくあると思います。しかし最近、そんな感じのプログラムを組んでいて、タイマー割り込みを使っているのに何故か僅かに割り込みの周期が遅れる現象に嵌ったので、原因と解決方法(?)を書き留めておくことしにしました。

まずATMega8にこんなアセンブラのプログラムを書き込んで走らせてみます。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
.include "m8def.inc"

//ATmega8 lfuse = 0xe1 = 0b1110_0001 hfuse = 0b1101_1001
//10MHzのセラロックで使いたいので lfuse = 1100_0011 hfuse = 0b1100_1001
//avrdude -c avrisp -P COM12 -b 19200 -p m8 -U lfuse:w:0b11001111:m -U hfuse:w:0b11001001:m

.EQU fclock = 10.0//[MHz]
.EQU freq = 15.734//[kHz]
//.EQU timervalue = (fclock/freq)*1000.0

//こうしたいがEQUシンボルは4バイトINT型
.EQU Htime = 635//[cycles]

.DEF temp = R16
.DEF temp2 = R17

.ORG $0000
    RJMP RESET ;各種リセット
    RETI//RJMP EXT_INT0 ;外部割り込み要求0
    RETI//RJMP EXT_INT1 ;外部割り込み要求1
    RETI//RJMP TIM2_COMP ;タイマ/カウンタ2比較一致
    RETI//RJMP TIM2_OVF ;タイマ/カウンタ2溢れ
    RETI//RJMP TIM1_CAPT ;タイマ/カウンタ1捕獲発生
    RJMP VideoOut//RJMP TIM1_COMPA ;タイマ/カウンタ1比較A一致
    RETI//RJMP TIM1_COMPB ;タイマ/カウンタ1比較B一致
    RETI//RJMP TIM1_OVF ;タイマ/カウンタ1溢れ
    RETI//RJMP TIM0_OVF ;タイマ/カウンタ0溢れ
    RETI//RJMP SPI_STC ;SPI転送完了
    RETI//RJMP USART_RXC ;USART受信完了
    RETI//RJMP USART_DRE ;USART送信緩衝部空
    RETI//RJMP USART_TXC ;USART送信完了
    RETI//RJMP ADC ;A/D変換完了
    RETI//RJMP EE_RDY ;EEPROM操作可
    RETI//RJMP ANA_COMP ;アナログ比較器出力遷移
    RETI//RJMP TWI ;2線直列インターフェース状態変化
    RETI//RJMP SPM_RDY ;SPM命令操作可

Reset:
    LDI R16,high(RAMEND)
    OUT SPH,R16//スタックポインタ上位設定
    LDI R16,low(RAMEND)
    OUT SPL,R16//スタックポインタ下位設定
//スリープ設定
    LDI temp,(1<<SE)//アイドル動作に設定する
    OUT MCUCR,temp
//タイマ設定
//16bitレジスタに書き込む時は上から
    LDI temp,high(Htime)
    OUT OCR1AH,temp
    LDI temp,low(Htime)
    OUT OCR1AL,temp
//TCCR1Aは初期値のまま
    LDI temp,     (0<<COM1A1|0<<COM1A0|0<<FOC1A|0<<FOC1B|0<<WGM11|0<<WGM10)
//タイマA比較一致有効
    OUT TCCR1A,temp
    LDI temp,(0<<TICIE1|1<<OCIE1A|0<<OCIE1B|0<<TOIE1)
    OUT TIMSK,temp
    LDI temp,

(0<<ICNC1|0<<ICES1|0<<WGM13|1<<WGM12|0<<CS12|0<<CS11|1<<CS10)
    OUT TCCR1B,temp
   
    LDI temp,(1<<PD0)
    OUT DDRD,R16//PORTDの0ビット目を出力に設定
    SEI

Main:
    //SLEEP//待ち時間はスリープにしておく
    RJMP Main

VideoOut:
    SBI PORTD,0//high
    CBI PORTD,0//low
    RETI


↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

改行が微妙に入ってしまって読みにくいことこの上無いのですがどうしたら良いのでしょうか。
まずReset:で色々な初期設定をして、Main:を無限ループさせて一定時間ごとに入るタイマー割り込みごとにパルスを出すようなプログラムです。SBI、CBI命令はそれぞれ2クロック掛かるので出るパルス幅は2クロック分、クロックが10MHzなので200nsということになります。タイマー割り込みの周期はHtimeというシンボルに入れたサイクル数になるようになっていて、クロックと周波数から自動で計算しようと思ったのですがコメントにもあるようにシンボルは4バイトのint型なので小数点以下の計算ができずだいぶざっくりなサイクル数になってしまうので諦めてサイクル数は手計算しました。Htimeに入れる周期は理想のサイクルから2か3くらい引かないと、タイマー割り込みの固定的な遅延時間で遅れるのでご注意ください、ってデータシートにも書いてると思います。
ラベルでピンと来た人もいらっしゃるかもしれませんが、これはビデオ信号の水平同期処理をタイマー割り込みでやろうとした時のソースの一部です。
とまぁタイマー割り込みで一定周期のパルスが出るだろうと動かしてみると下のような波形が出力されました。
なんとタイマー割り込みが入るタイミングが一定ではなくちょうど200nsずれて入っている時があるようです。これは遅延掃引で62.7us立ち上がりから遅らせている波形なのですが、ズレの部分の明るさがさほど変わらないことからたまーに遅れる(ないし早く割り込んでいる)どころでは無く頻繁に割り込み時間が変化してしまっていることもわかります。私はこれで相当悩んだのですが、結論から言うと原因は割り込みが入った瞬間に実行している命令の影響です。
データシート(https://www.mouser.com/ds/2/268/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_dat-1065398.pdf)の16ページを見ると割り込みの応答時間についての記述があります。
"... If an interrupt occurs during execution of a multi-cycle instruction, this instruction is completed before the interrupt is served. ..."
複数サイクル命令の実行中に割り込みが入ると、 命令が実行され終わってから割り込みが入ります。とのことです。
1サイクル命令なら何の問題もないのですが、RJMPやBR**系のジャンプが入る命令は2サイクル掛かりますし、SB**系やLPM等は3サイクルかかるものもあります。つまりこれらを実行中に割り込みが入ると、命令を実行し終えるまで割り込みが入れないので遅延が発生することになります。タイマー割り込みって言うんだったら勝手に正確に割り込みが入ってくれたらいいのにと思ったんですがそんなに甘くは無いみたいです。
上のプログラムは、割り込み待ちの時に回しているループのRJMPが2サイクル命令なのでRJMP命令を実行している時には2サイクル遅れ、RJMPを実行する前なら遅れないので設定数値通りと2サイクル遅れたパルスが出力されているようです。なおタイマー割り込みの周期を1サイクル小さくするか大きくするとこのズレは無くなります。
解決策としては、割り込み待ちの処理の命令を全て1サイクル命令にするというのが一番本質的な解決になるような気がしますがまず無理なので私はスリープを使うことにしています。スリープが許可されている状態でSLEEP命令が実行されるとプログラムはそこでスリープ状態に入り、以後の命令は実行されません。そこに割り込み等が入るとスリープから復帰し、また命令を実行し始めます。スリープから復帰する時には4サイクル掛かるのですが、逆に言えばスリープに入ってさへいれば遅延が4サイクルに固定されるということです。ですので、予めこのサイクルをタイマー設定の数値に計上しておいて、タイマー割り込みが入る前にスリープにさせることで設定値通りの割り込みが実現できるのではないかと思います。

Web拍手反応
>海外からのアクセスすごそう
ほぼ無いですね

> 綺麗に立方体ならんかったやつほんま草
あれステレオの片方だけ作ったところでやばいなって感じて放置してあります。時々鳴らしてみたりするんですがなんとも。

> 今更なんですけどHF SSTCの記事投稿の予定ってあるんですか?
そうですねぇ…。予定と言ってしまえばどうとでもなるのですが、今のところ無いです。書きたい記事ではあるのですがいまいち全体として再現性のあるものになら無さそうで結局写真集みたいになっちゃうかもしれません。

> 電子工作について質問しても良いでしょうか?
先日「矩形波」を「くけいは」と読むと知り、びっくりしました。そこで不安になったのですが、「方形波」ってなんて読むんでしょうか?是非ご教授頂ければと思います。
そんなこと聞かなくてもいいです。

> いっぱいのおっぱいがいる
> マ
 ル
  ク
   ス
> あけましておめでとうございます。今年もFEL研究室をよろしくお願いします。
> なかた
おめでとうございます。マルクスのコメントは黙殺することにします。

> NTでは何を展示するんですか
NT京都2018に出展することにしました。KKTで申し込みしています。出展内容としては超音波関係の何か(未定)を持っていく予定です。また完成したら報告します。間に合わなければIHかテスラ持って行きます()。

それでは、今日はこの辺で
http://clap.webclap.com/clap.php?id=fellabo

2016年11月18日金曜日

I2C機能が無いAVRで秋月のLCDを動かす

KKTです…。まさかの連続更新です。
最近マイコンいじりたい欲が出てきているので今回もAVRの記事です。
毎度毎度次回予告から外れているのですが、今回は予告通りI2Cと液晶の記事を書きます。

急にLCDがいじりたくなったのですが、僕がよく使うATtiny13AではI2Cの液晶以外はピン数の関係で接続できません。しかし、ATtiny13AにはI2C機能はありません。
ということで、まずI2Cの仕組みを理解してから、アセンブラで同じ機能を実装することにします。I2Cの説明はggればいくらでも出てくるので割愛しまして、具体的にマイコンにやらせることをメモ的に書いていきます。使用したのは秋月のこの液晶です。

・ピンの設定
I2Cにはマスタとスレーブなるものがありまして、マスタが通信を統括して、スレーブはそれに従うというルールがあります。データの送受信はマスタスレーブ無関係ですので、マスタがデータを読みたいと言えばスレーブは送信を開始しますし、マスタがこれを読めと言えばスレーブはデータを受信します。
I2Cにはクロスストレッチ(クロックストレッチでした)なるものが存在していて、本来通信は全てマスタの言う通りに進めないといけないところ、どうしてもスレーブが忙しい時や送受信データを処理している時には、スレーブがクロックをLowレベルに固定してマスタを待たせることができるという機能です。
ということは、I2Cの信号ラインはLowレベルかHiインピーダンスの二通りということになります。AVRのピン設定では、Lowは出力ピンモードで、Hiインピーダンスは入力ピンモードにすればそれぞれ設定可能です。要はオープンコレクタ/ドレインみたいになれば良いということです。以下Hiインピーダンス状態をHi、LowはそのままLowと記述します。

・スタートコンディション
まずI2Cの信号ラインは何も無い時はクロック、データともHiで待機します。次にマスタとして通信を開始したいデバイスがデータをLowにしてからクロックをLowにします。
簡単ですね。ちなみにデータをLowにしてからどれくらいの時間待ってからクロックをLowにすれば良いというのは各デバイスのデータシートに書いてあると思います。

・ストップコンディション
スタートコンディション同様通信の終了も同じようなのがあります。今度はクロックをHiにしてからデータをHiにします。
簡単ですね。これに関する時間もデータシートにあると思います。

以上をアセンブラで実装するのはまぁ簡単ですね。I/Oレジスタのbit操作だけでできます。続いてデータ関連の話です。

・スレーブアドレス送信
通信がスタートされたら、まず最初にマスタが誰を相手にするか、というのを送信します。I2Cはマスタに対して複数のスレーブが存在することができますが、同時に通信できるのは1人なのでまず誰と通信するかを指定します。誰を差すのがスレーブアドレスと呼ばれる7bitのデータです。デバイスごとに固有の値が振られていて、これもデータシートに記載されています。そして、実際にデータを送信する時は、この7bitのデータの後に更にもう1bit加えて合計8bitのデータをまず最初に送信します。スレーブアドレスの尻尾に付け足した1bitはマスタが受信するか、送信するかの指定に使用します。RWなどと呼ばれているbitでマスタが送信なら0、マスタが受信なら1を書かれます。
後術しますがこの操作で呼ばれたスレーブは「いますよ」を返します。
上の図ではスレーブアドレスとして「0111110」を、RWのbitは「0」を送信しています(この液晶は読み出しは出来ないようです)。ですからデータはRW→スレーブアドレス0bit→スレーブアドレス1bit…というように下位から順番に送られていいきます。アセンブラの操作では、まずレシスタにスレーブアドレスにRWを加えた8bitデータを入れて、それを左シフトさせて順番にクロックに乗せていくという感じでしょうか。

実際に信号の波形を見てみるとこんな感じになります。
上がデータ、下がクロックです。手書き図同様0x7C(01111100)を送信しています。クロックがHiのときにはデータを変化させてはいけないので(→スタートコンディションになってしまう)注意しましょう。

・Acknowledge
ACK、アク、アクナレッジなどとも呼ばれます。認めるみたいな意味の英単語ですが、このbitはマスタ又はスレーブが発行する「正常にデータを受信しました」のしるしですね。最初スレーブを呼ぶときには「いますよ」のようなものです。実際にどのようにACKを出すのかというと先程の図の続きで見てみましょう。
詳細は省いてますがこんな感じになります。マスタ側はACKを確認するために、第7クロックを出し終えたらデータ線をHiにしておきます。もしスレーブが正常にデータを受信していたら、データ線をLowにし異常ならHiのままにします。よってプルアップのデータバスなのでLowが優先され、正常に受信出来ていていたらLow、異常ならHiということになります。ここでマスタが第8クロック目を立ち上げてACKを読みます。つまりマスタ側は第8クロックを立ち上げてLowなら正常、Hiなら異常とわかるわけです。この動作は8bit(モードによっては10bit)のデータを受信したらマスタ、スレーブ関わらず必ず行われます。実際にACKが返ってきている様子を以下に。
最後のチョンと出ているのがACKですね(ホントは出ない方が良いと思う)。最後のクロックの立ち上がりできちんとLowになっています。スレーブのLowはマイコンのポートほどシンク電流が流せないようで若干電圧が残っていますが許容内ですので問題ありません。最後のクロックの立ち下がりでデータがピョコっと跳ね上がっているのは、スレーブが「もういいかな」と思ってLowをやめたからだと思います。なおACKを確認した後はクロックをLow→データをLowにして待機させましょう。ACKを確認できなかったらこれから送信するデータ等も意味を成さないのでエラー表示するなりなんなりしましょう。実は最初に貼ったオシロのキャプチャと同じのを送信しているのですが、最初のはスレーブを繋がず、こちらはスレーブを繋いで撮影しました。
今回は省きますが、スレーブのプログラミングをする時は、スレーブアドレスと称号して合ってたらACKを出す、間違ってたら出さないというようにすれば良いと思います。その後のデータのやり取りでは、単にクロックを数えてちゃんと8クロック来てたらACKを出すようにすれば良いんじゃ無いかと思います。

・コントロールバイト
ここからは通信するデバイスによりますが、冒頭で書いた秋月のLCD準拠で説明します。LCDに送るデータには実際に表示させる文字データの他に、コントラストの設定値やDRAMアドレスの指定などがあります。これらを単に送るだけでは表示させたら良いのかコントラストの設定値に使えば良いのかわかりませんのでコントロールバイトというのを送ってから、データを送ります。コントロールバイトでは「この次に送るデータが(コマンド/DRAMアドレス/表示させるデータ)ですよ」というのを指定します。データシートを読むと書いてありますが、単一コマンドを送る前は「0x00」、連続コマンドを送る前は「0x80」、データを送る前は「0x40」を送ります。
もう少し詳しく書くと、コントロールバイトの次に送るデータをデータバイトと言って、さらにこのコントールバイトとデータバイトをまとめて「コントロールワード」と呼びます。つまり単一コマンド(=データバイトに書く)を送る場合は、0x00→任意のコマンドとなります。連続して送る場合は、0x80→任意のコマンド→0x80→任意のコマンド→0x80→任意のコマンド→…→0x00→任意のコマンド でおしまいとなります。要はコマンドワードを繰り返すかという感じです。この辺はよく分からなくてちょっと悩みましたね。

・データバイト
8bitのコントールバイトを送信し終わったら次はコマンドや文字データ等のデータビットを送信します。これと言った注意は無いです。

・初期化について
LCDのデータシートを見ると初期化処理は大体載っているのでこの通りすれば問題なく表示できます。しかし、僕がデータシート通りにやったところ、LCDのコントラストが異常に高く画面が■で埋められて文字が読めませんでした。色々いじっているとどうやら「Follower control」の値「6C」を「69」に変更することで解決しました。取り敢えず治りましたがよくわかりません。

他にも機能としてはCGRAMなどがあるのですが、まだやっていないのでよくわかりません。

ソースは縦に長いのでこちらのページに記載しました。興味のある方は御覧ください。
原理がわかれば処理自体は簡単ですので大したことは無いですが、待ち時間とかクッソ適当なのでもし参考にされる場合はご注意ください。あらぬところへジャンプしたり読みにくいですが、バグ等有りましたら報告していただけると助かります。
アセンブラの練習用にプログラム領域にデータ置いたりしてるのでたぶんまた解説記事を書くと思います。なんとなくコメントは書いてありますがあんまり真剣に見ないようお願い致します。

ちなみに上記のソースは実行するとこうなります。

Web拍手反応(もう届いているのか…(うれしい))
>おぱっい
プルンプルン!!

>◯◯たです
どう?


それでは、今日はこの辺で。

http://clap.webclap.com/clap.php?id=fellabo

11/26追記:誤字を修正 参考リンクを貼り忘れていたので貼っておきます。
 I2C通信の使い方:http://www.picfun.com/c15.html

2016年11月17日木曜日

AVR書き込み冶具を作ってみる

KKTと申します。
定期的に更新するのは難しいですね。
続きがあるっぽい記事をかなり放置していますがまた真新しいことを書きます。

今回は題名通りAVRマイコンを使う時の書き込み冶具を作ります。
今までは、ブレッドボードとかとArduinoを適当に配線して書き込んでいましたが、なんとなく取り回しとかが気に食わないのとマイコンを変えるたびに配線をいちいち差し替えないといけないのが面倒なのでZIFソケット(ワンタッチでIC外したりできるやつ↓)
こういう奴です。これで書き込んですぐ外して基板に付けたりできると便利じゃないかと。

で、できたのがこれ。
 一応ボード上で簡単な動作確認ができるように圧電素子スピーカとLED、セラロックと電源ラインくらいは付けてみました。チップによって書き込みに使う端子の場所がバラバラなのでチップによって右の方のコネクタの位置を変えないといけません。6pinのピンヘッダがそうです。上からATtiny13,AT90s2313,ATmega88系となっています。クロックを自分で生成できない子もいるのでセラロックを接続できるようにしています。
お気づきかもわかりませんが、使用しているカラフルなケーブルは8本線が出ているのに対し、ピンヘッダは6pinです。これでは挿し間違いが起きる可能性大です。対策として
コネクタの穴を半田で塞ぎました。これでコネクタの向きも含めて常識的な方向で挿せば動作するという感じになりました。

Arduinoと接続している様子。
そこそこ使いやすかなぁといったところです。

しかし、このボードを作っていざ書き込みテストを行ったところ、全く書き込めません。
どうやらArduinoのICSPピンからちゃんと信号が来ていないようです。
調べていくと、ICSP書き込みする際にターゲットのマイコンのリセット端子はArduinoのディジタル10番ピンに繋がないといけないのですが、Arduino側のリセットに繋がっています。これではいかんのでArduinoを少し改造しました。
PEWで直接10番ピンにバイパスさせます。

元のリセットと繋がったままだとまずいので、パターンもカットします。
最初間違えて手前のパターンをカットしてしまい(カットすべきは奥のピン)焦りましたが大丈夫なようです。

動きました。
使用した青LEDはおずやで分けて頂いたものです。感謝しています。

ついでに、ソフト側も少し使いやすくしてみましょう。
僕は最近までAVRStudioから出てきたhexファイルをコマンドプロンプトからいちいち指定してAVRdudeから書き込んでいたのですが、バッチファイルを使うと幾分楽に書き込めるみたいです。
メモ帳を開いて下のような文字を打って、保存する時拡張子を.batにします。ファイル名はなんでも良いです。

cd %~p1
avrdude -c avrisp -P COM7 -b 19200 -p t13 -U flash:w:%~nx1
pause


赤字にしたところは皆さんお使いのArudinoが繋がっているポート番号、緑字のところはお使いのマイコンの識別子(?)に読み替えてください。mega88ならm88です。
このファイルをデスクトップなり好きなところに置いて、AVRStudioから出てきたhexファイルをドラッグ&ドロップすると接続が正常なら書き込めるはずです。終わったら何か入力するように促されるのでなんでもいいのでキーボードのボタンを押すと終了します。
僕はこれをよく使うマイコンごとに幾つか用意して書き込んでいます。純正の書き込み機を使わないのはやはりこういうとこで手間ですね。

次回(次の記事とは限らない)予告

Web拍手反応
>すこ
おもしろスコープ

>今日誕生日です
>おめでとうございます(脅迫)
なかたくんもワイも誕生日遅いんよね

>ティッシュを被せる→バシュッって致してそう
被せるだ?

>わい!
芋!

>タイトル変わってててててててて
こっそり記事の通し番号ズレてたの直したけどバレちゃってたか…

>ピキッ!
パシュッみたいな音したような気がする

>なかた
なかたでぇ~す
なかたくん記事書かないなぁ

>だれかなぁ〜^^
ペロッ…これは…
クチビル^^

>み て い る ぞ
ジロジロ

>わんわん
わんわんお

>クワーッ!
ショベルカーが威嚇する時そんな音しそう

>ぽんぽんすき
ぽんぽんすき(宣伝)

>マルクス主義で対決?
マルクス思ってたよりも難しそうで困ってる。
なかたくんはどうかなぁ~?

それでは、今日はこの辺で。

http://clap.webclap.com/clap.php?id=fellabo

2016年9月26日月曜日

VVVFインバータ製作 その1

こ***は。KKTです。

身内ネタ失礼します(予告)。
先日なかたくんと何人かで「君の蟹。(きみのかにまる)」という映画を見ました。内容自体はとてもおもしろくて、感動しました。特に宮水家特有の妄言や、一見関係無さそうに見えることも実は”結び”であることなどが印象的でした(ネタバレを避けるためこれも妄言です)。
さて、カラフルなケーブルや虹色のフラットケーブルを見てると思い出すのがこれ
 
 そう、組紐です。靴紐の上位互換みたいな奴ですが、僕も結い方を調べて編んでみることにしました。今回は平結びという結び方にチャレンジしました。
 とても微妙ですね。なんか気持ち悪いです。

 あとケーブルが汚いです。本来は芯糸(赤い)が見えないようになるのが美しいようです。ケーブルが固かったので仕方ないような気もします。

次から出かける時はこんな感じでキメていこうと思います。
 これもまた結びということですね。


一応試してみる方のために参考ページです。
http://missanga.seesaa.net/article/102864479.html



雑談が長くなってしましたが本題です。
しばらく放置していたAVRマイコンを使ってVVVFインバータを作っていきたいと思います。グーグルさんに尋ねると作例はいくらか見つかりますが、あまり詳細な製作方法について述べてる記事は少ないようですので、製作作業の様子や試行錯誤などをできるだけ詳しく書けたらなぁと思います。たぶん僕のメモ書きみたいになります。以下ダラダラと説明が続きます。

まずVVVFインバータについてですが、直訳すると可変電圧可変周波数インバータということになります。今回は、三相モータ用のVVVFインバータを作ってみることにします。さらに電車の「ウーンウーン」みたいな音がして欲しいので同期式の部分もしっかり作ろうと思います。仕様はまだハードに手を付けてないのであまり決めてないですが
・入力AC100V
・モータ電圧200V
・出力周波数1~200Hz
みたいな感じにする予定です。出力周波数の上限が200Hzと高いのはACサーボアンプへの転用も考えているからです。交流同期モータは小さくてもパワーがあるのですごいです。

VVVFインバータを作るにあたって、一応VVVFの原理くらいは把握しておいた方が良さそうなので自分のメモ書き程度に触れておきます。
負荷が交流モータなので、インバータの出力周波数が重要になってきます。モータの回転角は周波数によって制御されるからです。しかし一般的なかご形三相誘導電動機は同期してない(回転数と入力周波数が完全に一致していない)状態でもすべりによりトルクが発生できるので、本当に回すだけなら固定周波数でも始動や運転ができます。というかぶっちゃけそれでもいいかなと思ってたんですがやっぱりGTOのVVVFみたいな音がして欲しいので可変周波数にしました。
実際にモータに印加される交流を生成するのはハードウェアのパワー回路なんですが、流石にA級やB級のアンプで純粋な交流の電力増幅を行うと消費電力や効率の面で色々馬鹿にならないのでD級の出力回路、つまりPWMで変調された交流を出力させます。PWMで出力するとういことは交流の信号と三角波を比較して、PWM信号を生成する訳ですけれどもこの時の周波数がなかなかおもしろいパラーメータとなっています。三角波の周波数はデジタル的な出力信号の品質に直結するわけですが、高くすることでの問題も当然あります。この辺りの説明はネットに山ほどあるので割愛しますが、古くはサイリスタで行われてきたスイッチングにはやはり損失やスイッチング速度の問題で上限があります。そのために存在しているのが、同期モードにおけるパルスモードと呼ばれるものです。
同期モードというのは、交流信号に対して変調する三角波が同期している状態です。つまり三角波の周波数は交流信号の逓倍になっていて、この倍率がパルスモードとなっているわけです。
下の図に同期モードにおける信号波と変調波の様子を書きました。
青い線が変調している三角波で、紫色の線が変調したいサイン波です。立ち上がりと立ち下がりの関係でわかりにくいですが、サイン波一周期に対して三角波はピッタリ三周期分あるのがわかります。また、赤線で描いたのは比較後のコンパレータ出力のイメージで、これがパワー回路に入力されることになります。このように三角波の周波数をサイン波の整数倍の周波数にすることで、毎周期同じPWM信号が得られるため、不規則に出て来る信号などが減りノイズ削減になります(たぶん)。騒音もうねりがなくなるため非同期に比べると幾分かましになると思います。
言い忘れましたが非同期とはこれ以外のモードです。電車では、発車時の「キーン」という短い音に当たる部分です。電車のモータ制御でなぜ最初だけ非同期なのかはよくわかりませんが、ごく低周波時に同期モードにすると不快な音が出るからとかでしょうか。まぁこの辺はやってみたらわかりますね。
電車のモータの回転数が上がっていくにしたがって、自動車のギアチェンジみたいに音が変わっていくのはよく耳にしますね。あそこでパルスモード、つまり三角波のサイン波に対する周波数の倍率が変化しています。スイッチング素子の限界周波数に達したからです。同期モードでサイン波の周波数を上げると同期している三角波の周波数も上がってくので適当なところで倍率を落としてやる必要があるんですね。

とまぁ、だいたいVVVFの原理が解ったのでソフトを作っていきます。まずは同期式PWMのテストとしてATtiny13Aを使用して三相分のPWM信号出力テストをしてみました。ソースは説明がめんどくさいので次回にします。

出力波形です。同期倍率は3倍です。上に描いた図と一致していますね。
 位相もだいたいピッタリ(!)120°ズレています。オシロが2chなのでもう一相は同時に描画出来ませんが正常でした。なんかバグもあるみたいなので修正しないといけません。

Web拍手反応

>EMLってなんだすか
ググりましたが、メールのファイルの拡張子みたいですね。
ほんとは電磁飛翔体加速装置らしいです。

>クチビル^学^園に入学する方法を教えてください
僕は卒園してないのでよく知りません。核酸とか教諭とかの著名言語学者に聞いてください。身内ネタ失礼しました。
そういえば幼稚園児の時さつまいも掘りというイベントがあったのですが取りすぎた僕は重くて袋を引きずって破く→先生が袋をもう一枚重ねてくれる→破くを繰り返してました。

>(拍手だけでも送れます) ←これ草
デフォルトのメッセージ(?)なんだよなぁ

>こんにちは、いつも楽しく拝見しております。
>シングルIHの記事を楽しみにしています\(^o^)/
楽しいことは重要だと僕も思います。
シングルIHの記事は完結させたつもりだったのですが…。
たぶん再現性はあるのでまた実験して各部波形や定数調整について書くかもしれません、かもしれません。

>がんばっちょ
すき

>こんばんは、いつも楽しく拝見しています。
>わい。
一人称で名乗れたと思ってそう。

> わい!
> おっぱ
> ちん
> ホカホカ
> わい
> もっと送る
> \ぽ/
> わーい
こういうのは無意味に見えて実は意味の無いメッセージ、と思われがちですが本当はそれぞれ思うところがあって送信しているのだと思います。僕の思いは「なんでなかたくん記事書かないんかなぁ~?」です。あと5日!

それでは、今日はこの辺で。
http://clap.webclap.com/clap.php?id=fellabo




2016年2月21日日曜日

~AVRマイコン開発記~ 第三章:アセンブラ読解②

こんばんは。KKTです。テスト期間中なので少し引き気味で記事を書いております。時が流れるのは速いものでもうこのテストが終われば今年度も終わりです。こんな感じで時が流れるのに無意味に反発して時間を浪費している(=記事を執筆している)感覚は、エスカレータに乗った時逆方向に歩いて静止する遊びの感覚に似ている気がします。エスカレータで思い出したのですが冬場防寒着とエスカレータの段の横の壁(段と一緒に動かない)を絶妙にこすり合わせることで連続的に近い形で静電気を発生させ刺激を得るという遊びを最近考案しました。
三連続ですがAVRの記事の続きです。前回のアセンブラの解説の続きを書きます。 



5    LDI R16, 0x00
6    OUT PORTB, R16
たぶんここからですね。5行目はもうお分かりの通り汎用レジスタR16に0x00を代入しています。6行目は何やらPORTBというI/Oレジスタに値を書き込んでいますがPORTBというのはチップのI/O端子のHIGH/LOWをコントロールするレジスタで0でLOW、1でHIGHを出力します。前回の下手くそなDDRBの図と同様下位ビットから順番にピンが割り当てられていてそれぞれのピンを制御できます。ここでは0x00を書き込んでいますので全ピンLOWになります。ちなみにDDRBレジスタに0を書き込んで入力にしたピンをPORTBで1を書き込むと内部プルアップが有効になります。


7    main:
プログラムはジャンプ系の命令が無ければ上から順番に実行されていくので次は7行目となります。main関数の始まりです。


8          RCALL delay
RCALLというのは「サブルーチン呼び出し」の命令です。サブルーチンというのは特定の処理を行うひとかたまりの命令郡のようなものです。呼び出して、その処理が終わると呼び出した箇所に戻ってきます。特定の処理をひとかたまりで呼び出せるようにしておくと後からその処理をもう一度行いたい時に簡単にできたり、プログラムが読みやすくなったりします。ここではdelayというラベル名のサブルーチンを呼び出しています。


15    delay:
ここからdelayラベルで呼び出される命令群が始まります。


16        LDI R16, 25
汎用レジスタR16に25を代入します。


17    dly2:
新たなラベルdly2を作りました。上から順番に事項されるのでこれが実行されます。


18        LDI R17,50
汎用レジスタR17に50を代入します。


19    dly1:
また新たなラベルdly2を作ります。


20        LDI R18,234
版用レジスタR18に234を代入します。


21        dly0:
ラベルを作りました。


22        NOP
NOPという命令は何もしないという命令です。ここでは待ち時間を作るために1クロックの間何もさせていません。


23        DEC R18
DECという命令はデクリメントでR18レジスタから1引きます。


24        BRNE dly0
BRNEは「不一致で分岐」です。直前の演算結果が0でなければ分岐します。分岐先は命令の直後に書いた「dly0」です。直前の演算結果というのはDEC R18ですね。つまりR18から順番に1引いていって0にならないうちは分岐して1引くを繰り返しますが0になると次の行に進みます。つまりdly0は234回繰り返されることになります。


25        DEC R17
同様R17から1引きます。


26        BRNE dly1
R17が0でないうちはdly1に分岐します。


27        DEC R16
R16から1引きます。


28        BRNE dly2
R16が0でないうちはdly2に分岐します。


29        RET
RETという命令は「サブルーチンから復帰」です。
復帰するので先ほどRCALLで呼び出した場所に戻ります。


9          LDI R16, 0xFF
10        OUT PORTB, R16
なので9行目に戻ります。汎用レジスタR16に0xFFを代入して、PORTBに書き込みます。この処理でマイコンチップの全出力ピンがHIGHになるのでLEDが点灯します。


11        RCALL delay
もう一度delayサブルーチンを呼び出します。


12        LDI R16,0x00
13        OUT PORTB,R16
全出力ピンをLOWにしてLEDを消灯させます。


14        RJMP main
RJMPは相対分岐といって指定した箇所に無条件でジャンプします。mainというラベルにジャンプしているのでまた7行目に戻って上記の動作を延々と繰り返します。




以上で大体の流れは理解できた方もいると思います。Delayの部分では三重ループになっており最初R18の値を引いていき0になったらR17から1を引いてからR18を234にセットしなおしてまた234回ループ。さらにそれを繰り返してR17も0になるとようやくR16から1を引いて……R16が0になるまで繰り返します。全ループ回数は292500回で、デフォルトのクロックが1.2MHzで周期833nsです。ループ内でNOPとDECでそれぞれ1クロック、条件分岐で1クロック使うので単純計算で730msです。これにさらに途中のdly1とかの分もあるので実際はもう少し長くなります。


ほとんど僕のメモ的なモノなのでわかりにくくても僕が分かれば大丈夫なんですね。
それでは、今日はこの辺で。

2016年2月13日土曜日

~AVRマイコン開発記~ 第二章:アセンブラ読解①

こんばんは。KKTです。今回もAVR関係の記事です。カラフルなケーブルや虹色のフラットケーブルを見てると思い出すのがこれ
そう水引です。靴紐の上位互換みたいな奴ですが、僕も結い方を調べて編んでみることにしました。
 こんな感じになります。
思った以上に綺麗にできなくて驚いてきます。線の色が汚いからなのかなと思いカラフルなのでもやってみます。
 いい線いってる感じはありますがまだイマイチですね。

さらに、勘の良い方はこれを何かに付けるところまで想像できるかと思います。
 菓子折りならぬ素子折りの完成です。もう少し高価な
 素子にすることで渡された人も大喜びです。僕だったら水引そっちのけで素子貰ったことに大喜びすると思います。

一応試してみる方のために参考ページです。
http://mizuhiki.jp/mizuhikiasobi/

感想としては何回も編むことで水引の編み方を覚えられたので嬉しかったことと、水引を編むより素子に水引をうまく装着するのが難しかったことですかね。


さて雑談はこれくらいにして本題いきますよ。まず前回のLチカのアセンブラの読解からいきます。前書いたコードはよりわかりづらくなるレベルのコメントと改行のおかげで読みづらいことこの上ないので少し構成を変えます。

1    .INCLUDE "tn13def.inc"

2    setup:
3    LDI R16, 0xFF
4    OUT DDRB, R16
5    LDI R16, 0x00
6    OUT PORTB, R16

7    main:
8          RCALL delay
9          LDI R16, 0xFF
10        OUT PORTB, R16
11        RCALL delay
12        LDI R16,0x00
13        OUT PORTB,R16
14        Rjmp main

15    delay:
16        LDI R16, 25
17    dly2:
18        LDI R17,50
19    dly1:
20        LDI R18,234
21        dly0:
22        NOP
23        DEC R18
24        BRNE dly0
25        DEC R17
26        BRNE dly1 
27        DEC R16
28        BRNE dly2
29        RET


行番号を追加して不要なコメント削除しました。
一行目から僕だけが分かるレベルの解説をしてきたいと思います。





1    .INCLUDE "tn13def.inc"

最初にドット(.)が付く行は命令ではなく表記やレジスタについての定義で直接プログラムに関わってくるものではありません。.INCLUDEは含む的な意味なので、ここではtn13def.incというファイルをプログラム内で読み込め、といった感じでしょうか。ちなみにこのtn13def.incというファイルはATtiny13A用のインクルードファイルで中身を見ますと各種レジスタの名前とビット位置などがズララーッと書き連ねられています。暇な人は一読あれ。


2    setup:

2行目からプログラム本体が始まります。割り込み処理とかを除けば電源を投入してからプログラムは上から順番に読まれていくのでまず最初に2行めが実行されます。コロン(:)が後ろに付いている文はラベルと言ってその後に書かれる幾つかの命令をまとめて(関数と呼ぶ)その名前を付けています。付ける名前はなんでも良いです。ここでは電源投入してから各種設定を行うので”setup”という名前にしました。始まりは2行目で明確ですが終わりはどこかと言うと

15    delay:

までで次のラベルまでですね。 ではこのsetupと名付けた関数の動作を見ていきます。


3    LDI R16, 0xFF

関数内でも命令は上から順番に実行されるのでまず3行目が実行されます。LDIというのは命令の1つで
LDI Rd,k 
と書きます。Rdはレジスタ、kは定数です。意味は「レジスタRdに定数kを代入せよ」となります。ここではR16というレジスタに0xFFを代入しています。R16という汎用レジスタは8ビットの値を保存できる変数のようなものでATtiny13AにはR0~R31まで32個の汎用レジスタが使用できます。また、定数kの書き方ですが”0xFF”と書くと「16進数でFF」を表します。「2進数で11111111」なら”0b11111111”で「10進数で255」ならそのまま”255”です。8ビットレジスタの様子を以下の図に示します。
 Rdというレジスタに0xFFを代入した様子です。8ビットなので0と1を保存できるメモリが8個あって(1と書いてある箱)7ビット目、6ビット目というふうにそれぞれに値が代入されています。


4    OUT DDRB, R16

OUTというのはこれまた命令で
OUT P,Rd
と書くと「PというI/OレジスタにレジスタRdの値を出力せよ」となります。I/OレジスタというのはAVRマイコンの入力/出力を管理するレジスタです。ATtiny13AにはI/Oピンが6本あります。この6本それぞれの状態がDDRBというレジスタの0~5ビット目までに格納されています。DDRBというレジスタも汎用レジスタ同様8ビットなので、0~7ビットまで0と1を格納できるメモリがあるのですがATtiny13Aでは6個しか使わないので上から2つはマイコン側に差し押さえられていていじっても無効になっています。DDRBレジスタについての図を以下に示します。
上から2つのビットは差し押さえられているので常に0です。ですので0xFFを代入しても0x3Fにしかなりません。DDRBレジスタの各ビットごとに割り当てられているマイコンのピン番号も記載してみました。0ビット目は5番ピンを入力にするか出力にするか、1ビット目は6番ピンを入力にするか出力にするかという感じで設定できます。便利ですよね。で、今回はDDRBに0xFFを出力したので6ピン全てのI/Oポートは出力として設定されたわけです。


とまぁこんな感じで解説(メモ)していくのですが疲れたので続きはまた次回ということで。

それでは、今日はこの辺で。

2016年2月10日水曜日

~AVRマイコン開発記~ 第一章:導入~動作確認

こんばんは。今朝注文していたAVRマイコンが届きました。嬉しかったです。今日は結構長くなる予定なので冒頭で油売っている場合ではありません。余談ですがPCのメモリ16GBにしちゃいました。決して僕に悪意があるわけではありませんが、今回の記事は参考にできそうな部分があるように見えたとしてもそれは錯覚です。真似して何かモノを壊されたりしても(ここの読者の方なら予備をたくさん買っているので特に問題ないかと思われますが)残念なので、参考にする場合はくれぐれも自己責任、自分の判断でよろしくお願いします。ちなみに僕は大事な場面ではマージンを甘く見すぎてよく失敗しますがこういうお遊び工作では何故かマージンを見すぎてしまうようで必要数×5~10くらいは買ってしまうことが多いです。

用意したモノ
・ArduinoUNO(僕が用意したのは互換ボードでした^^)
・PC(Win環境でやります)
・ブレッドボーヨ
・書き込みたいAtmelの適当なマイコン(僕が用意したのはATtiny13A)←やすかったからです。
・LED、抵抗等の部品

まず、ArduinoUNOにはArduinoUNOをAVRライタとして使えるようにするファームウェアを書き込んでおきます。ArduinoISPという名前でArduinoIDEからファイル→スケッチの例→11.ArduinoISP→ArduinoISPをクリックしてやると長いコードが表示されます。
取り敢えず何も考えず(いつものこと笑)書き込んでおきます。あとついでに
 赤線で強調してあるCOM3というところ。この数字は人によって違うのですが後から必要になるのでメモしておきましょう。

ArduinoIDEはこれ以降使わないので閉じてもらって結構です。


続いて、開発環境を入れてきます。初めに言っておきますが何故か我が家のPCでは統合開発環境から直接AVRマイコンを焼けなかったので統合開発環境はコンパイルやデバッグのみをさせて、書き込みは別のソフトウェアを使用します。

初めに統合開発環境AVR Studio 4を入れます。こちらに共立さんの分かりやすい導入ページがあるので見たら分かります。めんどくさい人は
から飛んで「AVR Studio 4.19 (build 730)」を探して左のCDのマークみたいなのを押して必要事項を入力してAtmel社からのメールを待つだけです。メール内にダウンロードリンクがあるのでダウンロード、インストールするだけです。

次に書き込みに使用するソフトウェア「AVRdude」を入れます。こちらからダウンロードして同様にインストールするだけです。

以上で書き込む準備が整いました。
取り敢えず定番のLチカをやってみようと思います。チップはATtiny13Aを使ってみます。
AVR Studioを起動してプロジェクトを作っていきます。
New Projectから
プロジェクト名を入力して(フォルダを作るにチェックを入れとくとあとで見やすい)、AssemblerかGCCかを選択します。今回はAssemblerでやってみます。Next>>を押します。
 ここは良くわからないですがデバッガーを選択しろと言っています。動作に影響は無さそうですが取り敢えずAVR Simulator 2にしてみました。横の窓から使いたいデバイスを探してクリックしてFinishでプロジェクトは作成完了です。


 こんな感じの画面になります。
これまた何も考えずに下のソースファイルを上の画面の真ん中の枠内にコピペしてみましょう。



↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

.INCLUDE "tn13def.inc";定義ファイル

setup:;setupというラベル
LDI R16, 0xFF;R16の汎用レジスタに0xFFを代入
OUT DDRB, R16;DDRBにR16の中身を転送、DDRBはポートの状態格納レジスタ
LDI R16, 0x00;R16の汎用レジスタに0x00を代入
OUT PORTB, R16;PORTBにR16レジスタの中身を転送、1ならHIGH、0ならLOW

main:;mainというラベル
RCALL delay;delayという名前のサブルーチンに飛びなさい
LDI R16, 0xFF;R16の汎用レジスタに0xFFを代入
OUT PORTB, R16;DDRBにR16の中身を転送、ポートはHIGHに
RCALL delay;
LDI R16,0x00;
OUT PORTB,R16;DDRBにR16の中身を転送、ポートはLOWに
Rjmp main;mainという名前のラベルに飛びなさい

delay:
LDI R16, 25;
dly2:
LDI R17,50;
dly1:
LDI R18,234;
dly0:

NOP;何もしない
DEC R18;デクリメント

BRNE dly0
;直前の演算結果が0でなければdly0というラベルに飛ぶ
DEC R17
BRNE dly1
DEC R16
BRNE dly2
RET;サブルーチンから復帰


↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

できたら保存して、左上のBuild→Buildを押すかF7キーを押しましょう。これで上で書いたアセンブラが機械語に翻訳されてマイコンに書き込める状態のデータなりました。このデータは先程プロジェクトを作成したファイル内に、プロジェクト名.hexという形式で生成されていますので
 例えばこのフォルダの一個前のフォルダにtemp等適当なフォルダを作りhexファイルをコピーしておきましょう。C\temp等分かりやすいところに置いておくとあとで作業が楽です。
それではそろそろハードを触りたくなってきたのでArudinoUNOと焼きたいマイコンチップの配線でもしましょう。図を書くのがめんどくさいのでATtiny13Aの接続方法のみ以下に示します。

ArduinoUNOデジタル13番ピン→ATtiny13Aの7番ピン
ArduinoUNOデジタル12番ピン→ATtiny13Aの6番ピン
ArduinoUNOデジタル11番ピン→ATtiny13Aの5番ピン
ArduinoUNOデジタル10番ピン→ATtiny13Aの1番ピン
ArduinoUNOのGND→ATtiny13Aの4番ピン
ArduinoUNOの5V→ATtiny13Aの8番ピン

ATtiny13Aに電源を供給しているなら最後の5Vは接続しなくて良いです。
さらに動作確認用のLEDと抵抗をATtiny13Aの1,4,8番ピン以外のどれかに接続しておきます。ちなみにArduinoUNOの基板上のLEDが13ピンに繋がっているため外付けLED無しでも動作確認はできます。LEDつなぐのめんどうくさい人は繋がなくても大丈夫です。
次にコマンドプロンプトを起動します。ArduinoUNOはPCに接続しておきます。
次のコマンドを実行します。

cd C\temp

先ほどのhexファイルがあるディレクトリに移動します。別の場所にhexファイルをコピーした人は自分なりに読み替えてください。そしてhexファイルが存在するディレクトリで次のコマンドを実行します。

avrdude -c avrisp -P COM3 -b 19200 -p t13 -U flash:w:ltica.hex 

赤文字で書いたCOM3は前述の通り人によって違うので自分なりに書きなおしてください。またt13の赤文字はこれは今回しようしているATtiny13Aというマイコンの識別文字的なもので異なるマイコンを使用する場合は変えてください。同じマイコンをご使用ならそのままで結構です。違うマイコンを使用している場合は一度 -p t13 の部分を消してコマンドを打ってみるとそれぞれのマイコンの識別文字一覧みたいなのが出てきますので参考にしてください。そもそもソースコードがATtiny13A用なので他のチップだと動かないことがあります。ファイル名もプロジェクト名に合わせてください。
正常に接続できていれば以下のような画面がでるはずです。
たぶんこんな説明じゃ95割の人が成功しなさそうですが成功したとして話を進めます。
新品のマイコンチップならLEDが2秒周期ほどで点滅すると思います。新品、と言ったのは工場出荷時は内部クロックが1.2MHzなのですがこれはマイコン内部で8分周されているもので本当は9.6MHzなのです。こういった設定もAVRdudeから行うことができますが僕は早速ミスって一個書き込めなくしてしまいました。しかし予備をたくさん買っておいたので困ることはありません。やはり日頃の行いでしょうか。普通の方は予備を買うなり徳を積むなりして壊した時の事を考えるかそもそも壊さないようにするかして対応してください。



とまぁ以上で導入は終了です。成功した人も成功しなかった人も部品の予備が役に立った人もお疲れ様でした。ソースコードの意味が分からなくても、コマンドプロンプトに表示されている英語の意味が分からなくても、何も書かれていないマイコンにプログラムを書き込み動作させることができたというのは素晴らしいことではないでしょうか。次回はソースコードの解説とAVRdudeのもう少し詳し機能を見ていく予定です。

それでは、今日はこの辺で。



メモ:下位ヒューズビット01101010:6a