在对我的 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 << 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) 无效?的主要内容,如果未能解决你的问题,请参考以下文章