little_grass 发表于 2008-3-25 22:44:23

马老师,请问书中221页的电路中的电阻能用内部上拉电阻代替吗?

以下是我稍微修改的程序,但是没得到实验结果

//////实验功能:练习使用外部中断
/////硬件连接:PA口与LED的段码连,LED的是能端直接接地
/////                        独立按键K17\K18与PD2/PD3(INT0/INT1)连,PD2/PD3使能内部上拉
/////实验现象:按K17,显示加一,按K18,显示减一

/////头文件
#include <avr/io.h>
#include <avr/interrupt.h>

/////定义变量
unsigned char counter;
unsigned char led_7={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

/**************************INT0中断服务函数************************
SIGNAL (SIG_INTERRUPT0)
{
counter++;
if (counter>=10) counter=0;
}

//**************************INT1中断服务函数************************
SIGNAL (INT1_vect)
{
if (counter==0) counter=9;
else counter--;
}





//******************************主函数************************************
int main (void)
{
PORTA=0XFF;                        //LED段码输出
DDRA=0XFF;
PORTD|=0X0C;                //PD2/PD3(INT0/INT1)输入,使能上拉
DDRD&=0XF3;

////初始化INT0/INT1中断
MCUCR|=0X0A;                //INT0/INT1下降沿触发
GICR|=0XC0;                        //使能INT0/INT1中断
GIFR&=0XC0;                        //清除INT0/INT1中断标志位

counter=0;                //计数单元初始化为0
sei();

while (1)
        {
        PORTA=led_7;
        }

little_grass 发表于 2008-3-26 17:16:27

实验证明,可以用内部上拉电阻代替,但是222页倒数第8行程序不对,修改后实验就成功了
原:unsigned char counter;
应该为:volatile unsigned char counter;

machao 发表于 2008-3-26 20:05:23

在CVAVR平台下没问题的.你使用了WINAVR.

little_grass 发表于 2008-3-26 20:28:30

哦,原来是这样。谢谢马老师!

apcfy 发表于 2008-3-26 20:30:14

楼主:为什么要这样?volatile unsigned char counter;

shalixi 发表于 2008-3-26 20:38:10

马老师,你的书我才拿到两天,

little_grass 发表于 2008-3-26 22:53:10

因为是这样,一个变量如果在主函数中没有改变,在用WINAVR编译时就会被优化掉。也就是说每次执行主函数是这个变量的值都是第一次的复制版本。因为这个原因,那么在中断中改变这个变量就变得没有效了。加volatile的目的就是告诉编译器不要优化这个变量。这样在中断中改变这个变量的值才会有效。
呵呵,我的理解,马老师,是这样的吗?

machao 发表于 2008-3-27 13:08:11

好象是的,潭里有关于WINAVR的使用介绍.不过我没用过.

little_grass 发表于 2008-3-27 16:45:01

哦,谢谢马老师!
在交流中发现,好像多数人使用的都是CVAVR,是不是CVAVR更加适合初学者呢?

apcfy 发表于 2008-3-27 17:21:31

CVAVR有位操作,WINAVR没有!楼主谢谢你的分析,我还没注意看过WINAVR的资料。还有不知道为什么WINAVR主函数必须加int才不会有警告?int main(void)

hanlin 发表于 2008-3-31 16:30:52

9楼的,你看了winavr的libc库帮助就知道了.里面介绍的很清楚.安装完winavr就有这个帮助.是pdf格式的.

wanghu1232001 发表于 2008-4-1 18:22:41

9楼,是不是因为GCC更标准一些,标准C是不是应该这样啊:
int main(void)
{
   return(0);
}

machao 发表于 2008-4-4 13:30:19

我个人建议如下:

作为初学者最好从CVAVR入手,因为CVAVR容易上手,也更加贴近芯片硬件.而且CVAVR对于一般的系统和产品开发完全合适.硬件出身的工程师容易掌握.

当你对于AVR本身的功能熟悉后,要设计开发比较复杂的系统,可以考虑使用GCC或IAR.
页: [1]
查看完整版本: 马老师,请问书中221页的电路中的电阻能用内部上拉电阻代替吗?