0

pic16f877a では、単一のボタンを使用してソフトウェアのデバウンスに使用されるコードを作成しようとしていますが、ボタンをクリックするたびにオンになり、二度とオフにならないコードは次のとおりです。

                #include "config.h"

                unsigned int ledToggle(void);

                void main(){

                    TRISCbits.TRISC0 = 1;
                    TRISDbits.TRISD0 = 0;
                    PORTDbits.RD0 = 0;

                    while(1){
                        if(PORTCbits.RC0 == 1){

                            if(ledToggle()%2 == 0){
                                PORTDbits.RD0 = 1;
                            }else{

                                PORTDbits.RD0 = 0;

                            }
                        }


                    }

                }


                unsigned int ledToggle(){
                    static int i = 2;
                    i++;
                    return i;

                }

編集


また、問題のあるこの新しいコードを作成しましたが、ここにない場合があります。

        #include "config.h"

            static char flag = 0;
            static int counter = 0;

        unsigned int ledToggle(void);

        void main(){

            TRISCbits.TRISC0 = 1;
            TRISDbits.TRISD0 = 0;
            PORTDbits.RD0 = 0;

            while(1){

                    if(ledToggle()%2 == 0){
                        PORTDbits.RD0 = 1;
                    }else{

                        PORTDbits.RD0 = 0;

                    }


            }

        }


        unsigned int ledToggle(){

            if(PORTCbits.RC0 == 1 && flag == 0){

                counter++;
                flag = 1;

            }else{

                counter += 0;
                flag = 0;
            }
            if(PORTCbits.RC0 == 0){

                flag = 0;
            }
            return counter;

        }

ところで、config.h は、ビットとクリスタル周波数 (_XTAL_FREQUENCY) を構成するために作成したヘッダー ファイルであることを忘れていました。

4

2 に答える 2

0

ここで 2 つの問題があることがわかります。まず、RC0 がハイのときにのみ出力の状態を変更します。したがって、RC0 が Low になると、出力は以前の状態にとどまります。たとえば、入力がオフのときに出力を低くしたい場合は、次のようにします。

while(1){
    if(PORTCbits.RC0 == 1){
        if(ledToggle()%2 == 0){
            PORTDbits.RD0 = 1;
        }else{
            PORTDbits.RD0 = 0;
        }
    }
    else
        PORTDbits.RD0 = 0;
}

ここで私が間違っていると思う 2 番目のことは、rmi のコメントに関連しています。ボタンのバウンスを解除しようとしているが、遅延やその他のロジックがなければ、このコードはそれを行いません。あなたの写真に他にやるべきことがあまりない場合、簡単な解決策は次のとおりです。

while(1){
    if(PORTCbits.RC0 == 1){
        PORTDbits.RD0 = 1;//Or use you toggle, or something else

        //This will waste more than 65025 cycles (255*255 + loop overhead)
        //At 4MHz, thats 16ms minimum
        for( char i = 0; i < 0xFF; i++ )
            for( char j = 0; j < 0xFF; j++ )
                Nop();
    }
    else
        PORTDbits.RD0 = 0;
}
于 2014-08-15T13:14:01.757 に答える
0

私の質問に対する最良かつ最も簡単な解決策を見つけました:

2番目のコードは機能しませんでした(機能する場合もあれば、機能しない場合もあります)。ボタンを押すと、1と0の組み合わせの信号が表示されるためです。

http://i.imgur.com/gTDHavI.png

これは非常にシンプルで、実際には悪い写真ですが、皆さんにお見せするためにペイントで描きました。したがって、ボタンを押して最初の部分または1と0の部分(1010101010)をスキップし、そのようにする必要があります。

1.ButtonPress_Level という変数を宣言します。

2. while ループ内で、ボタンが押されている限り、この変数に 1 を追加し続ける別の while ループを作成します。

3. 0 と 1 がある最初の部分をスキップし、たとえば最初の 500 信号の後、LED のオンまたはオフを開始します。

これは理解できないように思えるかもしれませんが、コード全体を見ると理解できます::

                #include "config.h"

                static char flag = 0;
                static int counter = 0;
                static unsigned int Pressed_Level = 0;

            unsigned int ledToggle(void);

            void main(){
                TRISDbits.TRISD0 = 0;
                TRISCbits.TRISC0 = 1;

                PORTDbits.RD0 = 0;

                while(1){

                        if(ledToggle()%2 == 0){
                            PORTDbits.RD0 = 1;
                        }else{

                            PORTDbits.RD0 = 0;

                        }


                }

            }


            unsigned int ledToggle(){

                if(PORTCbits.RC0 == 1 && flag == 0){

                    while(PORTCbits.RC0 == 1){
                    Pressed_Level++;
                    }
                    flag = 1;

                    if(Pressed_Level >= 500){
                    counter++;
                    }

                }else{

                    counter += 0;
                    flag = 0;
                    Pressed_Level = 0;

                }
                if(PORTCbits.RC0 == 0){

                    flag = 0;
                }
                return counter;

            }

繰り返しになりますが、config.h は構成ビットを設定するだけのヘッダー ファイルなので、重要ではないことを心配する必要はありません。

したがって、このコードでは、デバウンスはカウンターとして機能し、偶数の場合はピンをオンにし、奇数の場合はオフにします

于 2014-08-16T11:16:19.103 に答える