搜索
bottom↓
回复: 23

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

[复制链接]

出0入0汤圆

发表于 2012-5-20 02:11:19 | 显示全部楼层 |阅读模式
最近做了一个atmega128控制LCD1206的小板子,后来发现一直出现乱码,后来把晶振频率降下来就没有问题了。请问各位高手这是什么原理?????
注:开始使用外部晶振12M,后来换成内部2M

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-5-20 02:34:13 | 显示全部楼层
很明显是时序不对嘛。

出0入0汤圆

 楼主| 发表于 2012-5-20 02:39:48 | 显示全部楼层
jjj206 发表于 2012-5-20 02:34
很明显是时序不对嘛。

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

出0入0汤圆

发表于 2012-5-20 02:44:37 | 显示全部楼层
是不是用循环做延时的?

出0入0汤圆

发表于 2012-5-20 03:13:27 | 显示全部楼层
LCD1602要求的延时有那么苛刻吗


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

出0入0汤圆

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

出0入0汤圆

发表于 2012-5-20 09:55:00 | 显示全部楼层
你的延时函数写成宏,编译时好自动处理。
你让INTEL生产可300G的处理器看下?凡事有极限嘛。

出50入0汤圆

发表于 2012-5-20 10:48:05 | 显示全部楼层
延时增加,要么程序中定义主频
void delay_1ms(void)
{
unsigned int i;
for(i=0;i<(unsigned int)(xtal*143-2);i++)
;
}

出0入0汤圆

 楼主| 发表于 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);
}

出0入0汤圆

 楼主| 发表于 2012-5-20 23:52:01 | 显示全部楼层
本帖最后由 wujiaodalou911 于 2012-5-20 23:55 编辑



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

出0入0汤圆

 楼主| 发表于 2012-5-20 23:54:56 | 显示全部楼层
刚才发错了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-5-20 23:57:58 | 显示全部楼层
jjj206 发表于 2012-5-20 02:44
是不是用循环做延时的?

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

出0入0汤圆

发表于 2012-5-21 00:12:35 | 显示全部楼层
wujiaodalou911 发表于 2012-5-20 23:52
另附时序图一个,我只用了写,没有用到读
另附时序图一个


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:
  1. void lcdinit()  //LCD3初始化{
  2.     DDRC=0XFF;
  3.     PORTC=0X00;
  4.     _delay_ms(1);
  5.     lcdwritecom(0X38);
  6.     _delay_ms(1);
  7.     lcdwritecom(0X38);
  8.     _delay_ms(1);
复制代码
pick up the datasheet and find where it says that the above timing is right?

出0入4汤圆

发表于 2012-5-21 08:06:13 | 显示全部楼层
时序逻辑应该没问题,关键是换晶振后,时序中的延时改变了。AVR处理数据速度要比外设1602处理的快。

出0入0汤圆

发表于 2012-5-21 15:33:33 | 显示全部楼层
shuipaopao 发表于 2012-5-21 08:06
时序逻辑应该没问题,关键是换晶振后,时序中的延时改变了。AVR处理数据速度要比外设1602处理的快。 ...

那就是時序出現問題啦。

出0入0汤圆

 楼主| 发表于 2012-5-21 23:34:09 | 显示全部楼层
shuipaopao 发表于 2012-5-21 08:06
时序逻辑应该没问题,关键是换晶振后,时序中的延时改变了。AVR处理数据速度要比外设1602处理的快。 ...

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

出0入8汤圆

发表于 2012-5-21 23:41:00 | 显示全部楼层
液晶要给足够的延时。。。1602一类的液晶,速度是很慢的其实~

出0入0汤圆

 楼主| 发表于 2012-5-21 23:42:31 | 显示全部楼层
millwood0 发表于 2012-5-21 00:12
maybe you did read the datasheet but your comprehension of it is laughable.

many of your code's ...

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

出0入0汤圆

 楼主| 发表于 2012-5-21 23:44:15 | 显示全部楼层
huangdog 发表于 2012-5-21 23:41
液晶要给足够的延时。。。1602一类的液晶,速度是很慢的其实~

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

出0入8汤圆

发表于 2012-5-21 23:50:06 | 显示全部楼层
我现在M16用的16.384M的时钟,连续写数据之间延时几微秒比较稳定;连续写指令要看什么指令了。比如从写数据中间写个显示坐标的指令,再继续写数据,从写指令到写数据我延时2ms稳定,1ms就可能指令无法相应。

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

出0入0汤圆

 楼主| 发表于 2012-5-21 23:50:16 | 显示全部楼层
在补充一下我用的是avr studio

出0入0汤圆

发表于 2012-5-22 01:44:14 | 显示全部楼层
写data的里面

  lcdrs_set;
     lcdrw_clr;

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

出0入0汤圆

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

出0入0汤圆

发表于 2013-4-30 15:30:20 | 显示全部楼层
大家好 我也遇到了相同的问题 我用这是C8051f021  128*64LCD 使用内部晶振2M时可以显示  当用外部22.1184M时不能显示
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表