wujiaodalou911 发表于 2012-5-20 02:11:19

Atmega128和LCD1206,晶振变高出现乱码,求高手解答

最近做了一个atmega128控制LCD1206的小板子,后来发现一直出现乱码,后来把晶振频率降下来就没有问题了。请问各位高手这是什么原理?????
注:开始使用外部晶振12M,后来换成内部2M

jjj206 发表于 2012-5-20 02:34:13

很明显是时序不对嘛。

wujiaodalou911 发表于 2012-5-20 02:39:48

jjj206 发表于 2012-5-20 02:34 static/image/common/back.gif
很明显是时序不对嘛。

为什么晶振频率降下来后就可以了,如果是时序不对的话是不可以显示的啊。LCD1602要求的延时有那么苛刻吗

jjj206 发表于 2012-5-20 02:44:37

是不是用循环做延时的?

millwood0 发表于 2012-5-20 03:13:27

LCD1602要求的延时有那么苛刻吗

why don't you read the f@#$king datasheet to find it out?

qjj2858 发表于 2012-5-20 03:58:04

看datasheet那个时序图,那个上升沿和下降沿之间的各种t之类的,带入你的晶振频率试试看
低于肯定工作会出问题噻
另外延时用几个nop或者用delay.h 的精确延时比较好
几个nop完全够用,主要估计就是其中某个操作间隔时间太短了

fsclub 发表于 2012-5-20 09:55:00

你的延时函数写成宏,编译时好自动处理。
你让INTEL生产可300G的处理器看下?凡事有极限嘛。

god-father 发表于 2012-5-20 10:48:05

延时增加,要么程序中定义主频
void delay_1ms(void)
{
unsigned int i;
for(i=0;i<(unsigned int)(xtal*143-2);i++)
;
}

wujiaodalou911 发表于 2012-5-20 23:50:19

本帖最后由 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:52:01

本帖最后由 wujiaodalou911 于 2012-5-20 23:55 编辑



另附时序图一个,我只用了写,没有用到读

wujiaodalou911 发表于 2012-5-20 23:54:56

刚才发错了

wujiaodalou911 发表于 2012-5-20 23:57:58

jjj206 发表于 2012-5-20 02:44 static/image/common/back.gif
是不是用循环做延时的?

谢谢你的关注,不是用循环做的,用库中的延时函数。

millwood0 发表于 2012-5-21 00:12:35

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?

shuipaopao 发表于 2012-5-21 08:06:13

时序逻辑应该没问题,关键是换晶振后,时序中的延时改变了。AVR处理数据速度要比外设1602处理的快。

jjj206 发表于 2012-5-21 15:33:33

shuipaopao 发表于 2012-5-21 08:06 static/image/common/back.gif
时序逻辑应该没问题,关键是换晶振后,时序中的延时改变了。AVR处理数据速度要比外设1602处理的快。 ...

那就是時序出現問題啦。

wujiaodalou911 发表于 2012-5-21 23:34:09

shuipaopao 发表于 2012-5-21 08:06 static/image/common/back.gif
时序逻辑应该没问题,关键是换晶振后,时序中的延时改变了。AVR处理数据速度要比外设1602处理的快。 ...

按照那个时序图上的延时是ns级别的,即使是不改变F_CPU那个延时也是可以的,我也试过把F_CPU换成相应的频率也是不可以的。

huangdog 发表于 2012-5-21 23:41:00

液晶要给足够的延时。。。1602一类的液晶,速度是很慢的其实~

wujiaodalou911 发表于 2012-5-21 23:42:31

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 ...

谢谢你的关注。
延时是没有问题的啊,那个时序图上只有标出最小延时上限是没有表明的。我看你的代码是在两个指令之间加的,那个不重要吧。如果有问题的话应该是写入时序的字函数里出的问题啊。

wujiaodalou911 发表于 2012-5-21 23:44:15

huangdog 发表于 2012-5-21 23:41 static/image/common/back.gif
液晶要给足够的延时。。。1602一类的液晶,速度是很慢的其实~

谢谢你的关注。
一般的延时是多少,我像问一下如果改变晶振的同时也改变F_CPU的值那个利用库函数进行延时是一样的吗?

huangdog 发表于 2012-5-21 23:50:06

我现在M16用的16.384M的时钟,连续写数据之间延时几微秒比较稳定;连续写指令要看什么指令了。比如从写数据中间写个显示坐标的指令,再继续写数据,从写指令到写数据我延时2ms稳定,1ms就可能指令无法相应。

系统晶振频率直接在项目属性里面写,调用delay这个库函数直接可以用_delay_us()和delay_ms()这两条指令,自动生成代码,计时非常准的

wujiaodalou911 发表于 2012-5-21 23:50:16

在补充一下我用的是avr studio

qjj2858 发表于 2012-5-22 01:44:14

写data的里面

lcdrs_set;
   lcdrw_clr;

时间间隔tsp1 满足不?
草草看了下,错了别怪我{:mad:}

1500995238 发表于 2013-2-19 23:03:37

   想了解一下,问题解决没。
我现在也出现同样的问题了,时钟设置成内部8M时显示乱码。只有将时钟设置成2M时,才显示ok。用示波器观察过,时序符合IC规格要求。可以确认:单纯的写数据、命令是没问题的。是不是数据命令转换太快造成的,或是其他原因?
急待解决,请高手解答。

cvi670 发表于 2013-4-30 15:30:20

大家好 我也遇到了相同的问题 我用这是C8051f021128*64LCD 使用内部晶振2M时可以显示当用外部22.1184M时不能显示
页: [1]
查看完整版本: Atmega128和LCD1206,晶振变高出现乱码,求高手解答