马老师,请问书中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;
} 实验证明,可以用内部上拉电阻代替,但是222页倒数第8行程序不对,修改后实验就成功了
原:unsigned char counter;
应该为:volatile unsigned char counter; 在CVAVR平台下没问题的.你使用了WINAVR. 哦,原来是这样。谢谢马老师! 楼主:为什么要这样?volatile unsigned char counter; 马老师,你的书我才拿到两天, 因为是这样,一个变量如果在主函数中没有改变,在用WINAVR编译时就会被优化掉。也就是说每次执行主函数是这个变量的值都是第一次的复制版本。因为这个原因,那么在中断中改变这个变量就变得没有效了。加volatile的目的就是告诉编译器不要优化这个变量。这样在中断中改变这个变量的值才会有效。
呵呵,我的理解,马老师,是这样的吗? 好象是的,潭里有关于WINAVR的使用介绍.不过我没用过. 哦,谢谢马老师!
在交流中发现,好像多数人使用的都是CVAVR,是不是CVAVR更加适合初学者呢? CVAVR有位操作,WINAVR没有!楼主谢谢你的分析,我还没注意看过WINAVR的资料。还有不知道为什么WINAVR主函数必须加int才不会有警告?int main(void) 9楼的,你看了winavr的libc库帮助就知道了.里面介绍的很清楚.安装完winavr就有这个帮助.是pdf格式的. 9楼,是不是因为GCC更标准一些,标准C是不是应该这样啊:
int main(void)
{
return(0);
} 我个人建议如下:
作为初学者最好从CVAVR入手,因为CVAVR容易上手,也更加贴近芯片硬件.而且CVAVR对于一般的系统和产品开发完全合适.硬件出身的工程师容易掌握.
当你对于AVR本身的功能熟悉后,要设计开发比较复杂的系统,可以考虑使用GCC或IAR.
页:
[1]