ATmega16でデジタル入力を読み取るにはどうすればよいですか?


18

ATmega16でデジタル入力(プッシュボタン)を読み取るにはどうすればよいですか?プルアップ抵抗を有効にする必要がありますか、10kΩを使用できますか?簡単なコードはどうなりますか?単純な「押されたときにLEDをオンにする」だけです。

初心者向けのチュートリアルはありますか?私はグーグルとAVR Freaksを試しましたが、すべてがそこで戦いに発展し、答えが得られません。私はこのことに関するチュートリアルを実際に見つけていません。たくさんの特定の事柄がありますが、私のAVRマイクロコントローラーについて簡単なことはありません...


4
これは、ほとんどの初心者向けのチュートリアルで回答されます。ここでの完全な回答は、ヘルプよりも理解を損なう恐れがあります。学習するためにどのような事前の努力をしましたか?
ヤンバーニエ

私の投稿を見たのか、それを見ることができるのか分かりません(申し訳ありませんが、このサイトについてはまだ混乱しています...)
好奇心が強い

2
投稿を編集して、これをより正確に反映し、下の投稿も元の投稿に含めてください。
アモス

この AVR FreaksページでFrom-Scratch AVRチュートリアルをお試しください。そこにはもっとたくさんのものがあります。
レオンヘラー

回答:


24

ブラジルの挨拶!

まず第一に、あなたの例にジョビに感謝します。第二に、彼の例にはわずかなエラーがあります。番号0x20は正しくありません。0x04である必要があります。また、提案として、コードで0xFB、0x20、または0x04などの16進数を使用しません。io.hにあるPINポート定義と、ヘッダーファイルで参照される他のポート定義を使用することをお勧めします。初心者向けにいくつかコメントを付けて、以下のJobyの例を書き直しました。

# include <avr/io.h>

int main (void)
{
    // set all pins on PORTB for output
    DDRB = 0xFF;

    // set port pin PORTD2 as input and leave the others pins 
    // in their originally state (inputs or outputs, it doesn't matter)
    DDRD &= ~(1 << PD2);        // see comment #1

    while (1) 
    {
        if (PIND & (1<<PD2))    // see comment #2
            PORTB |= (1<<PB2);  // see comment #3
        else
            PORTB &= ~(1<<PB2); // see comment #4
    }
    return 0;
}

/ *

初心者向けのコメント

コメント#1:(1 << PD2)バイナリ00000100を生成します。操作「〜」はすべての数字を反転します。つまり、バイナリは11111011になります。最後に&=はDDRDと11111011の間に論理「AND」を適用し、結果が再び配置されますDDRDメモリ内。注:演算子「AND」は、DDRDメモリ内の各ビットに対して、上記の2進数と比較します。DDRDのビットが0で、同じバイト位置のバイナリのビットが1の場合、結果のビットは0です。DDRDが1で、バイナリのビットが1の場合、結果のビットは1です。 DDRDのビットが1または0で、バイナリのビットが0の場合、結果のビットは常に0です。要約すると、コマンドDDRD&=〜(1 << PD2)はビットPD2のみをゼロに変更し、他の1つ(0または1)はそのままにします。少し複雑に見えますが、慣れると、他のビットを変更せずに少しずつ変更する最良の方法です。

コメント#2:(1 << PD2)はバイナリ00000100を生成します。コメント#1で説明した同じロジック「AND」を使用して、コマンド「PIND&0000100」はPIND2(プッシュボタンが接続されている入力ピンto)は、highまたはnotに設定されます。バイナリビットが0に設定されているため、他のすべてのピンはFALSEになり、バイナリビット#2が1に設定されているため、IFステートメントはPD2入力がhighに設定されている場合のみTRUE、PD2入力が低に設定します。

コメント#3:コメント#1で説明したロジックに従って、このコマンドはポートPORTBの出力ピンPINB2を高電圧に設定します。LEDが約300オームの抵抗でこのピンポートに正しく接続されていて、その抵抗がアースに接続されている場合、LEDが点灯します。

コメント#4:前のコメントで説明したのと同じ理由でLEDが消灯するはずです。

最終的な考慮事項:

a)プッシュボタンが押されていないとき(開回路)に入力ピンPD2の電圧発振を防ぐため、LEDが誤って点灯しないように、プルダウン抵抗(1 kOhm以上)を配置することを強くお勧めしますこのランダムな電圧振動に。

b)免責事項:ここで説明するアイデアは教育目的でのみ使用するものであり、電子機器の専門家に相談する前に実際のシステムで使用しないでください。

* /


3
メールで対応するとコミュニケーションが非公開になるため、メールを送信することはお勧めしません。したがって、他の誰も利益を得ることができません。しかし、プライベートなコミュニケーションのためにメールを本当に提供したい場合、それを行うのに最適な場所はプロフィールです。
ダニエルグリロ

その逆ではありません-#3はLEDをオフにし、#4はLEDをオンにしますか?
シチルジュ

2

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in

#include <avr/io.h>

/*
 * Assumptions:
 *  - LED connected to PORTB.2
 *  - Switch connected to PORTD.2
 */

int main (void)
{
    /* set PORTB for output*/
    DDRB = 0xFF;
    /* set PORTD for input*/
    DDRD &= 0xFB;
    PORTD |= 0x04;

    while (1) {
        if (PIND & 0x04)
            PORTB &= ~0x20;
        else
            PORTB |= 0x20;
    }
    return 0;
}

提供されたリンクを@joby Taffeyに感謝します。EEPROM関数を探していましたが、mainframe.cx /〜ckuethe / avr-c- tutorial / lesson11.cから多くの助けを得ました。ありがとうございます。
ビシャール・パウデル

2

HackadayにはAVRプログラミングに関する素晴らしい記事がありました。それはあなたを助けることができる多くの素晴らしい情報を持っています

http://hackaday.com/2010/11/19/avr-programming-04-writing-code-etc/

http://hackaday.com/2010/11/05/avr-programming-03-reading-and-compiling-code/

http://hackaday.com/2010/10/25/avr-programming-02-the-hardware/

http://hackaday.com/2010/10/23/avr-programming-introduction/



0

メカニカルスイッチからのデジタル入力を処理する際に考慮すべきことは、接点がバウンドすることです。1つのボタンのプッシュを複数のプッシュのように変更する必要があります。

ボタンが押されているときにLEDをオンにするような場合は、おそらくデバウンスを心配する必要はありません。もう少し複雑なもの(ボタンを押すときのLEDの切り替えなど)の場合、デバウンスは必須です。

Jack Ganssleにはデバウンスの良いガイドがあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.