Почему мой отладчик неправильно переключается между делами в операторе switch? - PullRequest
0 голосов
/ 12 апреля 2019

Хорошо, поэтому для следующего кода, когда отладчик входит в оператор switch, он переходит из

строка 41 -> строка 38 -> строка 26

Тогда он постоянно колеблется между строками 38 и 26. Это даже не вводит первое утверждение случая, которое смущает меня, поскольку я работал над назначениями до раннего утра. Он не должен вводить любые другие случаи, так как PORTA инициализируется всеми нулями, и значение по умолчанию должно направлять отладчик на первый случай. Вы даже можете попробовать сами и посмотреть, что я имею в виду.

#include <avr/io.h>


int main(void)
{
    DDRA = 0x00; //PORTA = 0x00;
    DDRB = 0xFF; //PORTB = 0x00;

    typedef enum {
        wtf, //wait for PA3 to be pressed
        wth, //wait for PA2 to be pressed
        dooropens, //yay
        }doorstate;

    doorstate state = wtf;

    while (1) 
    {
        switch(state) 
        {
            case wtf:
                if (PORTA == 0x04)  {
                    state = wth; 
                    PORTA = 0x00; //releases button
                }
                else 
                    state = wtf;  
                break;
            case wth:
                if (PORTA == 0x02)  
                    state = dooropens; 
                else 
                    state = wtf;  
                break; 
            case dooropens:
                PORTB = 0x01;
                if (PORTA == 0x80) {
                    state = wtf;
                    PORTB = 0x00;
                }
                break;
            default:
                state = wtf;
        }
    }
}


Вот инструкции, если вам нужно лучше понять, что он должен делать.

Домохозяйство имеет цифровую кодовую систему блокировки на дверях. Система имеет кнопки на клавиатуре. Кнопка «X» подключается к PA0, «Y» к PA1 и «#» к PA2. Нажатие и отпускание «#», затем «Y», должно отпереть дверь, установив PB0 в 1. Любая другая последовательность не может разблокироваться. Нажатие кнопки изнутри дома (PA7) блокирует дверь (PB0 = 0). В целях отладки присвойте каждому состоянию номер и всегда записывайте текущее состояние в PORTC (рассмотрите возможность использования переменной состояния enum). Также убедитесь, что одновременно нажимается только одна кнопка

1 Ответ

0 голосов
/ 12 апреля 2019
PORTA == 0x04) 
{
state = wth; 
PORTA = 0x00; //releases button

Не уверен, что ты делаешь то, что пытаешься сделать. Вы не отпускаете кнопку с PORTA = 0x00

Как вы думаете, что вы будете читать на PORTA, если состояние 1 булавки на PORTA изменится?

  • изменить (PORTA == something) на (PORTA & something)

  • удалить строку PORTA = 0x00; //releases button

Примечание:

  • DDRA = 0x00; // сделать порт a входным

  • PORTA = 0x00; // отключаем подтягивания и переводим его в три состояния

...