[英]Can I add the bits of two ports to make a new bit sequence?
在我的实验室中,我应该测试9位值,但是每个端口仅包含8位。 根据说明,我使用PORTD上的所有位(包括PB0)来设置这9位值,但是我没有计划如何做到这一点,这实质上就是此问题的全部挑战。 其余的应该很容易,我只需要存储一个9位值即可从另一个端口“借用”。
微控制器:ATmega1284
问题:(挑战):汽车的乘客座位重量传感器输出9位值(范围从0到511),并连接到微控制器上的输入PD7..PD0PB0。 如果重量等于或大于70磅,则应通过将PB1设置为1来启用安全气囊。如果重量大于5但低于70磅,则应禁用安全气囊,并且将PB2设置为可以点亮“安全气囊禁用”图标。 1.(如果重量不超过5,则B1和B2都不应设置,因为没有乘客)。
可以使用按位运算符以任何必要的方式组合来自单独寄存器的位:
& – Bitwise AND
| – Bitwise OR
~ – Bitwise NOT
^ – Bitwise XOR
<< – Left Shift
>> – Right Shift
有点模糊的符号“ PD7..PD0PB0 ”表明PB0是LSB或重量值。 在这种情况下,给出:
PORTD DDDDDDDD
PORTB xxxxxxxB
然后:
uint16_t weight = ((uint16_t)PORTD << 1u) | (PORTB & 0x01) ;
将产生一个由位组成的weight
值:
0000000DDDDDDDDB
子表达式((uint16_t)PORTD << 1u)
将PORTD的值左移1位:
0000000DDDDDDDD0
(PORTB & 0x01)
0位以外的所有位清零,而使第0位保持不变:
0000000B
然后将两个子表达式按位进行“或”运算:
0000000DDDDDDDD0
OR 0000000B
----------------
= 0000000DDDDDDDDB
请注意,通过仅使用PORTD中的8位值并将限制值减半,可能(出于安全考虑)可以简化任务。 当前,您具有: “高于5但低于70” ,如果您仅阅读PORTD,则限制为3> = PORTD <35 。 实际上,这可能更安全-从两个单独的寄存器读取单个值时,您需要确定您拥有的值与同一样本相同,并且在读取第二个寄存器之前读取的第一个寄存器中的值没有改变。 PORTB寄存器中只有一个LSB时,这几乎没有影响,但是除非在读取数据时以某种方式锁存了数据,否则它的作用将是有限的。
这取决于PB0是寄存器B的MSB还是LSB。但是您可以使用uint16_t变量和一些掩码来获取所需的值。 例如,您可以做以下事情之一。
PB0是MSB
uint16_t sensor;
sensor = (PORTD << 1) | (PORTB >> 7);
PB0是LSB
uint16_t sensor;
sensor = (PORTD << 1 ) | (PORTB & 0x01);
它可以通过多种方式完成,并且只是其中之一。 在这两种解决方案中,寄存器D的所有位都是最高有效位,第一个是LSB,它是寄存器B的MSB;第二个是LSB,它是寄存器B的LSB。
如果您希望代码符合MISRA-C标准,则应初始化传感器变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.