2017-01-09 32 views
1

我使用的是ATmega128的微型,并拥有所有我的脚inits设置为输出,并在我的代码主要部分设置为低:ATmega128的输出闪烁在启动时

PORTB=0x00; 
DDRB=0xFF; 

但是在启动时,输出相关PORTB.0在瞬间高速跳动(我已经在范围内捕捉到了它),而其他输出似乎也是如此。看起来好像它变成LOW-HIGH-LOW。我已经做了一些读取,可能是由于三态在启动期间输出开关引起的,所以我在引脚进入之前将PUD寄存器设置为1,然后在没有运气的情况下回到0。有没有人有任何其他想法在启动期间保持输出关闭?它并不总是会发生,这是什么让我难住。

+0

你有偏置电阻吗? –

+0

至少为配置输出之前写入端口数据做好了准备。 –

+0

这几乎肯定是一个硬件问题,而不是软件问题,您应该将其发布在http://electronics.stackexchange.com/上。 GPIO在复位时为高阻抗输入,并且通过示波器测量的电平取决于连接到引脚的电路。如果这是一个问题,并且在启动时需要一个特定的级别,请使用上拉或下拉电阻 - 即该电平必须外部置位,因为输入不会驱动它 - 它是浮动的。 – Clifford

回答

4

最根本的问题是硬件问题 - GPIO缺少一个下拉电阻,因此它在处于复位默认高阻抗输入状态时处于浮动状态。

在软件中可以做的最好的事情是在复位后立即尽快初始化GPIO。要做到这一点在CodeVisionAVR您需要在项目中使用自定义的startup.asm作为CoadeVisionAVR手工编译的部分4.18描述:

enter image description here ...

在哪里,我建议你初始化PORTB DDRB及以下:

   LDI R16, 0x00  
      OUT PORTB, R16 
      LDI R16, 0xFF  
      OUT DDRB, R16 

紧接在步骤2之前,即前四条指令。如果继电器是机械继电器,GPIO将保持悬空的时间可能会太短,以免继电器发生反应。固态继电器可能仍然存在问题。任何脉冲的长度可能取决于电源上升时间;如果速度缓慢,你可能会获得更长的脉搏。

+0

我这样做,一切似乎都很好。我其实自己昨晚做了这件事,没有时间在这里回顾一下,但这是有效的。再次感谢所有的帮助! –

+0

@wgdvs:酷;我的回答使用了您目前仅在评论中提供的信息;如果你能更新这个问题,它会使它对SO社区更加连贯和有用。 – Clifford

+0

会做。实际上它有所帮助,但将它连接到一个循环仪上,我仍然每80次尝试一次就会遇到这个问题......我告诉我的老板,真正唯一的解决办法是将该引脚下拉到GND。他同意并批准了这一改变。它不应该影响我们的任何产品,因为该引脚在所有情况下只控制这一个继电器。 –