led 怎么不闪呀求指教
本人有一定的51基础,没想到一上手avr给我沉重的打击,连个灯都搞不定这个让我很疼,我只好发帖求助一下请各位网友指教#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned int
void DelayMs(uint i);
/**************************主函数**********************/
void main(void)
{
DDRD=0XFF;
while(1)
{
PORTD=0XFF;
DelayMs(30);
PORTD=0X00;
DelayMs(30);
}
}
/*******************延时子程序****************************/
void DelayMs(uint i)
{
uint j;
for (;i>0;i--)
{
for (j=10000;j>0;j--);
}
}
led一直是亮着的,就是不闪烁,我就比较郁闷延时应该是够大了呀,怎么还不闪呢???
还有一个就是外部晶振插于不插程序都能运行,程序运行指示灯一直亮着,可是被控发光二极管就是不闪烁,这是为什么??????
我用的软件是winavr,下载程序的软件是智峰的那个发两张图让各位高手作参考!!!!! 图就是这两个,看设置是不是有问题 直接把这个PORTD=0XFF;注销,再看下亮不亮 还是亮着的!!!!! 亮度更加亮!!!!!!程序运行灯也亮!!!!!! 吧PORTD=0x00注销后就不亮了!!! liudaolunhui 发表于 2012-11-29 23:39 static/image/common/back.gif
亮度更加亮!!!!!!程序运行灯也亮!!!!!!
先查硬件有没有问题吧,要不然就直接运行一个空的while,把引脚配置那些都去掉 硬件没有问题的,我试了马老师的那个流水灯运行的还蛮不错的,他那个是在cvavr平台下开发的!!! 30ms太短了吧,相当于33Hz,不那么容易看出闪烁的,把间隔改大,比如1000ms 我就是有点怀疑外部晶振为什么插了跟没插都能下程序,而且运行呢!!!! 好再试一次!!!!!!! 还是不行!!!!!!!!!!! liudaolunhui 发表于 2012-11-29 23:49 static/image/common/back.gif
我就是有点怀疑外部晶振为什么插了跟没插都能下程序,而且运行呢!!!! ...
因为从你2楼贴的熔丝位来看,你用的是内部1M的RC震荡,所以与外接晶振无关 哦,我是新手,但程序应该没有问题呀!!我用的是16的片子,这个就比较疼了!!!!! zb05022005 发表于 2012-11-29 23:53 static/image/common/back.gif
因为从你2楼贴的熔丝位来看,你用的是内部1M的RC震荡,所以与外接晶振无关 ...
大哥,你有atmega16 灯的程序吗,用winavr编的!!!你发给我一份邮箱1315666783@qq.com我再试一下看行不!!! 你的延时ms好像太长了,试试这个
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<142;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
} 还有,你配置熔丝位的时候可以用“向导方式”,就在2楼图片左侧中间位置,有个标签,看到了吗 第一,我认为你延时不够长,应该用一个嵌套的循环,第二,你的截图中那个下载软件的熔丝位的配置我看不到的你调成那种向导模式吧……再给你回答另一个问题,不同于51单片机,avr有内部自带的时钟,是通过下载软件的熔丝位配置的,挺你说晶振插不插都能用,你肯定用的是内部时钟 建议楼主在安装一个avrstdio 恩,我看到了!!昨天晚上断网了学校12点准时断网,不好意思!!!!!!!!!! liudaolunhui 发表于 2012-11-30 07:03 static/image/common/back.gif
恩,我看到了!!昨天晚上断网了学校12点准时断网,不好意思!!!!!!!!!! ...
这些都是打钩的截图!!! liudaolunhui 发表于 2012-11-30 07:12 static/image/common/back.gif
这些都是打钩的截图!!!
这些都是默认的!!!!!!! 要怪就怪你眼睛的带宽不够吧。。。扎示波器看 uint j;改成 volatile uint j; 试试,大概是优化问题 是不是灯闪 的太快了? 先调试一下软件延时的问题,,,还有你选择的是内部1Mhz的晶振,频率很低的,这里可能导致了你软件延时的不准确,从而导致灯的闪烁频率使我们肉眼无法辨别,,,,, 延时函数被优化掉了,直接用gcc自带的延时函数 建议你看下芯艺的avr的gcc程序设计 好,我继续试一下!!!!!! lcw_swust 发表于 2012-11-30 10:41 static/image/common/back.gif
uint j;改成 volatile uint j; 试试,大概是优化问题
闪了,就是那个延时函数优化的问题,太郁闷了!!!!!!! 就是搞不懂为什么少个volatile 就会出现这种状况???? 软件run一下 看看是不是延时函数被优化掉了 我也遇到过同样的问题 纠结了好久 哦,原来如此,谢谢各位,希望此贴能对以后的初学者有帮助!!!!!! AVR好学吗?我现在用STC51 {:smile:} 本帖最后由 liudaolunhui 于 2012-11-30 22:31 编辑
liangjiatian 发表于 2012-11-30 14:28 static/image/common/back.gif
AVR好学吗?我现在用STC51
至少比51好,51是最低级的一块片子,avr基本都是中档的片子!!!!!! zcx2012 发表于 2012-11-30 11:24 static/image/common/back.gif
建议你看下芯艺的avr的gcc程序设计
大哥呀,小弟还有一根问题就是atmega16驱动lcd(1602或12864)不需要加外部排阻吧!!!!! 不用,加个小排阻也没问题 感谢各位大哥对我的支持!!!!
页:
[1]