*AVRマイコンなページ [#m702a849] AVRマイコンなページにようこそ~ ここではAVRマイコン講座での内容をまとめたり,追加情報を載せたりしています~ 内容について不備,間違い,不足等あれば指摘,追記,修正等どんどんしてください~ 現在製作中のため画像等がないですが余裕ができたら作ってあげていきます~ **AVRマイコンとは? [#x1320e23] AVRマイコンとはATMEL社が生産している8bitマイコン(マイクロコントローラ)のことです~ CPU、メモリ(RAM、ROM)、I/O、データ記憶用のEEPROM、クロック発振回路、タイマーなどが~ 1チップに収められており、書き込まれたプログラムにより制御することが可能です~ よく似たものにPICがあげられますが,PICと違い内部に発信回路を持っているなど~ 使い勝手が良かったりします~ **AVRの種類 [#k8819fe1] 昔からある90Sシリーズと、大容量化、I/O拡張のMegaシリーズ、~ 高機能化・低消費電力化・低電圧対応のTinyシリーズがある~ ・90S*** ・ATMega*** ・ATTiny*** **開発環境 [#zcf926c0] 開発環境として統合開発環境の「AVR Studio」が無料で配布されている~ また,C言語用のコンパイラとして「WinAVR」も無料で配布されている **何ができるの? [#waa573c4] アイデア次第でいろんなことができますが,~ 今回の講座ではATTiny461を使ったライントレースロボットの開発をメインに~ 説明をしていく予定です~ *AVRマイコン講座 [#r7c63578] **開発環境を作る [#o31ea185] AVRマイコンを使うにあたって開発環境の準備をします~ コンピュータを使って何かをしたい場合,目的に合ったプログラムを用意しますよね?~ AVRマイコンも同様でマイコンで何かをしたい場合,プログラムを用意する必要があります~ ただし,マイコン自身でプログラムを作ることはできないのでパソコンにマイコン用のプログラムを作るための用意をします~ ~ 次のページから最新版の「WinAVR」をダウンロードしてきます~ http://sourceforge.net/project/showfiles.php?group_id=68108 ~ ダウンロードページに"WinAVR-**********-install.exe"(*はリリースされた日付)~ があるので最新の日付をダウンロードしてください~ ダウンロードが済んだら"WinAVR-**********-install.exe"を実行します~ 後はセットアップウィザードに従ってインストールしてください~ 「WinAVR」はAVRマイコン用のC言語コンパイラでC言語で組まれたプログラムを~ マイコンが理解できる形(マシン語)に変換してくれます~ 次にAVRマイコン用の総合開発環境をインストールします~ 総合開発環境はいろいろなコンパイラでの開発をサポートするための環境を提供するものです~ 今回は「AVR Studio」を使います~ 下記のページにある"Software:"コーナーの中から"AVR Studio 4.16 (build 628) "といったものをダウンロードします~ http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 ~ よく似たものに"AVR Studio 4.16 SP1 (build 638) "がありますがこちらはサービスパックなので間違えないようにしてください~ こちらは後で使うので一緒にダウンロードしておくと良いです~ "AvrStudio***Setup.exe"(*はバージョン)を実行します~ 先ほどと同様にセットアップウィザードに従ってインストールしてください~ ~ これで開発環境が整いました~ **ライタって何ですか? [#f6ef0f28] さて,開発環境が整ったところで,どうやってマイコンにプログラムを入れるのか?~ という問題が出てきます~ ~ マイコンにプログラムを入れることを"書き込み","焼き込み"といったりします~ マイコンのROMにデータを書きもむことから来てるのですが,昔は紫外線を使って~ ROMを変質させることによって書き込んだため"焼き込む"といった言い方をします~ ~ 話が脱線してきたので元に戻しますが~ この書き込みには"ライタ"と呼ばれるものを利用します~ ライタにはパラレル,シリアル,USBに接続するものがありそれぞれで書き込み方が違っています~ 開発環境の構築で「AVR Studio」をインストールしましたが一部のライタを用いることで~ 「AVR Studio」からライタを操作してマイコンにプログラムを書き込むことが可能です~ 今回はATMEL社純正のライタである「AVRISP mk?」を使うので「AVR Studio」から書き込みが可能です~ 自分でライタを自作することも可能ですので興味がある人は調べてみてください~ **プログラムを組んでみよう [#b2a3a77b] では実際にプログラムを組んで見ましょう~ 「スタート」→「プログラム」→「Atmel AVR Tools」から「AVR Studio」を起動してください~ 次に「project」→「New Project」を選択します~ ウィンドウが開くので,AVR GCCを選択して「Project name」を決めます~ 今回は例として「sample」というプロジェクトを作ってみます ここでCreate folderのチェックを入れるとプロジェクトごとにフォルダが作成されます~ 保存先の指定もここで行います(デフォルトはマイドキュメントになっています)~ 設定したら「Next」で次にいきます~ 次の画面ではデバッグを行うためのシミュレータと使用するマイコンの選択をします~ 今回はATTiny461を使うので「Debug plogram」は「AVR Simulator」を~ 「Device」は「ATTiny461」を選びます~ 選び終わったら「Finish」を押します~ ~ 「Finish」を押した後,「sample.c」というファイルが開いた状態でエディタが立ち上がります~ この「sample.c」の中にプログラムを書いていきます~ 次にサンプルプログラムを書いておきます #include <avr\io.h> int main(void) { while(1){ } return (0); } まず, #include <avr\io.h> ですがこれはAVRマイコンの各種設定等を持っているヘッダーです~ while(1){ } ここで無限ループが発生します~ この中に処理を記述します~ 今回は何も記述されていないので,何もしません~ ~ ということで今回のプログラムは起動した後何もしないプログラムです~ **ポートとは何ですか? [#ec1f5250] さて,このままでは面白くもなんともないので次に行ってみましょう~ 先ほどのプログラムを改造していくのですが,ここで一つ重要な情報があります~ AVRマイコンには数本から数十本のピンが出ています~ このピンは何に使うかというと~ 1,電源及びグランド(0V)~ 2,入出力(H,L)~ 3,A/D変換入力~ 4,アナログ出力~ 5,シリアル通信~ 6,クロック入力~ 7,プログラム書き込み~ 他いろいろな入出力に使われます~ 今回使用しているATTiny461はDIPパッケージで20本のピンを持っており~ 内16本が入出力をサポートしています~ 但し,一本のピンが複数の機能を持っているのでどの機能を使用するか指定が必要です~ 前置きが長くなってしまいましたが~ ポートとはHightやLowの信号を出したり受けたりするピンのことです~ ATTiny461ではポートA,Bの2つがありそれぞれ0〜7の8ポート,計16ポートあります~ **LEDを光らせてみよう [#ub5ea3f9] では実際にハードを制御してみましょう~ まずは簡単にLEDを点滅させるプログラムを作ってみましょう~ 上にある何もしないプログラムを改造していきます #include <avr\io.h> int main(void) { long i; while(1){ //処理の実行を待つ for(i=0;i<20000;i++){ } //ポートAの1番を出力に設定する DDRA = 1; //ポートAの1番の出力を反転する PORTA ^= 1; } return (0); } これで後は実際に配線を行いマイコンにプログラムを書き込むことでLEDが点滅するようになります.~ まず,~ for(i=0;i<20000;i++){ } のループですが,今回使用するATTiny461は20MHzのクロックで動作するため~ 大体1秒間に200万回命令が実行されます(実際は処理内容により変わりますが).~ そのため,簡単な機能しか持たないプログラムでは処理が高速で実行され変化~ を認識することができなくなります.~ そこで,何もしない処理(といっても比較処理、加算処理を行いますが)を大量~ にさせることで目的とする命令をゆっくり実行することが可能となります.~ 次に,~ DDRA = 1; とありますが,この書き方ではポートAの0〜7に対して0b0000001という指示を出しています.~ これはポートAの0は出力,1〜7は入力として使いますという指示になります.~ これによってポートの入力,出力を設定することが可能になります.~ また,次のように書くことも可能です.~ DDRA = 0b0000001; //2進数表記~ DDRA = 0x01; //16進数表記~ ~ そして,~ PORTA ^= 1; これも同様にポートAの0〜7に対して0b0000001という指示を出しています~ しかしながら ^= となっているので排他的論理輪(XOR:AとBが等しい場合0,違う場合1を返す)~ となっています.この場合ですと,PORTAの現状に対し0b0000001と比較して同一なら0を~ 違うなら1を返すため,出力が反転したようになります.~ これが,~ PORTA = 1;~ となると,ポートAの0はHを,1〜7はLを出力しなさいという命令になります~ 但し,DDRAで0番のみ出力になっているので実際に出力されるのは0番のみ有効です~ **A/D変換とは [#ke10cf45] まずはA/D変換とはなんぞや?という人のために簡単に説明~ A/D変換とはアナログな入力(0〜5Vの電圧変化といったもの) をマイコン側でデジタルな値(0〜1024の値)として認識するための変換である。~ 逆にD/A変換というのもあり、こちらはマイコン内部の値を0〜5Vの電圧として出力したい際などに使われます。~ **センサを使ってみよう [#kc2818a0]