(別室)AVRのページ(アトメル社のAVR CPUを使ってみる)
※このページはあくまで個人的な趣味によって書かれており、著者は全ての内容について、いかなる責任も負いません。
●重要なお知らせ●
1.Windows10の対応
2.ADM3202のコンデンサの接続について
アトメル社
※http://www.atmel.com/
のAVRを使ってみた。
ChaN氏の「AVRライター」を作ってみた。ソケットは使用頻度が高いと思われる20ピンのAVR用。
こんなICソケットを作っておくと、ISPの開発で便利だ。
ChaN氏のライターは使いやすい。
●WindowsXPパソコン以外で用意したものA (なくても問題はない)
抵抗4本だけの簡単なBASCOM専用ライターだが、私のPCでは問題なく動作する(制作費300円程度)。
●ヒューズビットについて
●最適化(Optimization)について
●システムクロックの分周値について
ATTINY13/ATTINY13A(8ピンAVR)を使ってみる
ATTINY13Aのピン配置
●実験ボード・タイプ0A(ATTINY13/ATTINY13A)
写真/回路図
@LEDを動かしてみる
写真/回路図
プログラムソースサンプル(ATTINY13A WinAVR用 C言語プログラム)
プログラムソースサンプル(ATTINY13A AVRStudio用 アセンブラプログラム)
●実験ボード・タイプ1A(ATTINY13/ATTINY13A)
ビューズビットの変更方法
@パソコンと通信してみる
写真/回路図
ハイパーターミナルのイメージ
ハイパーターミナルの設定
プログラムソースサンプル(ATTINY13A AVRStudio用 アセンブラプログラム)
A電圧計(0〜10.23V)にしてみる
写真/回路図
ハイパーターミナルのイメージ
プログラムソースサンプル(ATTINY13A AVRStudio用 アセンブラプログラム)
BPWM出力してみる
写真/回路図
デジタルオシロスコープのイメージ ※注)ヒューズビットが9.6MHzの場合のイメージ
プログラムソースサンプル(ATTINY13A AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATTINY13A WinAVR用 C言語プログラム)
Cコンパレータを使ってみる
写真/回路図
ボルテージフォロアを取り付けたイメージ (ボルテージフォロア・アダプタ基板の表面/裏面/ATtiny13A基板に取り付けたイメージ)
デジタルオシロスコープによる出力のイメージ ※注)コンデンサに0.1μFを選択した場合のイメージ
プログラムソースサンプル(ATTINY13A AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATTINY13A WinAVR用 C言語プログラム)
AT90S2313/ATTINY2313(20ピンAVR)を使ってみる
AT90S2313のピン配置
ATTINY2313のピン配置
※AT90S2313をATTINY2313に置き換える場合の注意
ChaN氏のライターでATTINY2313のヒューズビットを変更する場合
●実験ボード・タイプ1A(AT90S2313/ATTINY2313)
PICで作ったアダプタ類をつなぐための簡単なボードを作ってみた。
基板の写真
回路図
@ルーレットアダプタをつないでみる
ルーレットアダプタをつないでみた。プログラムは単にLEDを動かすだけだ。
写真
回路
プログラムソースサンプル(AT90S2313 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATTINY2313 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(AT90S2313 BASCOM用 BASICプログラム)
プログラムソースサンプル(AT90S2313 WinAVR用 C言語プログラム)
プログラムソースサンプル(ATtiny2313 AVRStudio用 アセンブラプログラム 割り込みバージョン)
プログラムソースサンプル(ATtiny2313 WinAVR用 C言語プログラム 割り込みバージョン)
Aルーレットアダプタにスイッチをつけてみる
上記ルーレットアダプタに、スイッチをつけてみた。
写真
回路
プログラムソースサンプル(AT90S2313 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(AT90S2313 BASCOM用 BASICプログラム)
プログラムソースサンプル(AT90S2313 WinAVR用 C言語プログラム)
Bルーレットアダプタをパソコンにつないでみる
AVRに内蔵されたUARTを使ってパソコンにつないでみた。
写真
ハイパワーターミナルでの入力
回路
パソコンのハイパワーターミナルの設定(PICと同じにしてある)
プログラムソースサンプル(AT90S2313 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(AT90S2313 BASCOM用 BASICプログラム)
プログラムソースサンプル(AT90S2313 WinAVR用 C言語プログラム)
プログラムソースサンプル(ATtiny2313 WinAVR用 C言語プログラム)
プログラムソースサンプル(ATtiny2313 WinAVR用 受信割り込みバージョン C言語プログラム)
CSIN波(50Hz)ジェネレータ
D/AコンバータをつないでSIN波(50Hz)ジェネレータにしてみた。
写真
回路
オシロスコープによる出力波形(アセンブラバージョン)
プログラムソースサンプル(AT90S2313 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(AT90S2313 BASCOM用 BASICプログラム)
プログラムソースサンプル(AT90S2313 WinAVR用 C言語プログラム)
D超音波障害物センサー
超音波センサーをつないで障害物センサーにしてみた。
写真
回路
プログラムソースサンプル(ATTiny2313 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATTiny2313 BASCOM用 BASICプログラム) ※準備中
プログラムソースサンプル(ATTiny2313 WinAVR用 C言語プログラム) ※準備中
E超音波距離計
パソコンのハイパーターミナルにつないで、距離計にしてみた。
写真
ハイパーターミナルの画面イメージ
回路
パソコンのハイパワーターミナルの設定
プログラムソースサンプル(ATTiny2313 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATTiny2313 BASCOM用 BASICプログラム) ※準備中
プログラムソースサンプル(ATTiny2313 WinAVR用 C言語プログラム) ※準備中
●38ドット電子ルーレット(ATTINY2313)
38個のLEDを使ったルーレットにしてみた。
回路図(AVR用)
プログラムソースサンプル(ATTINY2313 WinAVR用 C言語プログラム)
●実験ボード・タイプ3A(ATTINY2313)
水晶を使った実験ボードを作ってみた。
写真 ※水晶の下部に付いているのは、電源確認用LEDと、逆接続保護用のダイオード
回路図
@周波数カウンタ(1〜100KHz程度)にしてみる
TMR1割り込みを使って、周波数カウンタにしてみた。
写真
ハイパーターミナルのイメージ ※50.000KHzのパルスを測定してみた
パソコンのハイパワーターミナルの設定
回路図
プログラムソースサンプル(ATTINY2313 WinAVR用 C言語プログラム)
APWMでLEDの明るさを変えてみる
ATTINY2313に内蔵されている4つのPWM(TMR0[A/B]、TMR1[A/B])を使って、LEDの明るさを変えてみた。
写真
オシロによる波形 徐々にHが伸びる面白い波形の変化を繰り返す
回路図
プログラムソースサンプル(ATTINY2313 WinAVR用 C言語プログラム)
B低周波(100Hz以下)周波数カウンタにしてみる
1周期の長さを測定して周波数を計算する周波数カウンタだ。
写真
ハイパーターミナルのイメージ (ファンクションジェネレータで50Hzを出力して測定してみた)
回路図
プログラムソースサンプル(ATTINY2313 WinAVR用 C言語プログラム)
●実験ボード・タイプ4A(ATTINY2313)
内部OSCを使う実験ボードを作ってみた。
写真 ※ボードの右側に付いているのは、電源確認用LEDと、逆接続保護用のダイオード
回路図
@オルゴールにしてみる
圧電スピーカが1つだけのオルゴールだ。
写真
回路図 (圧電スピーカは、PORTBのどのピンにつないでもよい)
プログラムソースサンプル(ATTINY2313 WinAVR用 C言語プログラム)
Aオシレータ(1Hz〜10KHz)にしてみる
ハイパーターミナルから周波数を入力すると、指示された周波数の方形波を出力するオシレータだ。
写真
ハイパーターミナルのイメージ (周波数に続けて、'HZ'と入力するだけだ)
回路図 (出力端子は、PORTBのどのピンでもよい)
プログラムソースサンプル(ATTINY2313 WinAVR用 C言語プログラム)
●4つのサーボモータを動かしてみる(ATTINY2313)
パソコンのハイパーターミナルから、4つのサーボモータを制御する簡単なプログラムを作ってみた。
写真/回路図
パソコンのハイパワーターミナルの設定
ハイパーターミナルのイメージ
サーボモータの制御イメージ
デジタルオシロスコープによる出力Aのイメージ
ロジックアナライザーによる出力A/B/C/Dのイメージ
プログラムソースサンプル(ATTINY2313 WinAVR用 C言語プログラム)
ATtiny861A(20ピンAVR)を使ってみる
ATtiny861Aのピン配置
ATmega48/ATmega88/ATmega168(28ピンAVR)を使ってみる
ATmega48/ATmega88/ATmega168のDIP型のピン配置
●実験ボード・タイプ1C(ATmega48/ATmega88/ATmega168)
AT90S2313/ATTINY2313で作ったものと同じような簡単なボードを作ってみた。
基板の写真
回路図(ATmega48/ATmega88/ATmega168用)
@ルーレットアダプタとスイッチをつけてみる
AT90S2313/ATTINY2313と同様のプログラムを作ってみた。
写真
回路
プログラムソースサンプル(ATmega48 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATmega48 BASCOM用 BASICプログラム)
プログラムソースサンプル(ATmega48 WinAVR用 C言語プログラム)
プログラムソースサンプル(ATmega48 WinAVR用 C言語プログラム 割り込みバージョン 8MHz用)
Aルーレットアダプタをパソコンにつなぐ
AT90S2313/ATTINY2313と同様のプログラムを作ってみた。
写真
回路
パソコンのハイパワーターミナルの設定(PICと同じにしてある)
プログラムソースサンプル(ATmega48 AVRStudio用 USART版 アセンブラプログラム)
プログラムソースサンプル(ATmega48 AVRStudio用 汎用PG版 アセンブラプログラム)
プログラムソースサンプル(ATmega48 BASCOM用 BASICプログラム)
プログラムソースサンプル(ATmega48 WinAVR用 C言語プログラム)
B電圧(0〜10,230[mV])を測定し、結果をパソコンに送信する
A/D Converterを使ってみた。
写真
回路
パソコンのハイパーターミナルの画面表示
パソコンのハイパワーターミナルの設定(PICと同じにしてある)
プログラムソースサンプル(ATmega48 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATmega48 BASCOM用 BASICプログラム)
プログラムソースサンプル(ATmega48 WinAVR用 C言語プログラム)
Cモールス発振器にする
このサンプルは、ハイパーターミナルから、A-Z、0-9を入力すると、該当するモールス信号を出力する。
写真
回路
パソコンのハイパーターミナルの画面表示
パソコンのハイパワーターミナルの設定(PICと同じにしてある)
プログラムソースサンプル(ATmega48 WinAVR用 C言語プログラム)
D電圧(0〜10,230[mV])を10μS間隔で測定し、結果をパソコンに送信する
上記の「電圧(0〜10,230[mV])」のプログラムに、簡単なプログラムの修正したものだ。
回路図(上記の回路をそのまま使用した)
ATmega48からパソコンに取り込んだ200件のデータを、EXCELのグラフで表示してみた
(テストで使った波形は、1KHzのSIN波を、1S1588で半波整流したものだ)
プログラムソースサンプル(ATmega48 WinAVR用 C言語プログラム)
ATmega64/ATmega128(64ピンAVR)を使ってみる
ATmega64/ATmega128の大きな違いはメモリーの容量だ
ATmega128のピン配置
注)ISPモードの時、MOSI(PE0),MISO(PE1)とピン配置が変わるので、ChaN氏のライターを使う場合は注意が必要だ。
●実験ボード・タイプ1D(ATmega128/ATmega64)
プログラムの書き込みテストのために作った簡単な実験ボードだ。
写真
回路図
@ルーレットアダプタとスイッチをつけてみる
稼動確認用に、AT90S2313/ATTINY2313やmega48/88/168と同様のプログラムを作ってみた。
写真
回路
プログラムソースサンプル(ATmega64 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATmega128 AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATmega128 BASCOM用 BASICプログラム)
プログラムソースサンプル(ATmega128 WinAVR用 C言語プログラム)
Aルーレットアダプタをパソコンにつなぐ
AT90S2313/ATTINY2313やmega48/88/168と同様のプログラムを作ってみた。
写真
回路
パソコンのハイパワーターミナルの設定(PICと同じにしてある)
プログラムソースサンプル(ATmega64 AVRStudio用 USART版 アセンブラプログラム)
プログラムソースサンプル(ATmega64 AVRStudio用 汎用PG版 アセンブラプログラム)
プログラムソースサンプル(ATmega64 BASCOM用 BASICプログラム) ※準備中
プログラムソースサンプル(ATmega64 WinAVR用 C言語プログラム)
B電圧(0〜10,230[mV])を測定し、結果をパソコンに送信する
mega48/88/168と同様のプログラムを作ってみた。
写真
回路
パソコンのハイパーターミナルの画面表示
パソコンのハイパワーターミナルの設定(PICと同じにしてある)
プログラムソースサンプル(ATmega64 AVRStudio用 アセンブラプログラム) ※準備中
プログラムソースサンプル(ATmega64 BASCOM用 BASICプログラム) ※準備中
プログラムソースサンプル(ATmega64 WinAVR用 C言語プログラム)
●実験ボード・タイプ2D(ATmega128/ATmega64)
上記の実験ボード・タイプ1Dに、SRAMとシリアルEEPを追加した実験ボードだ。
回路
@増設メモリーをアクセスしてみる
増設メモリー確認のために作った簡単なサンプルだ。
写真
回路(上記回路図の「シリアル@」ポートにADM3202をつないだだけだ。)
ハイパーターミナルでの実行イメージ
プログラムソースサンプル(ATmega64 AVRStudio用 アセンブラプログラム) ※準備中
プログラムソースサンプル(ATmega64 WinAVR用 C言語プログラム)
AシリアルEEPROM(I2C型)をアクセスしてみる
Atmel社のシリアルEEPROM(AT24C256:256Kbit)をアクセスするために作った簡単なサンプルだ。
写真(上記と同じだ。)
回路(上記と同じだ。)
ハイパーターミナルでの実行イメージ
プログラムソースサンプル(ATmega64 AVRStudio用 汎用プログラム版 アセンブラプログラム) ※準備中
プログラムソースサンプル(ATmega64 AVRStudio用 TWI版 アセンブラプログラム) ※準備中
プログラムソースサンプル(ATmega64 WinAVR用 汎用プログラム版 C言語プログラム) ※準備中
プログラムソースサンプル(ATmega64 WinAVR用 TWI版 C言語プログラム)
●知識ベースを作って作品を動かす(ATmega128/ATmega64)
ATmega128/ATmega64は、そのままでも4KバイトのSRAMを持っているので、上記のようなメモリー増設をしなくても、簡単な知識
ATmega1284(40ピンAVR)を使ってみる
ATmega1284のピン配置(ATmega1284のマニュアルより抜粋)
PORTCをポートとして使用する場合(ヒューズビットをJTAGインターフェース使用不可にする)
●実験ボード・タイプ1A(ATmega1284)
写真/回路図
@LEDを動かしてみる
写真/回路
プログラムソースサンプル(ATmega1284P AVRStudio用 アセンブラプログラム)
プログラムソースサンプル(ATmega1284P WinAVR用 C言語プログラム)
AUARTを使ってみる
写真/回路
ハイパーターミナルの設定
プログラムソースサンプル(ATmega1284P AVRStudio用 アセンブラプログラム )
プログラムソースサンプル(ATmega1284P WinAVR用 C言語プログラム)
B電圧計(0〜5V)にしてみる
写真/ハイパーターミナルのイメージ/回路
プログラムソースサンプル(ATmega1284P WinAVR用 C言語プログラム)
Arduinoを使ってみる
●ATmega328を使ってみる
写真
FT232RLモジュール5V 3.3V FTDI USB TTL変換アダプタにつないだイメージ
VCC(3.3V)、TXD、RXD、DTR、GNDを接続します。
このマイコンボードには初めからファームウエアが書き込まれていますので、Arduino(sketch)でそのまま開発できます。
プログラムソースサンプル(ATmega328 Arduinoプログラム )
ボタンを押すと、PICのページに飛びます。
ボタンを押すと、メニューのページに飛びます。
私は、AVRStdio7.0と、AVRISP mkUという組み合わせでAVRマイコンを使っていますが、
Windows10パソコンで問題なく使用できます。
但し、ChaN氏のライターは、Windows10でgiveio.sysが使用できないため、使えませんでした。
このHPのADM3202を使った回路図では、ADM3202の2ピンにつながっている0.1μFのコンデンサをGndにつないで
実験していますが(図a)、ADM3202のデータシートでは、このコンデンサはVccにつなぐようになっています(図b)。
実験では、このようなつなぎ方でもICのチャージポンプは正常に動作していますが、データシートでは(図b)のように記述され
ているので、データシートの通りに(図b)のようにしたほうがいいと思います。
AT90Sシリーズや、その後継品種のATtinyシリーズは格安であるし、本格的な用途には、ATmegaシリーズがある。
AVRは、基本的なコマンドが1ステップ1クロックなので、8ビット系PICと比較した場合、同一クロックなら処理速度はPICの4倍になります。
また、CPUの構造が一般的なので、アセンブラでの開発経験がある人には、扱いやすいと思います。
●WindowsXPパソコン以外で用意したもの(1500円程度)。
・AVRStudio(AVRの統合開発ツール)
アトメル社のホームページより無償でダウンロードできる。
・AVR用のライター
ChaN氏のHP の中の
「AVRライタ製作集」
で、安価なAVRライターが公開されているので、これを活用した。
giveio.sysをパソコンにインストールしていない人は、このインストールも必要だ(無料)。
・マニュアル
アトメル社のホームページより無償でダウンロードできる
動作も確実だったので、ISP専用バージョンも用意した。
コマンドプロンプトから、 AVRSP [ファイル名.HEX] とコマンドを打つだけ。
アセンブラで開発するだけなら、上記のものだけあれば充分だが、他の開発ツールも使ってみた。
・BASCOM avr(AVRのBASIC言語開発ツール)
アセンブラに比べてプログラムの開発が簡単だ。
デモ版が、BASCOM−avrサイト
※http://www.mcselec.com/
より無償でダウンロードできる。
但し、デモ版は、プログラムの大きさや、その他に制約があるので、大規模なプログラムを作る事はできない。
BASCOM専用ライターは、製作記事が多くのサイトで公開されているので、参考にすると良いだろう。
なお、専用ライターは必須ではなく、この開発ツールで作成されたHEXファイルをChaN氏のライターや、他の
ライターで書き込むことも可能だ。(私の場合は、BASCOM専用ライターはほとんど使っていない)
・WinAVR (C言語系開発ツール)
無償で使えるC言語コンパイラーだ。Windows環境で使用できる。
WinAVRの使い方については、
「(別室)Cygwinのページ」 で説明している。
WinAVRは
※http://sourceforge.net/projects/winavr/
からダウンロードできる。
書き込む方法はいろいろあるが、簡単な方法は、WinAVRでコンパイルするとHEXファイルが作成されるので、
このファイルをChaN氏のライターや、他のライターでAVR−CPUに書き込んでやればよい。
・AVRISP mkU (アトメル社の純正ライター)
ChaN氏のライターでは、最新のAVRマイコンに対応できない可能性があるので、他にアトメル社の純正ライターを用意した。
このライターは、パソコンのUSBコネクタにつないで使用する。
※ここで紹介しているAVRマイコンは、特に注記のない限り、基本的にChaN氏のライターにも対応しています。
コネクタのピン配置(AVRISP mkUのユーザーマニュアルより抜粋)/写真
AVRISP mkUの操作例
AVRマイコンの基本的な設定は、ヒューズビットに定義されます。
このビットはプログラムの更新時に変更されるわけではないので、デフォルトを変更する場合、別途、オペレーションが
必要になります。
AVRマイコンのライターの多くは、このビットを変更する機能を持っていると思いますが、全てのビットが全ての条件で
変更できるわけではないので、変更するビットによっては、一度変更すると容易には元に戻せなくなるかも知れません。
「AVRISP mkU」でヒューズビットを変更する例
「ChaN氏のライター」でヒューズビットを変更する例
コンパイラーの種類やバージョン等によってはプログラムの動作が異なる場合があります。
中でも単純ループによるWAIT機能は、プログラムの入門書やマニュアル等でも広く使われている一般的な手法なのですが、
コンパイラーによっては無意味なループと判断され、最適化されて無効となり、この方法を使っている一部のプログラムでは、
プログラムが正常に動作しない原因になる事があるようです。
このような場合、最適化を行わないように指定するか、ループ文の中に下記のようなNOPコマンドを挿入すれば、問題が解決
する場合があります。
・
for(lp=0 ; lp < 1000 ; lp++ ){
asm("nop");
}
・
言うまでもありませんが、アセンブラのプログラムでは、この問題は発生しません。
システムクロックの分周値は、ヒューズビットにより設定される他、プログラム中からCLKPRレジスタ(Clock Prescale Registe)
を操作して変更する事もできます。
但し、このレジスタを操作するには、事前にCLKPCE(Clock Prescaler Change Enable)ビットを1にしておく(他のビットはゼロに
しておく)必要があります。
このレジスタに書き込む時には、CLKPCEビットは0にします。
例)C言語でATTINY2313の分周比を1/2に変更する場合
CLKPR = 0b10000000;
CLKPR = 0b00000001;
簡単な実験ボードを作ってみた。
PB5(1ピン)は、デフォルトでは外部リセットイネーブルになっていて、ディスエーブル(ヒューズビット[High]の0ビットを0にする)と
PB5として利用できるのだが、この設定をすると、一般的なISPライター(AVRISPmkU、Chan氏のISPライターを含む)では、
アクセスが出来なくなってしまうので、注意が必要だ。
※PB5は、デフォルトでは内部でプルアップされているので、プログラムの書き込み以外では、何もつながないほうが無難です。
LEDを動かす簡単なプログラムを作ってみた。
パソコンと通信を行う簡単な実験ボードを作ってみた。
ATTINY13Aのデフォルトクロックは、内部OSC9.6MHz、プリスケーラ8分周で、1.2MHzとなっているのだが、
これではパソコンとシリアル通信を行うためには遅すぎるので、下記の方法でヒューズビットを変更し、
内部OSC9.6MHz、プリスケーラ使用しない(CKDIV8:Divide clock by 8をunprogrammedにする)にして、
クロックを9.6MHzに変更する必要がある。
@「AVRSP -RF」と入力し、ヒューズビットを確認する
A「AVRSP -FL0**1**10」と入力し、プリスケーラなし内部OSC9.6MHzにヒューズビットを変更する
B「AVRSP -RF」と入力し、ヒューズビットが変更された事を確認する
パソコンのハイパーターミナルにつないで、エコーを行う簡単なプログラムを作ってみた。
このマイコンはUARTモジュールを内蔵していないので、ソフトウエア方式だ。
ATtiny13Aに内蔵されたA/Dコンバータを使用して、ハイパーターミナルにつないで電圧を表示する
簡単なプログラムを作ってみた。
通信条件は、上記のエコープルグラムと同じにしてある。
このマイコンのコントロール系レジスタは、MegaシリーズのようなSRAM領域にあるわけではないので、
アセンブラで記述する場合は、コマンドに注意が必要です。
ATtiny13Aに内蔵されたタイマー・カウンタ0モジュールを使ってPWM出力をしてみた。
サンプルは、OC0A(PB0),OC0B(PB1)に、それぞれデューティーサイクル25%、75%のPWM出力をするもので、
周波数は、ヒューズビットが9.6MHzの場合で37.6KHzになります。
ATtiny13Aに内蔵されたアナログコンパレータを使って、ノコギリ波を出力してみた。
発振周波数を変えられるように、0.1μFか、1μFのどちらかのコンデンサをスイッチで選択して使うようにしてある。
出力には直接オシロスコープをつないでいるが、通常は、負荷は出力にボルテージフォロアを通してつながないと正常に動作しない。
使用したチップ型積層セラミックコンデンサは、パスコン等に使うZ級品(プラス誤差40パーセント)と精度が悪いものだ。
0.1mAの定電流ダイオードも、実測すると0.15mAだった(データシートの誤差の範囲内だが)。
動作に無関係のLEDは回路図では省略しています
ATTINY2313は、AT90S2313の後継品種
ATTINY2313は、AT90S2313の後継品種であるが、クロックに内部OSCが選択できるように機能が追加されていて、
出荷時の設定は、内部OSC使用(1MHz)になっているので、置き換える場合は、ヒューズビットの設定の変更
が必要だ。
1)内部OSC使用(8MHz)に変更する場合
@「avrsp -rf」で、ヒューズビットを確認する。
A「avrsp -fl********」で、Low:で表示の先頭1ビットのみ'0'==>'1'に変更し、
それ以外はLow:で表示された通りに続けて7ビットを入力する。
(先頭1ビットは、OSCを8分周するかどうかを指定するフラグ)
B「avrsp -rf」で、正しく変更された事を確認する。
2)外部OSC使用(8MHz以上)に変更する場合
注)この変更をすると、外部OSCを付けないと、以後、操作はできなくなる
@「avrsp -rf」で、ヒューズビットを確認する。
A「avrsp -fl********」で、Low:で表示の先頭1ビットを'0'==>'1'、
5〜7ビットを'111'に変更し、それ以外はLow:で表示された通りに入力する。
B「avrsp -rf」で、正しく変更された事を確認する。
この実験ボードのプログラムは、インクルードファイル程度を変更すれば、基本的にはATTINY2313でも使用可能だが、
外部OSC(10MHz)を使っているので、ATTINY2313を使う場合は、前述した方法で、ヒューズビットを
「※2)外部OSC使用(8MHz以上)」に変更しておかないと、正常に動作しない。
実験のため、同じものをATTINY2313でも作ってみた。
2つのサンプルプログラムは、インクルードファイルが違うだけだ。
また、同じものを、BASIC(BASCOM)やC言語でも作ってみた。
アセンブラに比べてプログラムの開発が簡単だ。
割り込みバージョンは、16ビットのタイマー1割り込みを使った簡単なサンプルで、1秒毎にLEDが回転する。
ボタンを押すと(どちらのボタンでも良い)ルーレットが回転し、乱数によって、不確定な、どこかのLEDで止まる。
パソコンのハイパワーターミナルから1〜9を入力すると、1〜9ステップだけルーレットが動く。
PICで作ったものと同様の機能のものだ。
出力周波数は、タイマー関数(WAT)のループ回数を変更するだけで、数KHzまで変更可能だ。
このプログラムは、周波数精度は高くはない。
LM358のような安価な汎用オペアンプでは、SIN波の振幅が入出力レンジをはみ出してしまう事が
あるので、正確なSIN波が必要なら、PORTBの数値にはかせる下駄の数値の微調整が必要だ。
マイコン制御の模型で、障害物検知に使う事を想定して作ったものだ。
サンプルは実験用なので、硬い壁に近ずくとルーレットが回転するようにしてある。
実験では、硬い壁に20cm位まで近ずくと反応していたが、回路図中の※Aの5KΩを調整することで、
感度は調整する事ができる。
手持ちの関係で、汎用オペアンプのLM324を使っているが、LM324では40KHzのゲインはあまり期待できない。
本当はもう少し高い周波数で使えるオペアンプを使って設計するほうが無難だ。
なお、LM324は入力がPNPなので、※Bの20KΩを省略してしまうと、3段目のオペアンプがコンパレータとして
正常に動作しなくなるので、注意が必要だ。
超音波センサーは40KHz用のもので、秋月電子で購入した。
超音波を発射して、跳ね返ってくるまでの時間をマイコンでカウントしているもので、超音波センサーの使い方としては一般的だ。
サンプルは実験用で作ったので、あまり精度は高くない。
実験では、測定対象物から数cm〜1m位までなら、特に問題なく距離の測定が可能だった。
LM324の40KHzでのゲインが低いので、増幅を2段にしている。
感度は※Aの10KΩを変える事で調整可能だ。
超音波センサーは40KHz用のもので、秋月電子で購入した。
中央のボタンを押すと、ルーレットが高速回転を開始し、スピードが遅くなって乱数で任意のLEDで止まる。
プログラムは、ATTINY2313のヒューズビットを「内部OSC使用(8MHz)」で作ってある。
実験用なので、基板には、AVR、及びPICの何れでも使用できるように、両方の回路を付けてある。
ケースは、美術で使うベニヤカンバスを代用した。
写真(表示部分)
写真
タイマーの精度が必要なアプリケーションを動かすためのものだ。
水晶は、秋月電子で購入した表面実装の安価なものだ。
水晶に20MHzでなく、8MHzを使ったのは、内部OSC(8MHz)用のプログラムも、そのまま動かしたいからだ。
なお、このボードでATtiny2313を使う場合、ヒューズビットは上記の方法で、「外部OSC使用(8MHz以上)」
にしておく必要がある。
測定した結果は、パソコンのハイパーターミナルに出力する。
精度は4桁以上はあるようだ。
アンプも、保護回路も作っていないので、入力はCMOSレベルで、電源電圧より高い電圧を加えてはならない。
LEDが、徐々に明るくなって、急に暗くなる動作を繰り返す。※LEDの明暗は、視覚的に大きくありませんが。
このサンプルの出力は、31.250KHz(8MHzでPWMにした時の最速)にしてあるが、PWMに高い精度が必要な用途は
少ないだろうから、内蔵のOSCを使っても、特に問題はない。
PORTBにルーレットアダプタをつないだだけなので、PORTD[5]にはLEDをつないでいないが、出力は確認済みだ。
周期をカウントする周波数カウンタと異なり、周波数が低くなるほど精度が高くなり、mHz単位の測定が可能だが、
測定する波形の形状が精密(99.999、、、%で、ノイズ等がない信号)でないと、著しく測定精度が低くなるので、
ごく特殊な用途にしか使えないようだ。
回路は、「@周波数カウンタ(1〜100KHz程度)」をそのまま使用した。
PORTA、PORTB全てが使えるようにしたものだ。
なお、このボードを使うには、ATtiny2313のヒューズビットを、上記の方法で、「内部OSC使用(8MHz)」
にしておく必要がある。
手元に楽譜が無いので、メロディーは、PICでも使った「海」が演奏されるだけだが、曲は追加していく予定だ。
曲の追加は、楽譜があれば、音符(Play[音階、長さ])、休符(Stp[長さ])を記述するだけなので簡単だ。
ヒューズビットは、「内部OSC使用(8MHz)」で使用する。
周波数精度が高くはないので、簡単にするために水晶は使わず、ヒューズビットを「内部OSC8MHz」で使用した。
ハイパーターミナルの設定は、上記同様、9600BPSだ。
ターミナルから、「(周波数)Hz」とキーインして使用する。
例)5KHzを出力する場合
5000HZ とキーインする。
ハイパーターミナルから、サーボモータの識別コード(A〜D)と角度(−60〜+60)°を入力すると、実行する操作をカッコで表示し、
指示されたサーボモータを動かす。
ATTINY2313には、PWM出力が4つあるので、複数のサーボモータを動かすような用途には最適だ。
なお、このプログラムを動かす場合、ヒューズビットは「内部OSC使用(8MHz)」にしておく必要があります。
コマンドフォーマット
[サーボモータの識別コード(A〜D)] [回転方向(+/−)] [角度°(00〜60)]
例)サーボモータBを、マイナス方向に30°回転させる場合
B−30 と入力する。
※注1)入力されたフォーマットに誤りがある場合、正しい文字が入力されるまで’?’と選択可能な文字を表示し、再入力を求めてくる
ようになっています。
※注2)サーボモータの回転可能な角度が60°より広い場合は、エラー処理の制限数値を60から変更する事で対応可能です。
※注3)実験で使用したサーボモータは、GWS製のS03N/2BBMG/F(フタバ)で、秋月電子で1000円程度で購入したものです。
コネクタは、白(Singnal),赤(+),黒(−)になっています。
このモータの場合は、回転角度は60°より広いので、制限値はもう少し広くできます。
(回転角度はサーボモータによって異なるので、他のモータを使った場合でも制限値を越えないように敢えて狭くしてあります。)
サーボモータのコネクタは、ICソケットに近すぎるとコネクタの突起がICソケットにぶつかって装着できません。
(このサンプルでは、基板上のシングル3ピンコネクタを外側に曲げて使用しています。)
ATtiny861Aを使ってみた
このCPUは、ATtiny26Lの後継品種にあたるマイコンで、上記で取り上げた20ピンのATTINY2313と比較して、A/Dコンバータが
内蔵されており、プログラムメモリーも8Kバイトもあるので、多目的に使用することが出来る。
ATmega48/ATmega88/ATmega168を使ってみた。
このCPUは、フラッシュが4K/8K/16Kバイト(ATmega48/ATmega88/ATmega168)と、下記のATmega64/ATmega128に比べて
多くはないが、マルツパーツ(秋葉原の秋月電子の斜め前の店)
※http://www.marutsu.co.jp/ で、DIP型が購入できる。
このシリーズのCPUは、ヒューズビットの出荷時の設定は、クロックが、内部OSC使用(1MHz)になっている。
LEDを点燈させるだけなら、それでも問題はないのだが、例えば9600BPSでパソコンとシリアル通信を行なうためには
それでは遅すぎるので、8MHz(このシリーズで内部OSCを使った場合の最速)に変更してやる必要がある。
ChaN氏のライターで、クロックを、内部OSC1MHzから、内部OSC8MHzに変更する場合
(変更方法) @「avrsp -rf」で、ヒューズビットを確認する。
A「avrsp -fl********」で、Low:で表示の先頭1ビットのみ'0'==>'1'に変更し、
それ以外はLow:で表示された通りに続けて7ビットを入力する。
(先頭1ビットは、OSCを8分周するかどうかを指定するフラグ)
B「avrsp -rf」で、正しく変更された事を確認する。
このCPUは、ヒューズビットを変更する事で、外部OSCをつないで、高速動作をさせる事も可能だが、
このボードでは、ヒューズビットをデフォルトのまま使用して、全てのピンをポートとして使用している。
このCPUにはA/Dコンバータが内蔵されているので、実験ボードにA/Dコンバータのコネクタを追加している。
ボタンを押すと(どちらのボタンでも良い)ルーレットが回転し、乱数によって、不確定な、どこかのLEDで止まる。
このサンプルは、ヒューズビットは購入時の状態(内部OSCが1MHz)で作っているので、例えば8MHzに変更
すると、ルーレットは8倍速の高速回転になる。
※割り込みバージョンのみ、内部OSC:8MHz用です。
パソコンのハイパーターミナルから1〜9を入力すると、1〜9ステップだけルーレットが動く。
このサンプルを動かすためには、冒頭で書いたように、ヒューズビットを内部OSC:8MHzに変更しておく必要がある。
ADC(0)端子の測定結果を、パソコンのハイパーターミナルに送信する。
このサンプルを動かすためには、ヒューズビットを内部OSC:8MHzに変更しておく必要がある。
キーのスピードは、「M_out」関数の「Speed=40」を増減する(値が小さいほど速くなる)事で変更が可能だ。
安価で簡単にするために、圧電スピーカをつないだが、トランジスタとスピーカをつないでもよい。
このプログラムは、PICで作ったものをAVRに移植して、ハイパーターミナルにつないだものだ。
このサンプルを動かすためには、ヒューズビットを内部OSC:8MHzに変更しておく必要がある。
AVR−CPUが起動すると、10μS間隔で200回、電圧を測定し、結果をシリアル通信でパソコンに送信する。
このデータを、例えばEXCELに取り込んで、オシロスコープのように波形を表示するような使い方ができる。
このサンプルを動かすためには、ヒューズビットを内部OSC:8MHzに変更しておく必要がある。
※注)パソコン側のアプリケーションは、現在準備中です。
ATmega64/ATmega128を使ってみた。
このCPUは、64K/128Kバイトのフラッシュ(ATmega64/ATmega128)の他、大容量のSRAM・EEP、豊富な周辺機器を
内蔵した高性能なCPUだ。
最近、テレビで派手に宣伝している某社の二足歩行ロボット「ロボザック」にも使われているCPUなので、
知っている人は多いだろう。
このシリーズのCPUは、ISPモードの時、MOSI(PE0;2番ピン),MISO(PE1;3番ピン)とピンの配置が変わるので、
ChaN氏のライターを使う場合には注意が必要だ。
また、出荷時の設定が、mega103互換モードになっているので、mega64/128として使用するためには、
下記の方法で、ヒューズビットを変更してやる必要がある。
クロックは、外部OSCと、内部OSC(1、2、4、8MHz)を選べるようになっているが、出荷時の設定は、内部OSC(1MHz)
になっているので、パソコンと9600BPSでシリアル通信を行なうためには、ヒューズビットを8MHzに変更する作業も必要だ。
このCPUは、形状が64ピンTQFPで、このままでは扱いにくいので、簡単な実験ボードを作ってみた。
ChaN氏のライターで、mega103互換モードを変更する場合
(変更方法) @「avrsp -rf」で、ヒューズビットを確認する。
A「avrsp -fx1*」で、Ext:で表示の先頭1ビットのみ'0'==>'1'に変更し、
次のビットはExt:で表示された通りに続けて1ビットを入力する。
B「avrsp -rf」で、正しく変更された事を確認する。
ChaN氏のライターで、クロックを、内部OSC1MHzから、内部OSC8MHzに変更する場合
(変更方法) @「avrsp -rf」で、ヒューズビットを確認する。
A「avrsp -fl****0100」で、Low:で表示の上位4ビットはLow:で表示された通りに入力し、
続けて下位4ビットを'0001'==>'0100'に変更して入力する。
B「avrsp -rf」で、正しく変更された事を確認する。
ChaN氏のライターで、JTAGインターフェース使用不可に変更する場合
注意)この変更をするとJTAGインターフェースではアクセスできなくなるので注意が必要だ。
(変更方法) @「avrsp -rf」で、ヒューズビットを確認する。
A「avrsp -fh*10*****」で、Hight:で表示の上から2ビットめを1に変更して入力する。
3ビット目が「‐」で表示されているのは、このビットはシリアルプログラミングでは変更できないからだ。
B「avrsp -rf」で、正しく変更された事を確認する。
PICで作ったアダプタ類を、そのままつなぐ事もできる。
TQFP型は基板作成&半田付けが大変なので、変換基板を使用した
16ピンソケットは購入できなかったので、20ピンソケットの4ピンを引き抜いて使っている
ボタンを押すと(どちらのボタンでも良い)ルーレットが回転し、乱数によって、不確定な、どこかのLEDで止まる。
このサンプルは、ヒューズビットは購入時の状態(内部OSCが1MHz)で作っている。
確認のために、ATmega64と、ATmega128で作ってみたが、プログラムはインクルードファイルが違うだけだ。
パソコンのハイパーターミナルから1〜9を入力すると、1〜9ステップだけルーレットが動く。
このサンプルを動かすためには、ヒューズビットを内部OSC:8MHzにしておく必要がある。
このサンプルでは、USART1(RXD1,TXD1)を使用している。
ADC(0)端子の測定結果を、パソコンのハイパーターミナルに送信する。
このサンプルを動かすためには、ヒューズビットを内部OSC:8MHzに変更しておく必要がある。
このCPUは、外部メモリーインターフェースが内蔵されているので、メモリーの増設は簡単だ。
アドレスラッチは入手の都合で74HCを使っているが、Mega128のマニュアルによると、74HCは速度に問題があるので、
74AHCを使うように指示がされている。
充分な検証をしているわけではないが、実験では、外部メモリーインターフェースのウエイトステート数を調整する事で、
74HCでも特に問題なくメモリーをアクセスできている。
回路図にある8MHzの水晶は、実際には配線をつながず、ヒューズビットは内部OSC8MHzで使用している。
この類のヒューズビットは、設定を間違えるとアクセスが困難になる事があるので、あまり設定を変更したくないからだ。
このCPUはSRAMが512Kビットまでそのままつながるが、使用した256KビットのSRAMは、秋月電子で安価で入手できるものだ。
この実験基板では、PORTFをパラレルポートとして使っているが、このポートはデフォルトではJTAGインターフェース
に割り当てられている。ポートとして使うためには、ヒューズビットを「JTAGインターフェース使用不可」にする必要がある。
※注)上記の手順を参照 この変更をすると、JTAGではアクセスできなくなるので注意が必要だ。
写真 表面/表面(基板ソケットを抜いたところ)/裏面
パソコンの「ハイパーターミナル」から入力した1文字を増設メモリーに書き込み、1つ前に入力したアドレスの文字を
「ハイパーターミナル」に表示する。
なお、もしもメモリーが増設されていないと、デタラメの文字が表示される。
パソコンの「ハイパーターミナル」から入力した1文字をシリアルEEPに書き込み、1つ前にシリアルEEPに
書き込んだ文字を「ハイパーターミナル」に表示する。
このCPUには、I2Cをアクセスするために、TWI(Two-wire Serial Interface)が内蔵されているので、
このインターフェースを使うと、プログラムは簡単だ。
シリアルEEPは、メーカーやメモリー容量により、若干仕様が異なるので、他のシリアルEEPROMを
使用する場合は、多少プログラムの修正が必要になる。
なお、もしシリアルEEPROMが正しく接続されていないと、エラーを表示してプログラムを停止する。
ベースなら載せる事が可能だ。
※この記事の詳細は、
(別室)動く作品のページ
を参照の事。
ATmega1284Pを使ってみた。
このマイコンは、プログラムメモリー128Kバイト、SRAM16Kバイト、EEP4Kバイトと大容量のメモリーを積んでいる他、
ピンレイアウトがポート順に整然と並んでおり、扱いやすいマイコンです。
このマイコンで、PORTCを使用する場合は、デフォルトではJTAGインターフェースに割り当てられているので、
下記の方法でJTAGインターフェース使用不可に変更する必要があります。
なお、この変更をするとJTAGではアクセスできなくなるので、注意が必要です。
注意)この変更をするとJTAGインターフェースではアクセスできなくなるので注意が必要です。
(変更方法) @「avrsp -rf」で、ヒューズビットを確認する。
A「avrsp -fh*10*****」で、Hight:で表示の上から2ビットめを1に変更して入力する。
3ビット目が「‐」で表示されているのは、このビットはシリアルプログラミングでは変更できないからです。
B「avrsp -rf」で、正しく変更された事を確認する。
ChaN氏のライターで、クロックを、出荷時の設定である内部OSC1MHzから、内部OSC8MHzに変更する場合
(変更方法) @「avrsp -rf」で、ヒューズビットを確認する。
A「avrsp -FL1*******」で、Low:で表示の上位1ビットは1(Divide clock by 8をunprogrammedにする)、
それ以外は表示された通りに入力する。
B「avrsp -rf」で、正しく変更された事を確認する。
ATmega1284Pを使った実験ボードを作ってみた。
ポートに8個のLEDをつないで、LEDが回転するプログラムを作ってみた。
PORTA、B、C,Dのいずれのポートにつないでも動くようにしてあるが、PORTCにつなぐ場合は、
上記の方法で、ヒューズビットを「JTAGインターフェース使用不可」にしておく必要があります。
また、PORTBはISP端子と共通なので、PORTBにつなぐ場合はトランジスタを入れてLEDをつながないと、ライターによっては
プログラムの更新が出来ないかも知れません。
(ChaN氏のライターや、AVRISP mkUでは問題ありませんでしたが)
パソコンのハイパーターミナルにつないで、エコープログラムを作ってみた。
このマイコンの出荷時の設定は内部OSC1MHzになっていますが、これではパソコンと通信を行うには遅すぎるので、
このプログラムを動かすためには、上記の方法で、ヒューズビットを「内部OSC8MHz」に変更しておく必要があります。
このマイコンに内臓されているA/Dコンバータを使って、パソコンのハイパーターミナルに出力する電圧計にしてみた。
通信設定は、上記エコープログラムと同じにしてある。
実験で何の保護回路もつけていないので、入力が5Vを越えたり、電源電圧を越えたり、マイナスになったりすると
マイコンが壊れる可能性があるので、注意が必要だ。
EasyWordMall Pro Mini モジュール Atmega328 3.3V 8M Arduino用(ATmega328)を使ってみました。
このボードは、AMAZONで300円程度で購入できます。
ArduinoでWindows10パソコンからプログラムを書き込むためには、他にUSB-シリアル変換器が必要になります。
この変換器には、RXD、TXD信号のほか、DTR信号も必要になるので、「FT232RLモジュール5V 3.3V FTDI USB TTL変換アダプタ」を使うといいと思います。
このケーブルは、ピンレイアウトがボードと同じになっているので、ボードにそのままつなぐ事ができます。
AMAZONで300円程度で購入できます。
稼働確認のためのプログラムです。ボードのLEDが点滅します。
Arduino IDEについているサンプルそのままです
問い合わせ先(代表者)E_MAIL BYP03364@nifty.ne.jp
※ウイルス感染防止のため、容量の大きなもの、添付ファイルのあるもの、テキスト形式以外のメールは
全て削除されます。
また、個々の質問については、お答えできません。