【问题标题】:Switch-case not works for AVR Atmega32 Microcontroller?开关盒不适用于 AVR Atmega32 微控制器?
【发布时间】:2015-02-22 14:48:55
【问题描述】:

你好朋友,我不知道 switch-case 和 if,else 语句对我都不起作用我想在某些特定数据之前在我的“开关块”中的 PORTA 寄存器中提供一些数据时向 PORTB 和 PORTD 提供一些数据我使用 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;

}

【问题讨论】:

  • 可能你的外部开关不正确,或者给出一个简短的瞬态值。在后一种情况下,可能会调用default 语句。作为一个建议,您为什么不尝试将 PORTA 输入连续写入 PORTB 输出,然后看看会发生什么。顺便说一句,case 0b00001101: { PORTA=0b00001000; ...} 声明中的你真的是想写信给PORTA 吗?
  • 您可能不打算将时钟频率定义为 1.6GHz? _delay_ms() 需要正确设置 F_CPU。

标签: microcontroller avr atmega atmelstudio winavr


【解决方案1】:

你确定PORTA的高脚都是0吗?如果不匹配,则所有情况都不匹配。

你可以试试

switch(PINA & 0x0F)

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

【讨论】:

  • 但是先生,如果我将高四位(半字节)接地为 0,那么根据您的说法,这个逻辑有效吗?
  • 是的,代码看起来不错,除了第二种情况,您写入 PORTA 而不是 PORTB。
【解决方案2】:

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

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

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

【讨论】:

  • 先生,这意味着要读取 PORT 的状态,我们必须使用 PINx,而要写入,我们必须使用 PORTx...
  • @ShrikantVaishnav 是的,请查看有关数字输入的数据表部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多