PIC18跨端口拆分时读取/写入数据
由于设计的限制,我有一个内存控制器的地址线,该地址线跨越PIC18F4550的3个不同端口。 映射: 我想将其作为一个单变量地址访问,并尝试使用union进行访问,但只得到一个“语法错误”:PIC18跨端口拆分时读取/写入数据,c,pic18,C,Pic18,由于设计的限制,我有一个内存控制器的地址线,该地址线跨越PIC18F4550的3个不同端口。 映射: 我想将其作为一个单变量地址访问,并尝试使用union进行访问,但只得到一个“语法错误”: union { struct { A0 :1; A1 :1; A2 :1; A3 :1; A4 :1; A5 :1;
union
{
struct
{
A0 :1;
A1 :1;
A2 :1;
A3 :1;
A4 :1;
A5 :1;
A6 :1;
A7 :1;
A8 :1;
A9 :1;
A10 :1;
A11 :1;
A12 :1;
};
} ADDRESS;
如何执行此操作?如果您使用的I/O被散列到多个端口中,这将不是一件容易的事情 您所能做的唯一简化就是将内存管理到由三个不同地址块访问的页面中:
lowAddr will be RB2:RB5
midAddr will be RA0:RA5
highAdd will be RE0:RE2
对于低地址部分,最好使用更大的块,这样内存页就可以更大。在这里,您将只有16个字节的页面
因此,您可以定义位字段结构,将内存管理到单个变量中
struct {
uint16 lowAddr : 4;
uint16 midAddr : 6;
uint16 highAddr : 3;
uint16 : 3;
} memoryAddr;
这样,您可以更高效地处理端口更新,如portB:
LATB &= 0xFF ^ (3 << 2);
LATB |= memoryAddr.lowAddr << 2;
LATB&=0xFF^(3)不,这是行不通的-你不能用一个联合体来做这件事。不管你想出什么解决方案,恐怕都会很难看。你可能需要一个或多个宏或函数来在地址和不同的端口位之间进行转换。好吧,正如我所怀疑的,需要一些位移位和屏蔽。我明天就要开始了st a响应。我通常直接向PORTB写入,使用LATB寄存器有什么好处?@Ali您可以在以下链接中找到这个问题的好答案:
LATB &= 0xFF ^ (3 << 2);
LATB |= memoryAddr.lowAddr << 2;