ここから本文です

AVRのプログラムが上手くいきません。

nku********さん

2012/4/1120:14:55

AVRのプログラムが上手くいきません。

閲覧ありがとうございます
今回


#define F_CPU 1000000UL
#include <util/delay.h>

#include <avr/io.h>

int main()
{


// 初期化
//ポート入出力設定
DDRD = 0b11110011; // ポートDを1111 0011 #2,3だけ入力設定
PORTD = 0b00001100; // 0000 1100 #2,3だけ内部プルアップ設定


while(1){

if(bit_is_clear(PIND,PD2))

{ PORTD =0b11110011;
_delay_ms(3);

PORTD =0b00000000;
_delay_ms(50);
}
else{
PORTD =0b0000000;
}

}
}


とプログラミングしましたがPIND2をGNDにつないでもつながなくてもPINDへの出力に変化がありません。
ただPIND2をVCCにつなぐとPINDへの出力がなくなりました。

clearをsetに変えたときはPIND2をGNDにつなぐと出力がなくなりつながないと出力がありVCCにつなぐと出力がありました

どうしてこのようなことが起きるのでしょうか?
そしてclearのときにGNDにつなぐと出力、つながないと出力しない
とするためにはどうすればよいのでしょうか
回答お願いします。

閲覧数:
306
回答数:
1

違反報告

ベストアンサーに選ばれた回答

m_t********さん

2012/4/1122:17:01

> PORTD =0b11110011;
> PORTD =0b00000000;
これらの処理で、PD2/PD3のプルアップが解除されてしまいます。
プルアップなしでは、入力ピンをVCCにもGNDにもつないでいない時の入力状態が安定しません。


> PORTD =0b11111111;
> PORTD =0b00001100;
のようにPD2/PD3は1なデータを出力するようにしてください。


あとは、
・bit_is_clear は、0かどうか、つまり、PD2をGNDにつないだかどうかをチェックする。PD2をどこにもつながない場合も、プルアップ抵抗によりVccにつないだことになる。
その結果、PD2をGNDにつないだとき、出力がHになり、そうでないときはLになる

・bit_is_set は、1かどうか、つまり、PD2をVCCにつないだかどうかをチェックする。PD2をどこにもつながない場合も、プルアップ抵抗によりVccにつないだことになる。
その結果、PD2をGNDにつないだとき、出力がLになり、そうでないときはHになる

ということになります。
> そしてclearのときにGNDにつなぐと出力、つながないと出力しない

そうしたい場合は、
---
if(bit_is_clear(PIND,PD2)){
PORTD =0b0001100;
} else {
PORTD =0b11111111;
_delay_ms(3);
PORTD =0b00001100;
_delay_ms(50);
}
---
のように、ifとelseの内容を入れ替えてください。

この回答は投票によってベストアンサーに選ばれました!

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる