AVR vs PIC

まあ、日本では 8bit MCU は PIC の方が人気なようで、
私のウェブ・ページでももらう質問は PIC のものばかりでちょっと悲しい。
ホビーで使うなら、AVR のほうが圧倒的に使いやすいと思います。

8bit の AVR と PIC について、個人的な感想を少し書いておきます。
#大学や高専のレポートに使ってもかまいませんが、事前にコメント欄から連絡すること。

☆PIC の欠点

・ペリフェラルがだめ。

ローエンドのMCUの周辺機能はだいたい単機能で、
ちょっと凝った応用を考えると破綻する。
また、1つの品種の周辺機能を覚えたところで、
他の品種の周辺機能は全然構成が異なるので、
また1から覚えなおし。

AVR はローエンドからハイエンドまで、
ほぼ同じモジュールが組み込まれており、開発がとても楽。
また、それぞれのペリフェラルはよくできていて、
いろいろな用途に対応できる。

汎用 I/O ひとつ取ってみても、PIC では、
やれこのピンはプルアップが使えないだの、
このピンはシュミットトリガじゃないだのと、しばしば問題にあたりますが、AVR ではそのようなことはまずありません。

・データシートが見づらい。

レジスタ確認するために、あっちこっちのページを見なきゃいけない。
開発に時間がかかるひとつの要因。

・MPLAB X がだめ。

動作遅い、メモリ大食い。

・Cコンパイラの最適化オプションが有料。

AVR は GCC が使えてよいです。
最適化が使えないってことは、AVR の ROM 1kワード は
PIC の ROM 1.8kワード に匹敵するってことですからね!
これを考慮してコスト・パフォーマンスを議論すべき。

・無駄に多品種。

PIC の多品種っぷりを誇る人がいますが、これはナンセンス。
1つの品種でカバーできる範囲が狭いってことだからね。

☆AVR の欠点

ISP がクロック依存。

クロックを与えなければ In-circuit のプログラミングができない。
慣れていないと、ヒューズビットでクロックソース設定を間違えて、
プログラミングができなくなってしまうことも。

・入手性が悪い。

SOP の AVR だったり、USB 対応品を手に入れようと思っても、
秋葉原にはほとんどありません。

・内蔵発振器の周波数が低い。

だいたいの AVR では、内蔵発振器は最高でも 8MHz です。これは PIC の 32MHz 相当とはいえ、あと 2倍ほしいケースも。

・ペリフェラルの種類が少ない。

DAC とか USB とか PGA とか、凝った周辺機能をもつ品種は多くありません。
まあ大抵の場合、汎用の周辺機能が強力なので、
あとはプログラマの ”工夫” で何とかなるのですが。

☆アーキテクチャについて

Cなどの高級言語を使う限りは、アーキテクチャはそれほど議論の対象にならないと思います。
確かに PIC では、たとえば汎用レジスタが少なかったり、
レジスタ・RAM アクセスにバンク操作が必要だったりして、
その理解は実に面倒ですが、これらはむしろ些細な問題といえます。

アーキテクチャを議論する上でのポイントは 3 つ。

(1)命令サイクル / クロック周波数

PIC も AVR も、アーキテクチャとしては同じ 2段パイプライン動作です。
AVR はクロック周波数をそのまま内部クロックとして与えられるため、
クロック周波数はそのまま命令サイクルとなります。
いっぽう PIC は前置分周器で 4 分周しているため、
命令サイクルは クロック周波数 ÷ 4 になります。

以前どこかの雑誌で、クロック周波数が 32kHz のときの消費電流の比較をもって、
PIC と AVR の消費電力を比較していたのを見たことがあります。
これではナンセンスどころか、全く誤った比較です。

(2)スタックの扱い

サブルーチン呼び出しや割り込みのときに、プログラムカウンタ(PC)や
データを保持する機構がスタックです。
PIC ではスタックは PC スタックのみで、
段数固定のハードウェアによるインプリメンテーションです。
これはハードウェアの規模は少なくて済むのですが、ちょっと原始的ですね。
POP も PUSH もありません。

一方 AVR では、たとえ 8ピンの ATtiny13A のようなローエンドであっても、
スタックポインタによるスタック呼び出しや POP/PUSH をサポートしています。
(90S1200 を除く)

(3)割り込みの扱い

ローエンド PIC ではそもそも割り込みの概念がなかったり、
割り込みルーチンは 1 つか 2 つで、ソフトウェアによる条件分岐と
手動での割り込みフラグ解除が必要です。
PIC では、割り込みは必要最小限のハードウェアになっています。

一方 AVR では、たとえ 8ピンの ATtiny13A のようなローエンドであっても、
割り込みベクタやフラグ自動解除機構は当たり前にサポートしており、
多重割り込みも簡単に実現できます。
しかし、AVR では優先度付き割り込みをサポートしていないので、
(PIC の一部では簡単ながらサポート)
場合によっては問題となるかもしれません。

☆まとめ

個人的な感想としては、PIC はコスト重視、AVR は使いやすさ重視の MCU という印象です。
量産で設計するならいざしらず、しろうとの趣味程度の数では、
PIC のわかりづらいデータシートを見ながら使いづらいペリフェラルと格闘するならば、
20-30 円高くても AVR を使った方が 数時間、場合によっては数十時間も
開発の苦労が減らせると思います。

コメントを残す

メールアドレスが公開されることはありません。