【问题标题】:embedded c and the 8051 microcontroller嵌入式 c 和 8051 微控制器
【发布时间】:2013-12-20 01:30:43
【问题描述】:

在 8051 微控制器复位时,所有端口引脚锁存器都设置为“1”值。现在我正在阅读这本书“嵌入式 C”,它指出以下代码的问题是它可以使开发人员陷入一种错误的安全感:

// Assume nothing written to port since reset
// – DANGEROUS!!!
Port_data = P1;

如果以后有人修改程序以包含用于写入同一端口的全部或部分的例程,则此代码通常不会按要求工作:

unsigned char Port_data;
P1 = 0x00;
. . .
// Assumes nothing written to port since reset
// – WON’T WORK BECAUSE SOMETHING WAS WRITTEN TO PORT ON RESET
Port_data = P1;

任何了解嵌入式 c 的人都可以向我解释为什么这段代码不起作用?它所做的只是将 0 分配给 char 变量。

【问题讨论】:

    标签: c embedded


    【解决方案1】:

    潜在问题。

    1) 与端口关联的数据方向寄存器 (DDR) 可能未按预期设置,因此上电时,DDR 可能设置为“输入”。所以写端口到 0 可能会意外读不到 read 0。

    2) 与端口关联的数据方向寄存器可能已设置为“输出”,“读取”数据可能没有明确的含义。根据体系结构,可能需要幻像位来隐藏输出位以进行回读。

    3) 可以通过复位命令输入上电代码,该命令只不过是跳转到“复位向量”。因此,与“冷”启动相关的任何硬件特定操作都不会发生,因为这是“热”启动。

    解决方案:

    在上电代码时,显式设置 DDR 和输出值(以及需要的影子位)。

    可能不适用于 8051 - 一般用于嵌入式处理器。

    【讨论】:

      【解决方案2】:

      几个月前我在读同一本书,也有同样的困惑。之后从事 PIC18 和 M0+ 的项目,并正在弄清楚它的真正含义。

      实际上,这不是软件/编程问题,而是硬件/电子问题。如果您的 805X 代码希望能够从引脚上的外部输入读取 1 和 0,则代码必须提前将 1 写入引脚。如果您的代码提前将 0 写入引脚,外围设备将无法将引脚拉高并允许代码读取 1。为什么?电子货!!想象一下,如果你想享受窗外的风,你必须先打开窗户。

      如果您真的感兴趣,请自行搜索“pin value vs latch value”。我认为程序员可以把它留给硬件工程师。我相信 805X 没有 DDR 作为高级的。在输入和输出模式之间切换引脚可能很容易但令人困惑。

      【讨论】:

        猜你喜欢
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 2015-03-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多