2: 2009-08-03 (月) 22:10:44 takaboo | 3: 2009-08-04 (火) 03:26:02 takaboo | ||
---|---|---|---|
Line 37: | Line 37: | ||
マイコンのUSARTを使ったシリアル通信を行う。avr-libcで提供される標準I/Oルーチンを中継し、シリアル通信はGCC Developer Liteで提供される専用のライブラリを間接的に使用する。~ | マイコンのUSARTを使ったシリアル通信を行う。avr-libcで提供される標準I/Oルーチンを中継し、シリアル通信はGCC Developer Liteで提供される専用のライブラリを間接的に使用する。~ | ||
初期化まではsmpl1とほぼ同様だが、fdevopenで初期化された以後はC言語でよく使われる標準I/Oルーチン(putcharやprintf等)を使用する事ができる。 | 初期化まではsmpl1とほぼ同様だが、fdevopenで初期化された以後はC言語でよく使われる標準I/Oルーチン(putcharやprintf等)を使用する事ができる。 | ||
- | // 通信ポートを初期化 ボーレートは115200[bps] | + | // 通信ポートを初期化 ボーレートは115200[bps] |
- | rs_init (br115200, txb, sizeof(txb), rxb, sizeof(rxb)); | + | rs_init (br115200, txb, sizeof(txb), rxb, sizeof(rxb)); |
- | // 標準入出力をlibm32.a内のルーチンに割り当て | + | // 標準入出力をlibm32.a内のルーチンに割り当て |
- | fdevopen(rs_putchar, rs_getchar); | + | fdevopen(rs_putchar, rs_getchar); |
標準I/Oルーチンではまかないきれない機能は、シリアル通信ライブラリで提供されるサブルーチンで補填出来る。 | 標準I/Oルーチンではまかないきれない機能は、シリアル通信ライブラリで提供されるサブルーチンで補填出来る。 | ||
Line 46: | Line 46: | ||
PC4にソース接続されたLEDを点滅させる。~ | PC4にソース接続されたLEDを点滅させる。~ | ||
#ref(led1234.png) | #ref(led1234.png) | ||
- | AVRの内部レジスタは avr/io.h をインクルードする事でデータシートに記載されている名称で参照できる。~ | + | AVRの内部レジスタは avr/io.h をインクルードする事でデータシートに記載されている名称で参照出来る。なお、io.hは複数のデバイスのヘッダを取りまとめており、ATmega32の場合は avr/iom32.h が実体である。 |
+ | #include <avr/io.h> | ||
PC4を出力ポートに設定するにはDDRCの4ビット目を1に設定する。 | PC4を出力ポートに設定するにはDDRCの4ビット目を1に設定する。 | ||
DDRC |= _BV(DDC4); // PC4を出力に | DDRC |= _BV(DDC4); // PC4を出力に | ||
Line 58: | Line 59: | ||
PC4~PC7へそれぞれLEDをソース接続し点滅させる。~ | PC4~PC7へそれぞれLEDをソース接続し点滅させる。~ | ||
出力端子の初期化は以下の通り。 | 出力端子の初期化は以下の通り。 | ||
- | DDRC |= _BV(DDC4) | _BV(DDC5) | _BV(DDC6) | _BV(DDC7); // PC4..7を出力に | + | DDRC |= _BV(DDC4) | _BV(DDC5) | _BV(DDC6) | _BV(DDC7); // PC4..7を出力に |
点灯させるビットが増えると一つ一つビットを指定するのが面倒なので、4ビットまとめて点灯ないし消灯させる関数を用意している。 | 点灯させるビットが増えると一つ一つビットを指定するのが面倒なので、4ビットまとめて点灯ないし消灯させる関数を用意している。 | ||
void LED (int d) { | void LED (int d) { | ||
Line 100: | Line 101: | ||
// INT0/1割り込みを許可 | // INT0/1割り込みを許可 | ||
GICR |= _BV(INT1) | _BV (INT0); | GICR |= _BV(INT1) | _BV (INT0); | ||
- | マイコンの低消費電力モードを設定する。今回はINT0/1でスリープから復帰できるモードを選択する。 | + | |
+ | // 全割り込み許可 | ||
+ | sei (); | ||
+ | |||
+ | マイコンの低消費電力モードはINT0/1でスリープから復帰できるモードを選択する。 | ||
set_sleep_mode (SLEEP_MODE_IDLE); | set_sleep_mode (SLEEP_MODE_IDLE); | ||
mainの中では sleep_mode () をコールする以外に特に何もしないが、スリープから復帰した事を明示的にわかるようにLED4を点滅する様に仕掛けている。 | mainの中では sleep_mode () をコールする以外に特に何もしないが、スリープから復帰した事を明示的にわかるようにLED4を点滅する様に仕掛けている。 | ||
Line 112: | Line 117: | ||
LED (++cnt); | LED (++cnt); | ||
} | } | ||
- | INT1に対応した割り込みルーチン名は INT1_vect としてavr-libcにて決められているので、その様に記述。処理はcnt変数の値をインクリメントし、その値をLED1~3に表示する。 | + | INT1に対応した割り込みルーチン名は INT1_vect としてavr-libcにて決められているので、その様に記述。処理はcnt変数の値をデクリメントし、その値をLED1~3に表示する。 |
ISR(INT1_vect) { | ISR(INT1_vect) { | ||
LED (--cnt); | LED (--cnt); | ||
} | } | ||
+ | |||
**smpl7(ADC).c [#h9ecd904] | **smpl7(ADC).c [#h9ecd904] | ||
PA0~PA7の端子に入力されるDC0~5Vの電圧を計測し、シリアル通信で送信する。~ | PA0~PA7の端子に入力されるDC0~5Vの電圧を計測し、シリアル通信で送信する。~ | ||
Line 139: | Line 145: | ||
・PushButton2を押している間 | ・PushButton2を押している間 | ||
ADC=[ 0.57V,0.32V,1.21V,1.18V,1.55V,1.93V,1.82V,1.78V ] | ADC=[ 0.57V,0.32V,1.21V,1.18V,1.55V,1.93V,1.82V,1.78V ] | ||
+ | **smpl8(TIMERINT).c [#abc72a43] | ||
+ | タイマ/カウンタ0のオーバーフローを使用して一定間隔で割り込みを励起する。~ | ||
+ | タイマ/カウンタ0のオーバーフロー割り込みを許可するのは以下の通り。 | ||
+ | // タイマ/カウンタ0割り込みマスク構成 | ||
+ | TIMSK |= _BV(TOIE0); // タイマカウンタ0オーバーフロー割り込み許可 | ||
+ | タイマ/カウンタ0をCLK/1024(16MHz/1024=15.625kHz)で標準動作をさせるには以下の通り。クロックを選択した瞬間からタイマとして動作を開始する。 | ||
+ | TCCR0 = _BV(CS02) | _BV(CS00); // 標準動作,CLK/1024 | ||
+ | 15.625kHz毎にTCNT0の値がインクリメントされ、TOP値の255を超えて0にリセットされるとオーバーフロー割り込みが発生(15.625kHz/256=約61Hz)する。タイマ/カウンタ0のオーバフロー割り込みルーチン名は TIMER0_OVF_vect としてavr-libcにて決められているので、その様に記述。ここでは割り込みが発生したらさらにソフト的に分周し、約0.5秒毎にLED1を点滅させている。 | ||
+ | ISR (TIMER0_OVF_vect) { | ||
+ | static int cnt = 0; | ||
+ | // 1/16MHz * 1024 * 256 秒毎に割り込み発生 | ||
+ | if (cnt++ > 31) { // 約0.5秒毎にLEDを反転 | ||
+ | cnt = 0; | ||
+ | rbi (PORTC, PORTC4); | ||
+ | } | ||
+ | } | ||
+ | mainは諸々の初期化を行った後は例のごとくしつこく省電力モードに移行し続ける以外の処理は行っていない。 | ||
+ | while (1) { // 無限ループ | ||
+ | sleep_mode (); | ||
+ | } | ||
+ | **smpl9(2chPWM).c [#p286a3ce] | ||
+ | タイマ/カウンタ1の高速PWMモードにてPD4(OC1B)端子とPD5(OC1A)端子から個別のデューティー比でPWM信号を出力できる様に構成し、PWMの1周期(コンペアマッチ)毎に割り込みを発生させてLED1の点滅と周期の更新を行う。なお、PWM信号を五感で把握するにはPD4とPD5端子にオシロスコープ等を接続し、オシロスコープのディスプレイ上に表示される波形にて確認する。~ | ||
+ | まずLED1が接続されたPC4とPWM信号を出力するPD4とPD5を出力に設定する。 | ||
+ | // LED1(PC4)を構成 | ||
+ | DDRC |= _BV(DDC4); // PC4を出力に | ||
+ | PORTC &= ~_BV(PC4); // LEDをOFF PC4=0 | ||
+ | |||
+ | // ポート構成 | ||
+ | DDRD = _BV(DDB4) | _BV(DDB5); // PD5,PD4を出力に |