在对我的 Atmega644 MCU 进行编程时。为啥 PORTD |= 0b00100000 有效,但 PORTD |= (PD5 <<1) 无效?

Posted

技术标签:

【中文标题】在对我的 Atmega644 MCU 进行编程时。为啥 PORTD |= 0b00100000 有效,但 PORTD |= (PD5 <<1) 无效?【英文标题】:When programming my Atmega644 MCU. Why does PORTD |= 0b00100000 work, but not PORTD |= (PD5 <<1)?在对我的 Atmega644 MCU 进行编程时。为什么 PORTD |= 0b00100000 有效,但 PORTD |= (PD5 <<1) 无效? 【发布时间】:2019-04-16 20:10:32 【问题描述】:

我一直在试图理解为什么这条线

 PORTD |= 0b00100000;

有效,但无效

PORTD |= (PD5 <<1);

我有一个连接到 PD5 的 LED,它只在第一个命令时亮起。 我必须定义什么是“PD5”吗?我从来没有在我的 Atmega328P 上这样做,但现在在 Atmega644 上它不起作用?

这是我包含的库

  #define F_CPU 1000000UL  // 1MHz internal clock
  #include <avr/io.h>
  #include <util/delay.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <avr/interrupt.h>
  #include "lcd.h"

不确定是否有任何事情会引起麻烦?我在这里遗漏了一些非常基本的东西吗?

【问题讨论】:

什么是 PD5 以及它是如何/在哪里定义的?请阅读How to create a Minimal, Complete, and Verifiable example 并通过提交这样的示例代码、预期结果和实际结果来编辑您的问题。 我必须定义什么是“PD5”是什么意思?我们应该为您定义它吗?你说不起作用是什么意思??? 非常好。感谢您指出这一点。 【参考方案1】:

端口|= (PD5

PD5 定义为数字 5。将其左移一位将得到 10,这与您想要的值无关。

另一方面,1 &lt;&lt; PD5 将为您提供将 1 左移 5 位的结果,这等于 0b00100000 - 正是您所追求的。

【讨论】:

【参考方案2】:

任务不同。

PORTD |= 0b00100000;

将 PORT D 的第 5 位设置为 1

PORTD |= (PD5 <<1);

将 PORTD 的第 1 位和第 2 位设置为 1(因为 PD5 == 5 和 PD5

定义一些宏来打开或关闭 LED,以防止每次都设置“位”

#define LEDON PORTD |= 0b00100000
#define LEDOFF PORTD &= ~0b00100000

示例用法

if ( put_led_on )
    LEDON;
else
    LEDOFF;

或者感谢您自己的研究

PORTD |= (1<<PD5);

这会将第 5 位设置为 1

【讨论】:

哦,真的吗?这是一个非常基本的错误,感谢您清除它。那么将 PORTD 的第 5 位(即 PIND5)设置为 1 的正确语法是什么?归根结底,我希望能够只将 PIND5 的位设置为 0 或 1,而不更改其他位。 我不使用 AtMega,但我知道它们与 PIC 相似,经过一些研究,您需要使用第一种类型的分配清除并设置适当的位。我已经用一些代码更新了答案。 我知道怎么做,你可以像这样 PORTD |= (1 很抱歉,您对这里发生的情况的假设是不正确的。 AVR 标头将PD5 定义为5,而不是作为访问PIND 的第5 位的宏。 对不起,但是10 == (0x0a),不是0x12,恐怕……另外,更好的#define LEDON (PORTD |= 0x00100000)(带括号),或者更好的#define LEDON doPORTD |= 0b00100000;while(0)

以上是关于在对我的 Atmega644 MCU 进行编程时。为啥 PORTD |= 0b00100000 有效,但 PORTD |= (PD5 <<1) 无效?的主要内容,如果未能解决你的问题,请参考以下文章

AVRDUDE 在 atmega32 上缓慢上传

新的 ATMEGA1281 和 avrdude

如何获取STM32 MCU的唯一ID

ATMEGA2561 WINC1500驱动实现SPI问题

尝试编程 ATmega88PB Atmel Studio 错误 0xc0

在对 Knex 进行单元测试时,如何模拟假数据库?