I/Oポート

 AVRレジスタ周りのメモとして書くことにします。今回は単にピンの入出力のみ。おいおいタイマとかA/D変換載せます。(現時点でまだA/D変換を試せてません) マイコンってレジスタいじるのが意外と面倒ですよね...ってこんなこと言ったらマイコンいじるなって怒られそうですがw


対象マイコン

 全種類(のはず) 今回はATTiny2313を前提として書きます。


入出力ポート基本

 基本的に触ることになるレジスタはDDRx, PORTx, PINx。

その他としてプルアップを禁止してしまうレジスタMCUCRがあるのですが、ここを直接触る機会はほとんど無いと思われるので割愛します。


ピン初期値

レジスタピン有りピン無し
DDRxR/W(0)R(N/A)
PORTxR/W(0)R(0)
PINxR/W(N/A)R(N/A)

例:PORTD(ATTiny2313)

bit76543210
Read/WriteRR/WR/WR/WR/WR/WR/WR/W
Intial Value00000000

入力

 入力時には上記DDRx, PORTx, PINxすべてを使います。

 ピンを入力に設定するときはDDRxの該当ポートを0に設定。次にプルアップの有無をPORTxで設定。

DDRxPORTxdescription
LL入力-プルアップ無し
LH入力-プルアップ有り

 ピンの状態を読むのはPINxから。 基本的にスイッチを付けたい場合はプルアップにすると良いでしょう。


注意:内部のプルアップ抵抗は20~50kΩ


出力

 出力時はDDRx, PORTxを使います。

 ピンを出力に設定するときはDDRxの該当ポートを1に設定。

DDRxPORTxdescription
HLL出力
HHH出力

覚えておくと便利そうな事

 io.h*1マクロでピンの名前が定義されてます。

/* Data Register, Port D */
#define    PD6     6
#define    PD5     5
#define    PD4     4
#define    PD3     3
#define    PD2     2
#define    PD1     1
#define    PD0     0

 何が便利かというと、今回出てきたレジスタの設定で例えば、PD2(ATTiny2313では6番ピン)だけをH出力、他をプルアップ無しの入力にしたい時には

DDRD  = (1<<PD2); // ポートDの入出力方向指定
PORTD = (1<<PD2); // PD2をH出力、他をプルアップ無し入力

という具合に書けます。


 その他として

DDRD |=  (1<<PD2); // PD2の位置にbitを立てる
DDRD &= ~(1<<PD2); // PD2の位置のbitを落とす
DDRD ^=  (1<<PD2); // PD2の位置のbitを反転する

などは覚えておくと便利です。


サンプルコード

f:id:hijouguchi:20100625180303p:image

#include <avr/io.h>                                                                                                                                                                     
int main(void)
{

  /*  
   * PD5を入力、PD6を出力
   * スイッチの状態をPD6に映すプログラム
   * スイッチが押されたときにPD5がLになる
   */

  DDRD  =  (1<<PD6); // PD6のみ出力設定
  PORTD = ~(1<<PD6); // PD6をL、他のポートはプルアップ有り入力

  while(1) {
    if((~PIND & (1<<PD5)) ==  (1<<PD5)) { // PD5がL(スイッチが押されてた)なら
      PORTD |=  (1<<PD6); // PD6をH
    } else {
      PORTD &= ~(1<<PD6); // PD6をL
    }   
  }

  return 0;
}

詳しくは

ATTiny2313データシート http://www.atmel.com/dyn/resources/prod_documents/doc8246.pdf

*1:正確には使用するマイコンのヘッダ

コメント
0件
トラックバック
1件
ブックマーク
0 users
hijouguchi
hijouguchi