Switch-case не работает с микроконтроллером AVR Atmega32?

Привет, друзья, я не знаю, что происходит, ни оператор switch, ни оператор if, else не работает для меня. Я хочу передать некоторые данные как в PORTB, так и в PORTD, когда некоторые конкретные данные поступают в регистр PORTA в моем «блоке переключателя». Ранее я использовал PINA вместо PORTA, но он все еще не работает, но когда я начинаю отлаживать и предоставлять некоторые данные, указав PORTA = 0b00001110, он легко дает значения PORTB = 0b00000010 .... пожалуйста, помогите ..

/*
 * robotic_arm.c
 *
 * Created: 2/3/2015 10:39:25 AM
 *  Author: Shrikant Vaishnav
 */ 

#define F_CPU 1600000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{ DDRA=0x00;//make PORTA as input
  DDRB=0xFF;//make PORTB as output
  DDRD=0XFF;//make PORTD as output

    while(1)
    {

        switch(PORTA)
        {

        //First Three conditions for Robotic ARMs

        case 0b00001110:
         {
            PORTB=0b00000010;
             _delay_ms(50);
             break;
         }

         case 0b00001101:
         {
            PORTB=0b00001000 ;
             _delay_ms(50);
            break; 
         }

         case 0b00001011:
         {
            PORTB=0b00100000 ;
             _delay_ms(50);
             break; 
         }

         //Condition for Direction Change of Motors of Robotic Arms
         case 0b00000110:
         {
             PORTB=0b00000001;
              _delay_ms(50);
             break;

         }

         case 0b00000101:
         {
             PORTB=0b00000100;
              _delay_ms(50);
             break;

         }

          case 0b00000011:
          {
              PORTB=0b00100000;
              _delay_ms(50);
              break;

          }

        //Now Driving Robotic Car
         case 0b00000010:
         {
             PORTD=0b00000010;
              _delay_ms(50);
             break;

         }

          case 0b00000001:
          {
              PORTD=0b00000001;
               _delay_ms(50);
              break;

          }

        default:
        { 
            PORTB=0b00000000; //0ff motors when no signal sent
            PORTD=0b00000000; //OFF DRIVING CAR
             _delay_ms(50);
            break;

         }


    }
}

return 0;

}

person Shrikant Vaishnav    schedule 22.02.2015    source источник
comment
Возможно, ваши внешние переключатели неверны или дают кратковременное переходное значение. В последнем случае может быть вызван оператор default. В качестве предложения, почему бы вам не попробовать просто постоянно записывать ввод PORTA в вывод PORTB и смотреть, что происходит. Кстати, в заявлении case 0b00001101: { PORTA=0b00001000; ...} вы действительно хотели написать PORTA?   -  person Weather Vane    schedule 22.02.2015
comment
Вы наверное не собирались определять тактовую частоту 1.6Ггц? Для _delay_ms() требуется правильно установленный F_CPU.   -  person Rev    schedule 23.02.2015


Ответы (2)


Вы уверены, что верхние контакты PORTA все 0? Если нет, то ни один из случаев не будет совпадать.

Можешь попробовать

switch(PINA & 0x0F)

вместо. Это гарантирует, что более высокие штифты не приведут к сбою корпусов.

person uncleO    schedule 22.02.2015
comment
Но сэр, если я заземлю верхние четыре бита (полубайт) на 0, то, по-вашему, эта логика работает? - person Shrikant Vaishnav; 23.02.2015
comment
Да, код выглядит хорошо, за исключением второго случая, когда вы пишете в PORTA вместо PORTB. - person uncleO; 23.02.2015

Обратите внимание, что регистр для проверки не PORTA, а PINA. Вы должны различать «порт x», когда речь идет об аппаратном блоке, и PORTx, когда речь идет о доступе к регистрам специальных функций. Чтение «порта A» означает чтение регистра PINA.

  • PORTx - это регистры, в которых вы устанавливаете выход (или, если он настроен как вход), подтягивания
  • PINx — это регистры, в которых хранится текущий уровень входного сигнала на выводах. (если они настроены на вывод, они, конечно, получают то же значение, что и PORTx (но с некоторой задержкой)

На современных AVR вы также можете писать в регистры PIN, если хотите переключить вывод. Это экономит несколько циклов по сравнению с обычным способом чтения PORT, операции XOR и обратной записи.

person vlad_tepesch    schedule 23.02.2015
comment
Сэр, это означает, что для чтения состояния PORT мы должны использовать PINx, а для записи мы должны использовать PORTx... - person Shrikant Vaishnav; 24.02.2015
comment
@ShrikantVaishnav да, пожалуйста, загляните в раздел технических данных о цифровых входах. - person vlad_tepesch; 05.03.2015