C言語でマイコン制御 その1
マイコンにできること
「マイコン」は以前 Micro computer (小さなコンピューター)の意味合いが強かったのですが、次第に Micro Controller
(小さなコントローラー)の意味合いが強くなってきた和製英語です。
外見は普通のICで、特徴がある訳ではありませんから、人々の目に触れない存在となっています。しかしその実態は、まさしく Computerそのものと言えます。しかも、初期の大型電子計算機より高い性能が今では指先に乗るサイズでワンチップ化され、ミシン、エアコン、自動車、電子レンジ、冷蔵庫、テレビ、おもちゃ、ゲーム機、パソコン、、更にはミサイル、惑星間探査機の中にまで無数に組み込まれ、中心的な働きをしています。
パソコンにも高性能のマイコンが組み込まれているのですが、通常言う”マイコン”はPC以外の周辺機器に組み込まれて機器を制御しているICを指すようです。
マイコン誕生以前のコンピュータは、メインフレームとかミニコンとか呼ばれる存在でした。数え切れない程のICから構成される演算ユニット、メモリーユニットを始め、多数のユニット基板がバスライン接続された大規模なシステムです。
一方、この本流のコンピュータとは別に、日本に起こったもうひとつの流れが、電卓の普及化です。そして、「プログラムによって機能を変更できる電卓」に搭載するLSIの論理設計をビジコンという会社が開始し、当時駆け出しのインテルに製造発注したのです。これが、世界初の4ビットマイクロコンピュータ i4004です。続く8ビット系の 8080、Z80、 Z8000 なども、嶋正利氏[1943-] がインテル/ザイログ在職時に開発したものです。 なお、名デバイス Z80 は現役です
i4004
今では、ほとんどの電子機器はマイコンで制御されるようになりました。マイコンは何本もの脚(リード)を持ち、それぞれの脚から信号を入力したり、出力することができます。当初のマイコンは核となる中心部のみ、つまり、命令解析部、演算処理部、レジスタ部、プログラムカウンタ、クロックモジュールなどの所謂CPUのみでしたが、時代とともに、I/Oポート、RAM、フラッシュメモリ、タイマ・カウンタ・モジュール、シリアル通信モジュール、AD変換モジュールなどを次々と内蔵するようになり、現在のワンチップ・モジュールに進化してきました。内部構造に関しても、より高密度、高速、低消費電力化が進んでいます。
マイコン開発は、日本と米国が主役を務めてきました。日本製マイコンは自動車など産業機器への組み込み用が主体で、一方、米国はPC搭載やスマホ向けが得意です。上下を米国が占め、中間を日本製が競っているという感じです。ところで、日本のマイコン開発の勢いは暗雲の兆しが出てきているようです。発祥の地として、今後共健闘を期待せずにいられません。
余談ですが、8080はまもなく8086→80386と進み、総称x86プロセッサとして上位互換を保っています。このx86マイコン、現在では数100万個の単位でスーパーコンピュータの中に組み込まれ、並列処理によって複雑な物理現象のシュミレータとして使われているようです。特殊なメインフレームの系譜ではなく、4004のマイコンの流れが本流になったとも考えることができる訳です。
【解説】コンピュータの中央部分は、マイクロプロセッサ(Microprocessor) 、CPU(
Central Processing Unit)、MPU(Micro Processing Unit)、MCU(Micro Controler Unit) など、さまざまな名前で呼ばれていますが、基本的な差異はなく、
同意語です。全てのコンピュータに共通する機能は、
@メモリーに書き込まれたプログラムを読み出し
Aプログラムが指示する、データ転送、演算、入出力、条件分岐などの命令などを実行する。
という、ふたつの動作です。
この、ふたつの機能の何れが欠けてもコンピュータとは呼ばれません。そして、コンピュータの最大の特徴は、プログラムを変更すると、異なった動作(働き)をさせることができるということです。
無論、数値演算や画像処理といった特殊な機能は、これをいちいちプログラムで処理するのではなく、専用の回路ユニットをCPUと共に組み込み動作の高速化を計る場合もあります。
マイコンにできることをまとめると、
●各種センサーやスイッチなどの信号を取り込むこと
●ランプやモーターなどの出力のON/OFF制御や、LCD画面への出力
●カウンタ/タイマ機能を使って、計数、時間管理、各種信号の発生など
●アナログ信号の入出力
●シリアル通信により他のマイコンやパソコンとの通信
●数値演算、論理演算および演算結果の判断
などです。これらの作業をプログラミングで複雑に組み合わせることができるため、マイコンは極めて強力な電子デバイスに成り得たと言えます。
なお現在、普及しているマイコンのシリーズとしては
STM、SH、R8C、RL78,PSoC、LPC、H8S、H8、ARM、PIC、AVR、、、
など、多数があり、それぞれに特色があります。
更に、マイコン単体ではなく複数のモジュールを1枚の基板に搭載したArduino(アルデュイーノ)や、パソコンに近い機能を持つ Raspberry
Pi (ラズベリーパイ/ラズパイ)なども専用の開発環境と共に広く用いられるようになってきています。マイコン単体には普通オペレーティングシステム(OS)を使いませんが、こうしたシングルボードコンピューターは簡易的なOS機能が使われます。マイコンとシングルボードコンピューターの何れが便利かは無論用途、目的次第です。
マイコンの機能が優れていてコスパが高ければ良いかというとそうではありません。例えばスマートフォン向けに開発されるマイコンはマルチコア 数GHz
64ビットのスペックを持っているにせよ簡単なツールに組み込むには全く手に負えない代物ですし、3年先も製造が続く保証さえ無く、15年先も保守しながら使い続けたいツールならPICには勝てないでしょう。
マイコンの開発環境
普通のICと違って、マイコンは内部にプログラムを書き込まないと動作できません。プログラムをPCで開発する環境はピンキリで、メモ帳などを使ってアセンブリ言語で書いたプログラムをアセンブラーで機械語に翻訳し、これをROMライターに書き込む古典的な方式から、アセンブラ、Cコンパイラ、エディターなどを総合的に提供してくれる開発環でプログラムを開発し、更に専用のツールでマイコン内のモジュール接続設定を実行するシステムもあります。AVRの開発環境のように無償で配布されている場合もありますが、機能や使用期間限定されている無償の試食版もあるので注意が必用です。
1.AVRマイコン
AVRマイコンはAtmel社(米国)のマイクロ・コントローラーで、以前からあるマイクロチップ社のPICのライバル。ATmega(アトメガ)、ATtinyシリーズなど広範囲なシリーズがあります。普及している型番は、秋月電子などからネット販売されています。現在、マイクロチップ社はアトメルを吸収し、AVRを自社から発売しています。
AVRマイコンはワンチップマイコンとして見た場合は必ずしも豊富な機能を備えている訳ではありません。例えば、タイマー機能やAD変換機能なども貧弱です。しかし、その最大の強みはPICと共に、世界中のアマチュアに使われている実績です。逆に言うと、日本のCPUがガラパゴス化の域を脱することができないのは、産業界が必要としそうなCPUの開発ばかりに気を取られ、結果、世界に普及させる努力を全くしていないことです。
ともかく、代表的なAVRマイコンである ATtiny2313 は200円以下で買える高性能なマイクロ・コントローラーです。姿かたちは小さくとも、基本的には本格的なCPUと同じです。この小さなマイクロ・コントローラーをC言語でプログラミングすることができます。アトメル社が無償で公開している開発環境(AVR
Studio)と、各社が販売しているプログラム書き込み装置、基板部品を合わせても、5〜6千円程度で開発スタートが可能です。
ATtiny2313 主な機能
ピン数 : 20ピン
フラッシュメモリ(作ったプログラム
を書き込む不揮発メモリ) : 2kバイト
EEPROM(プログラム
で読み書き可能な不揮発メモリ) : 128バイト
8ビットタイマー(クロックと組み合わせてタイマー動作や周期動作) : 1コ
16ビットタイマー(同上) : 1コ
IOポート(入力と出力) : 18本
PWM (パルス幅変調出力) : 4 CH
USARTシリアル通信ポート(パソコンや他のマイコンと送受信) : 送信×1,受信×1
内部発振(クロック回路) : あり
動作電圧 : 2.7〜5.5V
クロック周波数 : 0-20MHz (4.5-5.5V)
ATtiny2313の資料
お気付きでしょうが、ピンが20本で、少なくとも GND(0V)ピンとVcc(電源電圧)ピンは独立していますから残り18本では計算が合いません。そうです、何本かのピンは複数の役目を兼ねていて、プログラムやデバイス設定で働きを切り替えすることになります。下図はATtiny2313のピン番です。
◆電源に関するピン
10 GND → 電源の0Vに接続
20 Vcc → 電源の5Vに接続
この2本を接続するだけでATtiny2313は動作を開始することができます。
なお、GNDとVccには電解コンデンサ(10V 220μF
マイクロファラッド )を接続します。220μでなく、470μとか1000μでも構いません。電解コンデンサの
-極にはマークがありますのでGND側に接続します。これは、Vcc電圧の変動を抑制するためのコンデンサです。これが無いと誤動作することもあるので大切なシロモノです。
更に、電解コンデンサと並列に積層セラミックコンデンサ0.1μF(青色でやや平べったい四角形)を入れるともっと安心です。極性はありません。電解コンデンサは高域でのインピーダンス(交流抵抗)が高いため鋭い電流変化についてゆけないのですが、積セラは大丈夫です。これをパスコンともいいます。
◆IOポート
何も設定しない状態で電源を入れるとATtiny2313は
PA2, PA1, PA0
PB7, PB6, PB5, PB4, PB3, PB2, PB1, PB0
PD6, PD5, PD4, PD3, PD2, PD1, PD0
合計18本のポートが入力または出力ポートとして使える状態になります。
ただし内部にヒューズビットというのがあって、一旦設定してしまうと戻すのが困難なビットもありますので要注意です。特にATtiny2313のように少ないピン数の場合のPA2を入出力ポートとして使うためにRSTDISBLのヒューズを切ってしまうと、プログラムの再書き込みができなくなってしまうという厄介なことが発生します。
通常ポートは8ビット単位で取り扱い、Aポート、Bポートのように呼びます。ATtiny2313のBポートはビット0から7までフルにありますが、Aは下位3ビットだけ、Dは下位7ビットが端子に出ています。
IOポートはまず入力として使うか、出力として使うかを決めます。内部にDDR(Data Direction Register)レジスタというのがあって、対応するビットに
0を書くと入力ポートになり、
1を書くと出力ポートになります。
C言語では
DDRB = 0xf0;
のようにして、BポートのDDRレジスタ(データ方向レジスタ)にデータを書き込むと、Bポートのb7〜b4は出力ポートに設定され、b4〜b0は入力ポートとして機能するようになります。
ポートBからデータを出力する場合は
PORTB = 0x08; データ0x8を PORTBへ出力.
ポートBへ入力する場合は
a = PINB; 入力ポートPINBから変数aへ入力
のようにします。
ちなみに、PORTA = 0x08; のように書くのはC言語の方式で、数学の「2+3=5」の式に出てくるイコールとは意味合いが異なっています。C言語では、
左辺
← 右辺;
つまり、左辺側へ右辺からデータを転送することを意味します。数学の等式では左右の項を入れ替えても意味は変わりませんが、Cでは項の順番を変えると全く別の操作になってしまいますので注意が必要です。
なお、PICやH8マイコンは同じレジスタから入出力しますがAVRマイコンは出力と入力のレジスタが分かれています。
◆2進法と16進法
日常生活で、私達は
ほとんど10進法を使います。「ほとんど」と書いたのは全部ではなく、例外が意外と多いからです。その代表が時間です。秒も分も、0から59までは普通にカウントしますが、その次はまた0に戻って、時間の単位を使います。これは60進法を使っているからです。時刻は12、あるいは24進法を使っています。これには、時間を等分割することが容易な数だからという理由があります。半分にも、1/3にもできて、分秒は更に1/5にできる便利な数なのです。
ところで、人間が一般的に10進法を使ったのは、偶然指の本数が10であったためであり、もし8本だったら、間違いなく8進法を使っていたに違いありません。
8進法の場合はこうなります。
0、1、2、3、4、5、6、7、10、11、12、13、14、15、16、17、20、21、、、
20は「にじゅう」と言わず、「にいぜろ」と呼びます。0から7の、8種類の数字(記号)を使って数えるの8進法です。
最も単純な進法は2進法です。0と1の2種類の数字しか使いません。
0、1、10、11、100、101、110、111、1000、1001
2進法は、2カウントごとに、どこかの桁で桁上げが発生しています。桁数ばかり多くて、我々には扱い難い表現ですが、電気の世界では、1をON、0をOFFに見立てれば、むしろ扱い易い表現です。
4本の信号線に
上位信号線
ON
OFF
OFF
ON
下位信号線
のように信号を流した時、各信号線に重みを付けて
上位信号線
8
4
2
1
下位信号線
とすれば、上の信号は
ON 8
OFF -
OFF -
ON 1
----------
重みの計 9
となります。全部の線がONになれば、8+4+2+1=15 になり、全部OFFなら0です。つまり、4本の信号線を使うと0〜15、計16種類のデータ、あるいは数値を扱うことができることになります。
16種の数字(記号)を、
0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
のように表記する方法がHEX表記(16進表記)法です。
16進法は頭に 0x を付け、2進法は 0b を付けるのが約束ごとです。
2進 16進 10進
0b0000 0x0 0
0b0001 0x1 1
0b0010 0x2 2
0b0011 0x3 3
0b0100 0x4 4
0b0101 0x5 5
0b0110 0x6 6
0b0111 0x7 7
0b1000 0x8 8
0b1001 0x9 9
0b1010 0xa 10
0b1011 0xb 11
0b1100 0xc 12
0b1101 0xd 13
0b1110 0xe 14
0b1111 0xf 15
上の表は4ビットで表記しましたが、8ビットは倍の桁数で表すだけで、基本は同じです。
8ビットの 0xff は255、16ビットの 0xffff は 65,535 を表します。
◆プログラム書き込み用ピン
AVRIsp MKUはアトメル社が出していたプログラムライター(書き込み装置)でしたが現在は、これと互換もしくは代替え可能なAVRライタが各社から発売されています。
試作基板に2列6ピンのピンヘッダを立ててAVRライタに接続します。
▼が1番ピンです。
▼
MISO 1 2 Vcc
SCK(UCSK) 3 4 MOSI
RESET 5 6 GND
【注】 3番ピンはSCKが正式なピン名称のようですがアトメル社のマニュアルにはUCSKの表記がされている。
プログラム書き込みピンは書き込み時以外は通常のピンとして働きますのでIOポートとして使うことができます。
- 基板作り-
2.マイコンの回路を作ってみる
ここで、入力と出力が各1本あるATtiny2313を使った簡単な回路を見てみます。
ATtiny2313は、20ピンのICソケットを使います。(直接半田付けすることもできますが、組み直したりする時に不便です。)全体はユニバーサル基板の上に組み上げるのがいいでしょう。
ATtiny2313を使ったテスト回路
*訂正記事:多数のコントローラを連続書き込みするとエラーが発生する場合がありますので、
AVRISP-RESETピン(5)は10kでプルアップしてください。
◆電源部
回路図の左下部は三端子ボルテージ・レギュレーター7805を使った5V定電圧回路です。
トランスは100V入力で、8V出力があるもの、電流は0.2〜0.5A程度の電源トランスを使います。
整流はブリッジダイオードを使います。 100V,1A 程度のものでOKです。 4本足のうち、+ マークの端子を7805のINに、- をGND、無記号(または〜マーク)の2本をトランス側に接続します。写真のブリッジダイオードは角型ですが、丸型のブリッジダイオードでも構いません。正確な仕様がわからなくても、ユニバーサル基板の穴に通る程度のリード線のブリッジであれば、十分使える筈です。
7805は5V1Aのものが各社から出ています(型番の前後の記号は異なっていますが"7805"の表記は共通です)。ピン番は上図のように、表面から見て左から
IN-GND-OUT です。なお、シリーズの中に78M05 と 78L05 という型番がありますが、Mは500mA、Lは100mA です。例題の回路程度では78L05でも構わないもですが、余裕がある分には構いません。似た素子に7905という3端子レギュレータがありますが、これは-5Vの定電圧を作る素子ですから注意してください。
平滑コンデンサ(ケミコン)は100〜1000μFの耐圧35Vまたは50Vを使います。-側をGNDに接続してください。発振防止に0.1μFの積セラを入れますが、極性はありません。
回路が出来上がったら、マイコンをソケットに入れる前に、テスターのDCVレンジで、黒テスト棒をGND、赤テスト棒をVcc側に当て、5V±0.2Vが出ているかチェックしてください。
なお、電源回路を作るのではなく、不要になった携帯電源に出力電圧が4.8〜5.2Vのものがあれば、+-を確かめた上で使うと簡単です。出力を赤と黒のワニ口クリップにしておけば他の実験にも使えます。
◆AVRIsp MKUへの接続コネクタ
ピンヘッダ(オス)2.54mmピッチ 2列 のものを3コマでカットしてして使います。
◆出力ポートにLEDをつける
LEDは直径3mmのものが多種出回っています。発光色は何色でも構いません。LEDのカソード端子(短いリード線側)を12番ピン(PB0)に接続します。アノード側は1kΩの抵抗を介してVccに接続します。LEDは順方向電圧が2〜3Vと高いため、内蔵電源の電圧が低いデジタル・テスターでは極性が区別できない場合があります。リード線を切って半田付けする前に十分確認してください。もし、切ってしまったものを、後で調べる時は、LEDと470Ωくらいの抵抗を直列にして、5V電源に接続して確かめます。
さて、図の回路では、PB0にHを出力するとLEDは消え、Lを出力すると電流がVccからLEDを通してポートに流れ込んで点灯します。CPUに限らず、ICは一般的にHを出力して流し出せる電流より、Lで吸い込める電流の方が大きいため、このような使い方をします。ICに入り込む(沈み込む)電流のことをシンク電流といいます。
◆入力ポートにスイッチをつける
プッシュスイッチは押したときだけ回路がつながる簡単なスイッチで、形状や接点の違いで「マイクロスイッチ」、「タクトスイッチ」などの名前で呼ばれるときもあります。基板上に半田付けする小型のタクトスイッチが適しているでしょう。
ポートPB1をpush swに接続し、スイッチを出た線はグランドに落とします。一方PB1は抵抗10kΩを介してVccに接続します。スイッチ回路が開いているときは抵抗を介してHレベルに引き上げられます(これをプルアップといいます)。スイッチを押したときはポートPB1はL(0V)になります。抵抗値は4.7k〜10K程度が妥当です。低いとノイズには強くなりますが、消費電流が増えます。スイッチを手で押すと、接点がバウンドしてチャタリング現象がおきますが、ソフトでキャンセルする必要があります。
なお、CPUによっては、プルアップ抵抗を内蔵していて、設定レジスタで有効無効を切り替えることができるものもあります。
3.プログラムを作る
ごく初期のプログラマーは、
コード オペランド
01011010 000000
11010011 0000001
01100000 0000010
00000000 0000011
00111111 0000100
、、、、、 、、、、、
のように、1命令毎に命令コード表から必要なコードと、オペランド(数値/変数/アドレス)を紙に書き出していました。
そして、それを1ステップ毎、トグルスイッチにセットしては、プログラムメモリに書き込んでいました。いわゆるハンドアセンブルです。しかしこの作業は楽ではありません。特に、相対ジャンプ命令(実行アドレスから相対的にN番地離れたアドレスへジャンプする命令)などは使いたくても無理です。1行でも追加や削除があると、とんでもない程の行変更が必要になってくるからです。
この作業を効率化するために作られたのが「ニーモニックとアセンブリ言語」です。
ニーモニックはCPUの命令コードを覚え易くするための記号で、ジャンプはJP、加算はADDのような記号が使われます。
アセンブリ言語で書かれたプログラムは次のようになります。
JP LOOP1 ;ラベル"LOOP1"番地へジャンプ
CP B ;Acc(アキュムレーター)とBレジスタをコンペア(比較)してZ,Cフラグに結果を得る
OR C ;AccとCレジスタの論理和をAccに得る
ADD (HL) ;Accの値とHLレジスタに示すアドレスのデータを加算しAccに得る
コンピュータは JP を 11000011 に変換することくらいは何の問題もありません。後は、アドレスを割り当てる機能をコンピューターに持たせれば、プログラマーの負担は飛躍的に減るのです。
こうしてプログラマーが書いた一連の命令をマシン語に翻訳する最も基本的なソフトウェアであるアセンブラが作られました。アセンブラは今でも現役です。
アセンブリ言語はマシン語命と1対1に対応しているため。プログラミングによりプロセッサの動作を自在に操作できるため、最強の言語ですが、プログラマー以外の人には分かり難く、時には組んだ本人でも時間が経つと忘れてしまう危険があります。また、レジスタやメモリを直接扱うため、プロセッサの種類が異なっただけで、プログラムが通用しなくなってしまう欠点がありました。
アセンブラ的なハードウェアの動作も表現できて、かつもう少し人間的な言語に近い言語が「C言語」です。UNIXを開発するためにDennis M.
Ritchieが作った言語で、初心者向けBASIC、事務処理に適したCOBOL、技術計算に適したFORTRAN、などと共に今では、最も普及しているコンピューター言語のひとつです。
C言語で書かれたソース・プログラムをマシン語に翻訳するソフトウェアは「Cコンパイラ」と呼ばれ、各種プロセッサ向けに種々のCコンパイラが作られています。C言語は、他のCPUへの移植性に優れていると言われています。様々なプロセッサが供給されているマイコンの世界では、これはとても重要なことです。無論、弱点もあって、極めて技巧的な記述ができるため、第三者に理解し難い難解なプログラムになってしまいう危険性もあります。
何れにしてもマイコンにとって、このC言語は、なるべくコンパクトに記述できて、かつ異なった種類のプロセッサへの移植性も望める点で優れたプログラミング言語であることは間違いありません。
ATMELのAVRシリーズ・マイコンには同社から無償の開発環境ならびにCコンパイラが公開されています。
このホームページの
AVRStudioとWinAVRを参考にしてAVRStudio4をインストールしてください。またプログラムライタ も用意してください。プログラムライタはAVR Isp MKU互換型が適していますが、その他のAVRライタでも使える筈です。
4.プログラムをコンパイルしてATtiny2313へ書き込む
AVRStudioを開始すると次のような画面が出てきます。
New project ボタンをクリック
AVR GCC を選択し、Location に作業フォルダを指定して、Project name に プログラム作業の名前をつけます。 例"TEST"
Next 次の画面で Device は ATtiny2313 を選択します。
Finish で編集画面になります。
添付したサンプルのサンプルプログラムの全範囲を選択コピーして、AVRStudioの白紙の画面に Edit→ Paste してください。
【注】 ソースファイル画面をメモ帳などのエディターでコピーして使うと、Built時にエラーが出てくる場合があります。見た目には判らないのですが、注釈文以外の場所に全角文字が入ってしまうからです。こんな時はエラー行の付近を半角で再入力してみてください。
この全角文字エラーはかなり厄介で、コメント文を含めてあらゆる文字を日頃から半角だけで入力する癖を付けておけば良いのですが、我々はどうしても英文でコメントを入れることが苦手なので漢字入力を使ってしまうのですが、プログラム文の中に全角文字が紛れ込んでしまううと厄介なことが起きます。Cコンパイラーは必ずしも全角文字を検出した警告
"Error stray '\201' in program" を出してくれるとは限らず、時には 'XXX' was not
declared in this,,,のような、身に覚えの無い因縁を付けてくる時があります。全角を使わざるを得ない場合はなるべくこまめにビルトして、エラーが発生した行を速く絞り込めるようにしておくことが大切です。
つぎに Build で Build を実行するとコンパイルが開始し、エラーがなければ
Build succeeded with 0 Warnings...
が表示されます。エラーがあると、画面に内容が表示されます。
AVRライタをPCのUSBに接続して、書き込みコネクタをマイコンボードに接続します。マイコンボードの電源も入れてから Tools の Program
AVR の Auto Connect をクリックするとロムライター画面が出てきます。
新しいATtiny2313の場合は最初にヒューズ・ビットを設定します。ライター画面の
Fuses タグをクリックして、高速にするため、CKDIV8(クロック1/8プリスケーラ)はチェックを消します。なお、クロック選択(SUT_CKSEL)の出荷設定は内部発振(Int
RC Osc8MHz)となっています。
プログラミングは、Program タグの Flash のInput HEX file で、作成したプログラムのフォルダのHEXファイルを指定して Programを押します。エラーが発生しないで正常に書けたらOKです。
AVRの書き込み器(ライター)は各社から発売され、また製作記事も多く発表されています。簡単なものはLPTポートに抵抗で接続するだけのものもあります。Atmel社のAVRisp
MKUは2018年ころ一旦発売が中止されましたが2022年時点では再び入手可能となっているようです。ただし価格は当初より上がっているようです。これと互換機能を持つAVRライターがアマゾンなど各社から入手できるようです。
注意点としては、書き込み中に出力ポートが動作するので、書き込み中だけ出力を切り離すような対策を採りさえすれば、文字通りインサーキットプログラマーとして使用することができます。
●
クロック
CPU周辺の回路はシステムクロックに同期して動作するため、クロック用発振回路が必要ですが、AVRの場合はクロックは、次の何れかの方法を Tools→Program
AVR→Auto Connect でFuses の SOUT_CLSEL を設定します。
1)AVRに内蔵されている内部発振機能を使う:
Int RC Osc
出荷時設定はこのモードの、8MHzになっています。
クロックのための外付け回路は一切必要ありません。
2)XTAL1,XTAL2端子に水晶発振子と 22p程度×2 のコンデンサを外付けする:
Ext Crystal
この場合、FusesタグのSUT_CKSELを Ext Crystal Osc の周波数範囲に設定します。
なお、水晶発振子に替えて、セラミック発振子を使う方法もありますが、電源電圧の変動
やノイズなどにより、発振が突然停止してしまうことがあります。詳しい原因は明らかにされて
いませんが、共振の強さを表す水晶のQが20万以上あるのに比べセラミックは1000程度しか
ありません。振り子時計に例えると、金属製の重い振り子を使ったの水晶発振子に対して、
セラミック発振子は軽いプラスチックのおもりを使った時計とも言えます。振り子の長さが
等しければどちらも同じ周期で時刻を刻みます。
重い振り子は振り子運動を開始するのが大変ですが、一旦運動が始まると停止しにくい
のに対して、軽い振り子は容易に運動を開始できますが、時計に衝撃が加わると簡単に振動が
停止してしまう危険性があります。
完全シールドされた装置か、低インピーダンスで大地に完全接地された装置に使う以外は
推奨できません。
3)外部で作ったクロック信号をXTAL1に入れる:
Ext Clock
この場合は、FusesタグのSUT_CKSELを Ext Clock に設定します。
下図は水晶を使った外部発振回路の例です (10〜20MHz)。
複数のマイコンを使い、クロックを同期させる方法には、外部発振回路を使う方法もありますが、AVRの場合は主コントローラーは内部発振を使い、FusesのCKOUTをチェックすると、CKOUTピンからクロック信号が出力されるようになるので、この信号を従コントローラーのXTAL1端子に接続して、従コントローラーのFusesのSUT_CKSELはExt
Clockを選択します。こうすることで、外付け回路無しで、複数のマイコンのクロックを同期させることができます。ただし、この場合、XTAL2端子をポートとして使用することはできません。
なお、一旦外部クロックに変更してしまうと、クロック回路が無い回路ではコントローラー自体が停止してしまうため困ったことになってしまいます。ただし、2度と内部CR発振に戻せないという意味ではありません。XTAL1端子へ上記回路のような発振回路により外部クロックを与えておけば、ISPにより外部発振モードと内部発振モードを自由に切り替えることができるのです。ISPに接続するAVRライタとしてXTAL1に8MHz程度のクロックを供給する機能を付けておくと便利でしょう。
ただし、SPIENは間違ってもリセットしないように気を付ける必要があります。このビットをリセットすると、シリアル通信手段では書き込みが一切できなくなってしまい、パラレル方式のライターを使わない限り、以後一切の変更ができなくなってしまうからです。RSTDISBLも厄介で、I/Oポートに使おうとして0にしてしまうとリセット自体が禁止されるために、再書き込みができなくなってしまいます。
C言語でマイコン その2へ続く Top page