3: 2009-08-04 (火) 03:26:02 takaboo | 4: 2009-08-04 (火) 03:46:21 takaboo | ||
---|---|---|---|
Line 2: | Line 2: | ||
*一覧 [#j8c69fab] | *一覧 [#j8c69fab] | ||
**smpl1(USART).c [#y20358e6] | **smpl1(USART).c [#y20358e6] | ||
- | マイコンのUSARTを使ったシリアル通信を行う。シリアル通信はGCC Developer Liteで提供される専用のライブラリを直接使用し、文字及び文字列の送受信や書式化文字列の送信を行う。~ | + | マイコンのUSARTを使ったシリアル通信を行う。シリアル通信はGCC Developer Liteで提供される専用のライブラリを直接使用し、文字及び文字列の送受信や書式化文字列の送信を行う。 |
シリアル通信ライブラリのプロトタイプ宣言はrs.hとして提供され、ソースにインクルードする事で参照される。~ | シリアル通信ライブラリのプロトタイプ宣言はrs.hとして提供され、ソースにインクルードする事で参照される。~ | ||
#include <rs.h> // USART通信ライブラリ | #include <rs.h> // USART通信ライブラリ | ||
Line 35: | Line 36: | ||
**smpl2(USART).c [#jbe6dac4] | **smpl2(USART).c [#jbe6dac4] | ||
- | マイコンの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] | ||
Line 57: | Line 59: | ||
**smpl4(4bitLED).c [#k0566312] | **smpl4(4bitLED).c [#k0566312] | ||
- | 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を出力に | ||
Line 93: | Line 96: | ||
**smpl6(PIOINT).c [#g253e09b] | **smpl6(PIOINT).c [#g253e09b] | ||
- | 外部割り込みを使ってプッシュボタンの押下を検出し、各々のボタンで異なる機能を持たせる。さらに、割り込みが発生しない間はマイコンをスリープモードにし、低消費電力モードに移行させる。~ | + | 外部割り込みを使ってプッシュボタンの押下を検出し、各々のボタンで異なる機能を持たせる。さらに、割り込みが発生しない間はマイコンをスリープモードにし、低消費電力モードに移行させる。 |
プッシュボタン1,2はPD2(INT0)とPD3(INT1)に直結しており、押下されて信号が0になった瞬間に割り込みを励起するよう設定する。 | プッシュボタン1,2はPD2(INT0)とPD3(INT1)に直結しており、押下されて信号が0になった瞬間に割り込みを励起するよう設定する。 | ||
// INT0/1の割り込み条件を立下りエッジに | // INT0/1の割り込み条件を立下りエッジに | ||
Line 123: | Line 127: | ||
**smpl7(ADC).c [#h9ecd904] | **smpl7(ADC).c [#h9ecd904] | ||
- | PA0~PA7の端子に入力されるDC0~5Vの電圧を計測し、シリアル通信で送信する。~ | + | PA0~PA7の端子に入力されるDC0~5Vの電圧を計測し、シリアル通信で送信する。 |
ここではA/D変換するにあたり基準となる電圧(DC5V)をAVCC端子に接続した。 | ここではA/D変換するにあたり基準となる電圧(DC5V)をAVCC端子に接続した。 | ||
#ref(cn2_adc.png) | #ref(cn2_adc.png) | ||
Line 145: | Line 150: | ||
・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] | **smpl8(TIMERINT).c [#abc72a43] | ||
- | タイマ/カウンタ0のオーバーフローを使用して一定間隔で割り込みを励起する。~ | + | タイマ/カウンタ0のオーバーフローを使用して一定間隔で割り込みを励起する。 |
タイマ/カウンタ0のオーバーフロー割り込みを許可するのは以下の通り。 | タイマ/カウンタ0のオーバーフロー割り込みを許可するのは以下の通り。 | ||
// タイマ/カウンタ0割り込みマスク構成 | // タイマ/カウンタ0割り込みマスク構成 | ||
Line 165: | Line 172: | ||
sleep_mode (); | sleep_mode (); | ||
} | } | ||
+ | |||
**smpl9(2chPWM).c [#p286a3ce] | **smpl9(2chPWM).c [#p286a3ce] | ||
- | タイマ/カウンタ1の高速PWMモードにてPD4(OC1B)端子とPD5(OC1A)端子から個別のデューティー比でPWM信号を出力できる様に構成し、PWMの1周期(コンペアマッチ)毎に割り込みを発生させてLED1の点滅と周期の更新を行う。なお、PWM信号を五感で把握するにはPD4とPD5端子にオシロスコープ等を接続し、オシロスコープのディスプレイ上に表示される波形にて確認する。~ | + | タイマ/カウンタ1の高速PWMモードにてPD4(OC1B)端子とPD5(OC1A)端子から個別のデューティー比でPWM信号を出力できる様に構成し、PWMの1周期(コンペアマッチ)毎に割り込みを発生させてLED1の点滅と周期の更新を行う。~ |
- | まずLED1が接続されたPC4とPWM信号を出力するPD4とPD5を出力に設定する。 | + | PWM信号を五感で把握するにはPD4とPD5端子にオシロスコープ等を接続し、オシロスコープのディスプレイ上に表示される波形にて確認する。 |
+ | |||
+ | LED1が接続されたPC4とPWM信号を出力するPD4とPD5を出力に設定する。 | ||
// LED1(PC4)を構成 | // LED1(PC4)を構成 | ||
DDRC |= _BV(DDC4); // PC4を出力に | DDRC |= _BV(DDC4); // PC4を出力に | ||
PORTC &= ~_BV(PC4); // LEDをOFF PC4=0 | PORTC &= ~_BV(PC4); // LEDをOFF PC4=0 | ||
- | // ポート構成 | + | // PWM出力端子を構成 |
- | DDRD = _BV(DDB4) | _BV(DDB5); // PD5,PD4を出力に | + | DDRD |= _BV(DDB4) | _BV(DDB5); // PD5,PD4を出力に |
+ | タイマ/カウンタ1を高速PWMモードに設定する。ICR1がPWMの周期、OCR1AがPD5(OC1A)のデューティー、OCR1BがPD4(OC1B)のデューティーとなり、ここでは周期を8ms(=125Hz=CLK/256 /500)としたので以下の通りに設定する。 | ||
+ | // タイマ/カウンタ1を高速PWMモードに設定 (ICR1でTOP) | ||
+ | TCNT1 = 0; | ||
+ | ICR1 = 500; // TOP値 62.5kHz/500=8ms周期 | ||
+ | OCR1A = cnt[0]; // PD5(OC1A)のデューティー | ||
+ | OCR1B = cnt[1]; // PD4(OC1B)のデューティー | ||
+ | TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11); | ||
+ | TCCR1B = _BV(CS12) | _BV(WGM13) | _BV(WGM12); // CLK/256=62.5kHz | ||
+ | TCNT1の値がICR1と一致したらコンペアマッチA割り込みを励起させるには、TIMSKのOCIE1Aビットを1にする。 | ||
+ | // タイマ/カウンタ割り込みマスク設定 | ||
+ | TIMSK |= _BV(OCIE1A); | ||
+ | タイマ/カウンタ1のコンペアマッチAオーバフロー割り込みルーチン名は TIMER1_COMPA_vect としてavr-libcにて決められているので、その様に記述。割り込み発生毎に各々のPWMのデューティ値をインクリメントし、500以上になったら0にリセットしている。 | ||
+ | ISR (TIMER1_COMPA_vect) { | ||
+ | int i; | ||
+ | |||
+ | // 1周期毎に比較レジスタ更新 | ||
+ | for (i = 0; i < 2; i++) if (cnt[i]++ > 500) cnt[i] = 0; | ||
+ | OCR1A = cnt[0]; | ||
+ | OCR1B = cnt[1]; | ||
+ | |||
+ | rbi (PORTC, PINC4); // LEDビット反転 | ||
+ | } | ||
+ | |||
+ | **smpl10(EEPROM).c [#v4acb9af] | ||
+ | マイコンに内蔵されたEEPROMの読み書きを行う。操作及び状況の確認はシリアル通信にて行う。 | ||
+ | |||
+ | 内蔵EEPROM関連のサブルーチン等 avr/eeprom.h に定義される。 | ||
+ | #include <avr/eeprom.h> // EEPROM関連 |