首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开关柜不适用于AVR Atmega32单片机吗?

开关柜不适用于AVR Atmega32单片机吗?
EN

Stack Overflow用户
提问于 2015-02-22 22:48:55
回答 2查看 2.6K关注 0票数 0

朋友们您好,我不知道发生了什么事情既不是switch-case也不是if,else语句对我有效我想给PORTB和PORTD一些数据当一些特定的数据到达我的“开关模块”中的PORTA寄存器之前我使用PINA而不是PORTA,但它仍然不起作用,但当我开始调试并通过提供PORTA=0b00001110提供一些数据时,它很容易给出值PORTB=0b00000010...请帮帮我..

代码语言:javascript
复制
/*
 * 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;

}
EN

回答 2

Stack Overflow用户

发布于 2015-02-23 04:04:37

你确定PORTA的高位引脚都是0吗?如果不匹配,则所有案例都不会匹配。

你可以试试

代码语言:javascript
复制
switch(PINA & 0x0F)

而不是。这将确保较高的引脚不会导致案例失败。

票数 1
EN

Stack Overflow用户

发布于 2015-02-24 00:39:01

请注意,要测试的寄存器不是PORTA,而是PINA。当引用硬件单元时,您必须区分“端口x”;当谈论访问特殊功能寄存器时,您必须区分PORTx。读取‘端口A’意味着读取PINA寄存器。

  • PORTx是设置输出的寄存器(或者,如果配置为输入),pull ups
  • PINx是在引脚上保持当前输入电平的寄存器。(如果配置为输出,它们当然会获得与PORTx相同的值(但会有一些延迟)

在现代AVR上,如果您想切换输出,也可以写入PIN寄存器。与读取PORT、XORing它并将其写回的正常方式相比,这节省了几个周期。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28659160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档