AVR контроллер, кнопка выпуска - PullRequest
0 голосов
/ 22 мая 2018

У меня проблема, микроконтроллер просто не регистрируется, когда я нажимаю кнопку.Как это не случилось.Вот мой код

    #ifndef F_CPU   
    #define F_CPU 1000000UL         
    #endif

    #define bit_is_clear(byte, bit) (!(byte & (1 << bit)))

    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>

    typedef enum { false, true } boolean;
    boolean clicked = false;

    int sigurno_pritisnut = 0;

    void pressed();
    void unpressed();

    int main(void)
{
    //LED OUTPUT
    DDRB |= (1 << PINB0) | (1 << PINB1) | (1 << PINB2);

    //LED LOW
    PORTB &= ~((1 << PINB0) | (1 << PINB1) | (1 << PINB2));

    //BUTTON INPUT
    DDRC &= ~(1 << PINC5);

    //BUTTON HIGH
    PORTC |= (1 << PINC5);

    /* Replace with your application code */
    while (1) 
    {
        if(bit_is_clear(PINC, PINC5)){
            sigurno_pritisnut++;
            if(sigurno_pritisnut > 400){
                clicked = !clicked;
                sigurno_pritisnut = 0;
            }
        }

        if(clicked){
            pressed();
        }else{
            unpressed();
        }

    }
}

void pressed(){
    PORTB ^= (1 << PINB0);
    _delay_ms(500);
    PORTB ^= (1 << PINB1);
    _delay_ms(500);
    PORTB ^= (1 << PINB2);
    _delay_ms(500);
    sigurno_pritisnut = 0;
}

void unpressed(){
    PORTB ^= (1 << PINB0);
    _delay_ms(500);
    PORTB ^= (1 << PINB0);
    PORTB ^= (1 << PINB1);
    _delay_ms(500);
    PORTB ^= (1 << PINB1);
    PORTB ^= (1 << PINB2);
    _delay_ms(500);
    PORTB ^= (1 << PINB2);

}

................................................................... Я пробовал с другими кнопками, пробовал с другими контактами, но ничего....................................................................

1 Ответ

0 голосов
/ 22 мая 2018

Кажется, проблема в ваших заявлениях о задержке.И в pressed, и в unpressed вы ждете 3 x 500 мс.

В цикле вы хотите посмотреть bit_is_clear 400 раз, прежде чем изменять clicked.

Так что, похоже, *Значение 1009 * должно быть истинным за 600 секунд до изменения clicked.

Обратите внимание, что это

    if(clicked){
        pressed();
    }else if(!clicked){
        unpressed();
    }

совпадает с

    if(clicked){
        pressed();
    }else
        unpressed();
    }

, поэтому в каждом циклеВы введете один из них.

Далее кажется странным, что здесь нет else:

    if(bit_is_clear(PINC, PINC5)){
        sigurno_pritisnut++;
        if(sigurno_pritisnut > 500){
            clicked = !clicked;
            sigurno_pritisnut = 0;
        }
    }
    else
    {
        // ... don't you need some code here?
    }

Так кнопка работает так

bit_is_clear == true означает нажато

bit_is_clear == false означает выпущено

вам понадобится что-то вроде:

while (1) 
{
    while (1)  // Loop until a state is changed
    {
        if(bit_is_clear(PINC, PINC5))
        {
             // pressed
             if (clicked)
             {
                 // Same state so just continue...
                 sigurno_pritisnut = 0;
                 continue;
             }
             sigurno_pritisnut++;
             if(sigurno_pritisnut > 400){
                 clicked = 1;
                 sigurno_pritisnut = 0;

                 // State change - break out
                 break;
             }
         }
         else
         {
             // released
             if (!clicked)
             {
                 sigurno_pritisnut = 0;
                 continue;
             }
             sigurno_pritisnut++;
             if(sigurno_pritisnut > 400){
                 clicked = 0;
                 sigurno_pritisnut = 0;
                 break;
             }
         }
    }

    if(clicked){
        pressed();
    }else{
        unpressed();
    }

}

Таким образом, вы звоните pressed / unpressed только когда что-то новое произошло.

...