Atmega128和LCD1206,晶振变高出现乱码,求高手解答
最近做了一个atmega128控制LCD1206的小板子,后来发现一直出现乱码,后来把晶振频率降下来就没有问题了。请问各位高手这是什么原理?????注:开始使用外部晶振12M,后来换成内部2M 很明显是时序不对嘛。 jjj206 发表于 2012-5-20 02:34 static/image/common/back.gif
很明显是时序不对嘛。
为什么晶振频率降下来后就可以了,如果是时序不对的话是不可以显示的啊。LCD1602要求的延时有那么苛刻吗 是不是用循环做延时的? LCD1602要求的延时有那么苛刻吗
why don't you read the f@#$king datasheet to find it out?
看datasheet那个时序图,那个上升沿和下降沿之间的各种t之类的,带入你的晶振频率试试看
低于肯定工作会出问题噻
另外延时用几个nop或者用delay.h 的精确延时比较好
几个nop完全够用,主要估计就是其中某个操作间隔时间太短了 你的延时函数写成宏,编译时好自动处理。
你让INTEL生产可300G的处理器看下?凡事有极限嘛。 延时增加,要么程序中定义主频
void delay_1ms(void)
{
unsigned int i;
for(i=0;i<(unsigned int)(xtal*143-2);i++)
;
} 本帖最后由 wujiaodalou911 于 2012-5-20 23:55 编辑
非常感谢大家的关注,我又仔细看了一下自己的时序实在找不到问题。特意把代码贴出来。麻烦大家帮帮忙,谢谢。
这是一个子文件,整体弄出来太多。
#include <avr/io.h>
#include "LCD.h"
#define F_CPU 4000000UL //晶振频率可在这里设定
#include <util/delay.h>
void lcdwritecom(unsigned char com) //写命令
{
lcde_clr;//E清零
lcdrs_set;//rs置1
lcdrw_set;//rw置1
_delay_us(20);
lcdrs_clr;
lcdrw_clr;
PORTC=com;
_delay_ms(1);
lcde_set;
_delay_ms(2);
lcde_clr;
}
void lcdwritedata(unsigned char data) //写数据
{
lcde_clr;
lcdrs_clr;
lcdrw_set;
_delay_us(20);
lcdrs_set;
lcdrw_clr;
PORTC=data;
_delay_ms(1);
lcde_set;
_delay_ms(2);
lcde_clr;
}
void lcdinit()//LCD3初始化{
DDRC=0XFF;
PORTC=0X00;
_delay_ms(1);
lcdwritecom(0X38);
_delay_ms(1);
lcdwritecom(0X38);
_delay_ms(1);
lcdwritecom(0X38);
lcdwritecom(0X38);
lcdwritecom(0X08);
lcdwritecom(0X01);
lcdwritecom(0X06);
lcdwritecom(0X0C);
} 本帖最后由 wujiaodalou911 于 2012-5-20 23:55 编辑
另附时序图一个,我只用了写,没有用到读 刚才发错了 jjj206 发表于 2012-5-20 02:44 static/image/common/back.gif
是不是用循环做延时的?
谢谢你的关注,不是用循环做的,用库中的延时函数。 wujiaodalou911 发表于 2012-5-20 23:52 static/image/common/back.gif
另附时序图一个,我只用了写,没有用到读
另附时序图一个
maybe you did read the datasheet but your comprehension of it is laughable.
many of your code's timing is simply wrong - having more than needed doesn't make it right.
here is one example:void lcdinit()//LCD3初始化{
DDRC=0XFF;
PORTC=0X00;
_delay_ms(1);
lcdwritecom(0X38);
_delay_ms(1);
lcdwritecom(0X38);
_delay_ms(1);pick up the datasheet and find where it says that the above timing is right?
时序逻辑应该没问题,关键是换晶振后,时序中的延时改变了。AVR处理数据速度要比外设1602处理的快。 shuipaopao 发表于 2012-5-21 08:06 static/image/common/back.gif
时序逻辑应该没问题,关键是换晶振后,时序中的延时改变了。AVR处理数据速度要比外设1602处理的快。 ...
那就是時序出現問題啦。 shuipaopao 发表于 2012-5-21 08:06 static/image/common/back.gif
时序逻辑应该没问题,关键是换晶振后,时序中的延时改变了。AVR处理数据速度要比外设1602处理的快。 ...
按照那个时序图上的延时是ns级别的,即使是不改变F_CPU那个延时也是可以的,我也试过把F_CPU换成相应的频率也是不可以的。 液晶要给足够的延时。。。1602一类的液晶,速度是很慢的其实~ millwood0 发表于 2012-5-21 00:12 static/image/common/back.gif
maybe you did read the datasheet but your comprehension of it is laughable.
many of your code's ...
谢谢你的关注。
延时是没有问题的啊,那个时序图上只有标出最小延时上限是没有表明的。我看你的代码是在两个指令之间加的,那个不重要吧。如果有问题的话应该是写入时序的字函数里出的问题啊。 huangdog 发表于 2012-5-21 23:41 static/image/common/back.gif
液晶要给足够的延时。。。1602一类的液晶,速度是很慢的其实~
谢谢你的关注。
一般的延时是多少,我像问一下如果改变晶振的同时也改变F_CPU的值那个利用库函数进行延时是一样的吗? 我现在M16用的16.384M的时钟,连续写数据之间延时几微秒比较稳定;连续写指令要看什么指令了。比如从写数据中间写个显示坐标的指令,再继续写数据,从写指令到写数据我延时2ms稳定,1ms就可能指令无法相应。
系统晶振频率直接在项目属性里面写,调用delay这个库函数直接可以用_delay_us()和delay_ms()这两条指令,自动生成代码,计时非常准的 在补充一下我用的是avr studio 写data的里面
lcdrs_set;
lcdrw_clr;
时间间隔tsp1 满足不?
草草看了下,错了别怪我{:mad:}
想了解一下,问题解决没。
我现在也出现同样的问题了,时钟设置成内部8M时显示乱码。只有将时钟设置成2M时,才显示ok。用示波器观察过,时序符合IC规格要求。可以确认:单纯的写数据、命令是没问题的。是不是数据命令转换太快造成的,或是其他原因?
急待解决,请高手解答。 大家好 我也遇到了相同的问题 我用这是C8051f021128*64LCD 使用内部晶振2M时可以显示当用外部22.1184M时不能显示
页:
[1]