|
发表于 2008-6-4 21:00:13
|
显示全部楼层
明白阿莫做什么了,我做了点测试,提供你参考.
环境:CVAVR,AVR-51板,M16,内部RC1M,和外部晶体12M.
代码1:
#include <mega16.h>
// Declare your global variables here
void main(void)
{
PORTA=0x00;
DDRA=0xff; //PORTA输出0
PORTB=0xff;
DDRB=0xff; //portb控制LED指示
DDRA &= 0b11111100;
PORTA |= 0b00000011; //PA0,PA1转输入,上拉有效
#asm("nop");
//#asm("nop");
//#asm("nop");
//#asm("nop");
if ((PINA & 0b00000011) != 0x03) PORTB = 0X00;
while (1)
{
};
}
结果:内部RC1M时需要1个nop, 外部晶体12M时需要3个nop
==============================================================
代码2:
#include <mega16.h>
// Declare your global variables here
void main(void)
{
PORTA=0x00;
DDRA=0xff; //PORTA输出0
PORTB=0xff;
DDRB=0xff; //portb控制LED指示
PORTA |= 0b00000011; //PA0,PA1输入,上拉有效
DDRA &= 0b11111100;
if ((PINA & 0b00000011) != 0x03) PORTB = 0X00;
while (1)
{
};
}
结果:注意代码2仅仅是将PA的设置顺序换了一下(按手册上的推荐介绍转换设置次序),不管是内部1M还是外部12M,一个nop也不要(当然,DDRA &= 0b11111100本身相当3个nop).
; 24 PORTA |= 0b00000011; //PA0,PA1输入,上拉有效
000061 b3eb IN R30,0x1B
000062 60e3 ORI R30,LOW(0x3)
000063 bbeb OUT 0x1B,R30 <======此处改变PA1,PA0,输出高电平了.
; 25 DDRA &= 0b11111100;
000064 b3ea IN R30,0x1A
000065 7fec ANDI R30,LOW(0xFC)
000066 bbea OUT 0x1A,R30 <======此处PA1,PA0变成输入
=============================================================================================
测试过程中,所有硬件外围不变,也不动,环境一样.只是改程序,改熔丝位设置系统时钟类型,下执行代码.
看过手册,找不到确切的说明,提供参考.
另外,I/O设置成高阻输入,读PIN口的值是不稳定的,因为空间的电磁干扰会改变PIN的值.因此我认为采用上面的方法检测PIN口的是低电平或高电平要商榷.
建议:对于要测试I/O输入的话,在相应的I/O口对地接一个200K电阻.测试程序如下:
输入0的测试:
void main(void)
{
PORTA=0xff;
DDRA=0xff; //PORTA输出1
PORTB=0xff;
DDRB=0xff; //portb控制LED指示
PORTA = 0b11111100; //PA0,PA1输出0,转输入时,上拉无效
DDRA &= 0b11111100; //转输入
//#asm("nop");
//#asm("nop");
//#asm("nop");
//#asm("nop");
if ((PINA & 0b00000011) == 0x00) PORTB = 0X00; // OK!
while (1)
{
};
}
输入1的测试:
id main(void)
{
PORTA=0x00;
DDRA=0xff; //PORTA输出0
PORTB=0xff;
DDRB=0xff; //portb控制LED指示
PORTA |= 0b00000011; //PA0,PA1输出1,转输入时,上拉有效
DDRA &= 0b11111100; // 转输入
//#asm("nop");
//#asm("nop");
//#asm("nop");
//#asm("nop");
if ((PINA & 0b00000011) == 0x03) PORTB = 0X00; //OK
while (1)
{
};
}
为了保险,可以增加几个nop.上面的测试我做过简单的验证了.见笑. |
|