LEDをスイッチで点灯
AVRの入出力
ATTINY2313 (内部発振8MHz動作)
出力 | 入力 |
PD4--LED | PD2--SW(ON=GND |
PD5--LED | PD3--SW(ON=GND |
プログラム
もともとの初期設定=工場出荷時で実行しました。プログラムは以前つくったものなので周波数、設定などのコメントが違うことあり
ファイル名
#include
int main()
{
// 初期化
//ポート入出力設定
DDRD = 0xF3; // ポートDを1111 0011 #2,3だけ入力設定
PORTD = 0x0C; // 0000 1100 #2,3だけ内部プルアップ設定
// 出力
PORTD |= 0x10; // 0001 0000 #4だけ出力 led#4点灯
while(1){
if( bit_is_clear (PIND,PD2) ) { // ポートD#2 ==0 なら
PORTD |= _BV(PD5); //#2SW押しで Led#5点灯 PD5ピンを orHigh
}else{
PORTD &= ~_BV(PD5); //#2SW押さないと Led#5消灯 PD5ピンを andLow
}
}
}
*他ビットを変えない目的ビット操作を orHigh 、andLow と記述
動作
PD4-LED4 最初から点灯
PD2-SWを押している間 PD5 LED5点灯
入出力ポートについて
入力方向設定レジスタ DDR×
- 出力は 1
- 入力は 0
IOポート設定は少しPICなどと違うところがあり
データレジスタが出力用と読み取り(入力)用に分かれていて、別レジスタでする
- ポートB出力レジスタ PORTB (ポートAならPORTA)
- ポートB読み取りレジスタ PINB (ポートAならPINA)
AVRは変則的 ポート設定方法になっているところもある
- 方向設定レジスタ(DRR×) を入力設定にして
データレジスタ(PORT×)で1にすると
内部プルアップ設定になる (すべてのIOポートに内部プルアップ可能) - 方向設定レジスタ(DRR×)を出力設定にして
入力用データレジスタ(PIN×)で1にすると
出力データが反転になる
【 マクロ など 】
●ビットアクセス
マクロ _BV()
<avr/io.h>で、AVR各レジスタのビット名とビット番号(0~7)の対応が定義
たとえば、_BV(PINA6)は (1<<PINA6) を返し、これはPINA6に対応するビット(bit6)をONとした時のPINAの値 64 (二進数で0b00100000)を返します。
たとえば、_BV(PINA6)は (1<<PINA6) を返し、これはPINA6に対応するビット(bit6)をONとした時のPINAの値 64 (二進数で0b00100000)を返します。
ビット操作
- PORTB |= _BV(PB1); PB1ピンだけをHighにし、残りは変化させない
- PORTB &= ~_BV(PB1); PB1ピンだけをLowにし、残りは変化させない
* sbi(),cbi() はすでに廃止、削除されたとのこと
●ビットチェック bit_is_set() , bit_is_clear()
bit_is_set()
指定レジスタの指定のビットがセット(1)されているかどうかチェック
bit_is_clear()
セット(1)されてされていないかチェック
●ビットチェックループ用
loop_until_bit_is_set() , loop_until_bit_is_clear()
例)
while( bit_is_clear(PINB,PINB3) )
{
//PINB3が0の間この処理を行う
}
スポンサーリンク
- twtter
- google+
- hatena