このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。
マイコンシステムなどを設計、開発するには、各パーツの様々な制約に適合し た使用方法をする必要があります。 そのため、基本的にはすべての部品のデータシートを入手して検討しなければ なりません。 但し、抵抗、コンデンサ、電池など、定格値が付記されて販売されているものも あり、その場合はその部品の特性を知った上でその定格値で設計すれば良いこ とになります。
また製品について、汎用の部品が使われていた場合、その部品に関するデー タシートを入手すると、理解が深まります。
本講義で必要な資料は次のとおりです
Arduino の標準的な開発環境は、公式サイトからダウンロードできる Arduino IDE です。 C++言語でプログラミングをして、Arduino にプログラムを書き込んで動作させるためのソフトウェアです。 なお、Windows 用はインストーラーをダウンロードしてインストールしてください。 Windowsストアからインストールすると、インストール結果でコマンドのパスなどが変わってしまいます。
AVRDUDEはAVRマイコンへのプログラムの読み書きをするプログラムです。 以前は Arduino IDEに付属していて、それを利用していました。 しかし、インストールされているディレクトリの位置が不定で、教材として 使うには不都合なため、ダウロードして使うようにしました。
インストールするフォルダは都合の良い場所で良いです。 但し、ここでは、単純に Downloads ディレクトですべて展開して使用する ように説明します。 別のフォルダにする場合は、そのように指定してください。
これで Downloads\avrdude-v8.1-windows-x64\フォルダに avrdude.exe と avrdude.conf ファイルが入っている。
Microchip Studio for AVR では C 言語とアセンブリ言語開発ができます。 本講義ではC言語の開発は専らArduino IDEで行うので、 Microchip Studio はア センブリ言語の開発のみで使用します。
Microchip Studio を起動し、New→project を選択し、Assembler を選択し、保 存フォルダとプロジェクト名を記入します。
Microchip Studio を起動し、New→project を選択し、Assembler を選択し、保 存フォルダとプロジェクト名を記入します。
Microchip Studio を起動し、New→project を選択し、Assembler を選択し、保 存フォルダとプロジェクト名を記入します。
以下のプログラムを program.bat というテキストファイルに収めます。
set root=C:\Users\sakamoto\Downloads\avrdude-v8.1-windows-x64
set dude=%root%\avrdude.exe
set conf=%root%\avrdude.conf
%dude% -C %conf% -p m328p -c arduino -P %1 -D -U flash:w:"%2":i
なお、上記にsakamotoという名前が入っています。これを自分のパソコン のアカウント名などに置き換える必要があります。
以下のプログラムを program32u4.bat というテキストファイルに収めます。
set root=C:\Users\sakamoto\Downloads\avrdude-v8.1-windows-x64
set dude=%root%\avrdude.exe
set conf=%root%\avrdude.conf
%dude% -C %conf% -p m32u4 -c avr109 -P %1 -D -U flash:w:"%2":i
なお、上記にsakamotoという名前が入っています。これを自分のパソコン のアカウント名などに置き換える必要があります。
以下のプログラムを program4809.ps1 というテキストファイルに収めます。
param(
[string]$COMPORT,
[string]$HEXFILE
)
$root="C:\Users\sakamoto\Downloads\avrdude-v8.1-windows-x64"
$dude = Join-Path $root "avrdude.exe"
$conf = Join-Path $root "avrdude.conf"
$port = new-Object System.IO.Ports.SerialPort $COMPORT,1200,'None',8,'One'
$port.DtrEnable = $true
$port.Open()
Start-Sleep -Milliseconds 100
$port.DtrEnable = $false
$port.Close()
Start-Sleep -Seconds 2
& $dude -C $conf -patmega4809 -cjtag2updi -v -V -P $COMPORT -e -D -U flash:w:"$HEXFILE":i
なお、上記にsakamotoという名前が入っています。これを自分のパソコン のアカウント名などに置き換える必要があります。
.cseg
.org 0x0000
rjmp reset
.org INT_VECTORS_SIZE
reset:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,1<<pb5
out ddrb, r16
.equ time = 10
main:
sbi portb,pb5
rcall wait
cbi portb,pb5
rcall wait
rjmp main
.def wreg0 = r20
.def wreg1 = r21
.def wreg2 = r22
wait:
ldi wreg0,time
wait0:
ldi wreg1,0
wait1:
ldi wreg2,0
wait2:
nop
dec wreg2
brne wait2
dec wreg1
brne wait1
dec wreg0
brne wait0
ret
.exit
.cseg
.org 0x0000
rjmp reset
.org INT_VECTORS_SIZE
reset:
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,1<<pc7
out ddrc, r16
.equ time = 10
main:
sbi portc,pc7
rcall wait
cbi portc,pc7
rcall wait
rjmp main
.def wreg0 = r20
.def wreg1 = r21
.def wreg2 = r22
wait:
ldi wreg0,time
wait0:
ldi wreg1,0
wait1:
ldi wreg2,0
wait2:
nop
dec wreg2
brne wait2
dec wreg1
brne wait1
dec wreg0
brne wait0
ret
.exit
.cseg
.org 0x0000
rjmp reset
.org INT_VECTORS_SIZE
reset:
ldi r16,low(RAMEND)
out CPU_SPL,r16
ldi r16,high(RAMEND)
out CPU_SPH,r16
lds r16,PORTE_DIR
ori r16,1<<2
sts PORTE_DIR,r16
.equ time = 10
main:
lds r17,PORTE_OUT
ori r17,1<<2
sts PORTE_OUT,r17
rcall wait
lds r17,PORTE_OUT
andi r17,!(1<<2)
sts PORTE_OUT,r17
rcall wait
rjmp main
.def wreg0 = r20
.def wreg1 = r21
.def wreg2 = r22
wait:
ldi wreg0,time
wait0:
ldi wreg1,0
wait1:
ldi wreg2,0
wait2:
nop
dec wreg2
brne wait2
dec wreg1
brne wait1
dec wreg0
brne wait0
ret
.exit
Wiring システムは、マイコン開発を容易に行うために開発された教育用の 教材でした (Arduinoの語られざる歴史 by Hernando Barragán)。 Java で開発されたIDEはパソコンのOSを選ばずに使用できます。 また、マイコンのプログラムはC/C++言語で記述します。 プログラムのコンパイル、書き込みがワンアクションでできます。
Arduino のハードウェアは Creative Commons Attribution-ShareAlike 2.5 宣言されてます。 但し、派生製品に対して Arduino の名前を使うことを 禁じています。 ソフトウェアは GPL v2 宣言されていて、条件を守れば自由に改変などができます。
Arduino Uno のドキュメントは 公式サイト にあります。 また、 ピン配置 も図示されていますが、より見やすい図が色々デザインされていますの で、気に入ったドキュメントを探してください。
基板上でメインに使用するのは ATmega328Pというマイコンです。 このマイコンは内部クロックも利用できますが、外部クロックとして16MHz の水晶発振器が接続されています。 多くの I/O ポートがそのまま外部端子に繋がれています。 また、PortB5 には LED が接続されています。 Digital 0,1 が通信用ポートとして使用されます。
基板にはUSBポートが搭載され、USB通信を実現するために、もう一つ AVR のマイコン が載っています。 さらに、USBポートからの5V電源に対して、レギュレータ回路により 3.3Vの 電源も供給されています。
Arduino Leonardo のドキュメントは 公式サイト にあります。 また、 ピン配置 も図示されていますが、より見やすい図が色々デザインされていますの で、気に入ったドキュメントを探してください。
基板上でメインに使用するのは ATmega32u4というマイコンです。 このマイコンは内部クロックも利用できますが、外部クロックとして16MHz の水晶発振器が接続されています。 多くの I/O ポートがそのまま外部端子に繋がれています。 また、PortC7 には LED が接続されています。 Digital 0,1 が通信用ポートとして使用されます。
基板にはUSBポートが搭載され、ATMega32u4 の機能によりUSB通信を実現しています。 USBポートからの5V電源に対して、レギュレータ回路により 3.3Vの 電源も供給されています。
Arduino Nano Every のドキュメントは 公式サイト にあります。 また、 ピン配置 も図示されていますが、より見やすい図が色々デザインされていますの で、気に入ったドキュメントを探してください。
基板上でメインに使用するのは ATmega4809 というマイコンです。 このマイコンは内部クロックも利用できますが、外部クロックとして16MHz の水晶発振器が接続されています。 多くの I/O ポートがそのまま外部端子に繋がれています。 また、PortE2 には LED が接続されています。 Digital 0,1 はピン配置には明記されてませんが、 TX, RXが定義されていて通信用ポートとして使用されます。
基板にはUSBポートが搭載され、マイコンATSAMD11D14によりUSB通信が実現されています。 さらに、USBポートからの5V電源に対して、レギュレータ回路により 3.3Vの 電源も供給されています。
マイコンにはブートローダーというプログラムが書き込まれていて、これによ り、パソコンからのプログラムの書き込みと、プログラムの実行を行います。
C/C++言語で開発を行うとき、様々な関数、変数などが 定義されています。
pinmode(LED_BUILTIN,OUTPUT);
digitalWrite(LED_BUILTIN,HIGH);
void wait(void){
volatile int i;
for(i=0;i<35000;i++){
}
}
ATmega シリーズは Microchip 社のマイクロコントローラです(かつては Atmel 社の製品でしたが、会社が買収されました)。 データシートは Microchip 社から入手できますが、有志により日本語訳さ れたものも別サイトで公開されています。 本講義では、解説などには公式ドキュメントである英文を使用しますが、理解 の助けとして日本語訳を使用するのは問題ありません。 但し、日本語訳は公式ではありませんので、状況に応じて公式ドキュメントを 確認する必要があります。
ATmega の特徴はデータシートの表紙にまとめられています。 豊富な機能がありますが、本講義では基本的な機能しか使いません。 メモリーマップがシンプルで、スタックが実装されているため、 C 言語と 親和性が高いです。
我々が普段使っている Windows を使うパソコンでは、メモリは単一のもので、
プログラムとデータが共存しています。これを(フォン)ノイマン型コンピュー
タと呼んでいます。
一方、
プログラム領域は
データシートの PC
という記号で参照できます。
プログラム領域は 16 bit = 1 word でプログラムを記述しますが、一方で、
データも記述できます。
さらに本講義では扱いませんが、プログラム領域をプログラムによって書き換
えることもできます。
割り込み
が発生した時は、発生した割り込みに応じて 0x0001 番地から
プログラム領域にデータを書くには .db や .dw ディレクティヴを使用します。 ATmega のデータ処理単位は 8bit ですが、プログラム領域は 16bit 単位でアド レスが振られているので、プログラムからアドレスを指定してデータを読み出 す場合、(プログラム領域のアドレス*2)で最初のバイト、 (プログラム領域のアドレス*2+1)で次のバイトを読むことができます。 プログラム領域をアクセスするには lpm 命令を使いますが、アドレス指定は Z レジスタのみが使用できます。
ATmega がデータをやりとりする場所は、プログラム領域の他、レジスタ、I/O、
SRAM領域、EEPROM があります。
このうち、レジスタ、I/O、SRAM は連続したアドレスが割り振られていて、
LD と ST 命令でやりとりできます(
内部の数値論理ユニット(ALU)と接続して演算を行えるのはレジスタだけです。 したがって、機械語のプログラミングではレジスタの操作が重要になります。
ATmegaには 32 個のレジスタ(r0-r31)がありますが、
すべてのレジスタが同等ではありません(
各入出力ポートの他、割り込みや外部との通信用に I/O があります。 I/O 用の命令として in, out があります。 さらに、 I/O 自体は 64バイト用意されているのですが、前半の 32 バイトに 対してはビット演算命令 cbi, sbi, sbic, sbis を使用できます。 なお、ld, ldd, st, std 命令を用いて、 I/O 番地に 0x20 を加えた メモリ空間としてもアクセスできます。
SRAM は 0x0100(SRAM_START) 番地から
一方、
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
一方、
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
スタックは rcall, ret, reti で戻り番地を記憶するために使われる他、8bit のデータを出し入れをする push, pop でも使用できます。
ゲームのデータや利用者の設定情報など、電源を切っても失いたくないデータ
は EEPROM に書きます。
これの読み書きの仕組みは I/O にある EEPROM のアドレスレジスタとデータ
レジスタを使用します。
アドレスレジスタにアドレスを書けば、データレジスタにデータを読み書きでき
ます(データシート
I/O 領域は 64 Byte あり、さらに拡張 I/O 領域が
I/O領域に対する特別な入出力命令として IN , OUT 命令があります。 この場合、アドレスは 0x00 から 0x5F としてアクセスします。 さらに、前半のアドレス 0x00 から 0x1F の I/O 領域だけに有効な命令とし て、特定のビットを検査する SBI, CBI があります。
電源を入れた時やリセットした時は 0 番地から実行が始まります。
一方割り込みが発生した時はそれぞれの割り込みに割り当てられた割り込みベ
クタが呼び出されます。
(データシート
これらの条件にマイコンが反応すると、それぞれの割り込みに対して、定めら れた割り込みベクタの番地のプログラムを実行します。
割り込みを許可/不許可するための値やレジスタのことを割り込みマス
クと言います。
これには、個別の割り込みを ON/OFF するものの他に、全体の割り込みを
ON/OFF する全体割り込み許可フラグが Status Register の Bit7 I にありま
す(データシート
RETI
命令が用意されています。
このような他の要因に影響されずにひとまとまりに操作することを
アトミック
と言います。
ATmega のチップにおいて、クロックの入力方法や、ピンの使用方法など、起動以
前に設定しなければならない項目があります。
これらは、プログラムなどと一緒に設定情報として書き込む必要があります。
この設定情報はヒューズビットと呼ばれています。
これは 3 Byte あり、データシート
ヒューズビットで設定可能なのは、プログラムや EEPROM の読み書きの設定、 Broun-out 割り込みにおける電圧設定の他に、外部リセット端子の無効化、ク ロックの内部外部切り替え、内部クロックの速度の設定などです。 本講義では、これらはすべてデフォルトで使用しますが、高速に動作させたい など、デフォルト以外の動作をさせる場合は、精読して活用する必要がありま す。
本課題で必要な資料をなるべく収集しなさい。特に、PDFはダウンロードし ておき、HTML に関してはリンク集を作っておくこと。
サンプルプログラム Blink を改造して、点滅周期を様々に変更させなさい。
サンプルプログラム flashuno.asm を改造して、点滅周期を様々に変更させなさい。
発展演習に関しては、学生が任意に実施し、結果をプレゼンなどの方法で 報告する
抵抗の種類と特性についてまとめなさい。 特に、定格電力の大きいもの、周波数特性の良いもの、価格などを把握しなさい
コンデンサの種類と特性についてまとめなさい。 特に、容量の大きいもの、周波数特性の良いもの、 故障モード、価格などを把握しなさい
電池の種類と特性についてまとめなさい。 特に、容量、最大電流などを把握しなさい
LEDのデータシートを入手しなさい。 そして、定格電流、電圧降下などの特性を把握しなさい。
サンプルプログラム Blink を改造して、2回速く光らせてから1秒消灯させる等の点滅パターンが出るようにしなさい。
サンプルプログラム flashuno.asm を改造して、2回速く光らせてから1秒消灯させる等の点滅パターンが出るようにしなさい。
ATMegaの割り込みモードを一つ取り上げ、何に応用できるか検討しなさ い。
有益な情報提供を待ってます。 良いドキュメントの情報や、Macintosh での利用法など。 メールでの情報提供でも良いし、プレゼンテーションをしてもらっても良いです。