nzls 发表于 2007-10-17 09:53:52

mega169IC口输入检测问题

我在使用mega169时,在设置个端口输入情况下并且设置了上拉,单端口PINxn并不能检测到按键的变化(按键一头接端口线,另一头接地)PINxn各脚位在悬空状态下测得电压为1.67V,单片机5V供电,我不清楚为何各脚位在悬空状态下只有1.67V,难道mega169还要配置外部上拉电阻,各口在输出状态下工作都正常,且PINxn在此状态下也能检测到按键的高低电平变化,我不明白为何在输入状态下却不能,而我在使用MEGA8515L,MEGA48V都没遇到此情况,最初怀疑mega169损坏,更换单片机及线路都一样,是不是mega169在输入设置与其他AVR单片机不一样?

machao 发表于 2007-10-17 16:55:14

检查一下你使用的I/O口是否是JTAG口?

nzls 发表于 2007-10-17 18:53:22

除了F口之外,其它口也一样,而且把JTAG的熔丝位去掉使能了.


//ICC-AVR application builder : 2007-9-30 9:40:08
// Target : M169
// Crystal: 3.2768Mhz

#include <iom169v.h>
#include <macros.h>

void port_init(void)
{
PORTA = 0x00;
DDRA= 0xFF;               //   out

PORTB = 0xFF;
DDRB= 0x00;

PORTC = 0xFF;
DDRC= 0x00;

PORTD = 0xFF;
DDRD= 0x00;

PORTE = 0xFF;
DDRE= 0x00;

PORTF = 0xFF;
DDRF= 0x00;

PORTG = 0x1F;
DDRG= 0x00;
}
//=============================
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
MCUCR&=~(1<<PUD);                                       
SEI(); //re-enable interrupts
}

void main(void)
{
init_devices();
while(1)
    {   
   PORTA=PINE;         //我依次用过PINB,PINC,PIND,PINF,PING,结果都一样,输入脚位的
      }                  //高低电平变化改变不了A口的输出结果

}

machao 发表于 2007-10-18 00:36:51

mega169我没用过,但对I/O的使用应该同其它的相同。

只能建议:
1。将语句MCUCR&=~(1<<PUD)去掉试试;
2。检查你的M169的地连接正确吗?
3。如果是上面的测试程序,你下载后,能确认M169在运行吗?(如果AVR一直处在RESET状态,引脚电平就不是5V)

nzls 发表于 2007-10-18 08:22:41

最初我并没加MCUCR&=~(1<<PUD);MEGA169复位后输入口默认应是上拉的,因不来事才加这句。此程序下载后应该在运行,将E口改输出状态,此时PORTA=PINE起作用,A口能够反应E口的变化,输出口位接近5V,只是输入端口当时只是用来检测按键的开合,现在却将端口改输出状态才能反应按键的变化,不知复位异常对输出是否有影响?复位电路如下图,此复位电路我在其它AVR都使用


http://cache.amobbs.com/bbs_upload782111/files_8/ourdev_177298.jpg

machao 发表于 2007-10-18 14:16:19

复位电路问题不大,C7可以不用,否则复位时间长了点。

现在只能考虑是否是其它问题,如编译器的问题,或你编译时是否指定了M169。

笨的办法是用汇编写一个简单的读I/O的程序,在AVR STUDIO中编译,跳开C编译器;或检查C编译后的ASM代码等。
页: [1]
查看完整版本: mega169IC口输入检测问题