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.82​V,1.78V ]   ADC=[ 0.57V,0.32V,1.21V,1.18V,1.55V,1.93V,1.82​V,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関連


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom