打印
[AVR单片机]

求助:Atmega128L+ds12887联调出问题

[复制链接]
3498|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guo_mcu|  楼主 | 2010-10-30 08:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我前天用DS12C887做了个实时时钟,出现了很多问题。(如果我没有叙述清楚,我可以提供所有的源程序,请各位帮我看下,先行谢谢啦!)
我想问的是:(硬件电路我测了应该没问题)
1、因熔丝位设置错误导致不能下载程序,怎么办?
2、下面对DS12C887进行读写操作有问题吗?
3、对硬件电路的检测还需要注意其他什么问题吗?
4、DS12C887工作电压为4.5-5.5V,而我的只有4.12v,这个影响DS12C887正常工作吗?
5、对芯片的时序控制,其中的每步操作的时间控制是不是要严格按pdf文档要求的那样?

单片机:Atmega128L
时钟频率:1MHz (内部默认的)
编程环境:ICCAVR7.16a
仿真环境:AVRStudio4.16
本程序在proteus仿真是能正常工作的,但实物调试时,发现1602始终显示
2009-08-07 Sat
04-02-00
一步一步硬件调试发现问题出在下面这个子函数里:
void convert()//读取ds12887中的数据,并将数据从ds12887传到1602
{
       year=read_ds(9);//读ds12887地址为9处的数据
       month=read_ds(8);
       day=read_ds(7);
       week1=read_ds(6);
       shi=read_ds(4);
       fen=read_ds(2);
       miao=read_ds(0);
       w_sj(2,9,miao);
       w_sj(2,6,fen);
       w_sj(2,3,shi);
       if(week1==7)
       {
           week1=0;
       }
       Putchar(1,13,table2[week1]);
       w_sj(1,11,day);
       w_sj(1,8,month);
       w_sj(1,5,year);
}
调试发现:year=9,month=8,day=7,week1=6,shi=4,fen=2,miao=0。
从这,我认为,问题出在对DS12C887进行读写操作上。
对DS12C887进行读写操作程序如下:
void write_ds(uchar add,uchar data)
{//C为数据口
   clc(cs);//cs=0;
   set(ds);//ds=1;
   set(rw);//rw=1;
   set(as);//as=1;
   DDRC=0XFF;
   PORTC=add;
   clc(as);//as=0;
   clc(rw);//rw=0;
   PORTC=data;
   set(rw);//rw=1;
   set(as);//as=1;
   set(cs);//cs=1;
}
uchar read_ds(uchar add)
{
   uchar t;
   clc(cs);//cs=0;
   set(ds);//ds=1;
   set(rw);//rw=1;
   set(as);//as=1;
   DDRC=0XFF;
   PORTC=add;
   clc(as);//as=0;
   clc(ds);//ds=0;
   DDRC=0X00;//输入 读
   t=PINC;
   set(ds);//ds=1;
   set(as);//as=1;
   set(cs);//cs=1;
   return t;
}
我感觉是一步一步按照时序来的呀,再说在proteus仿真是能正常工作的,程序逻辑应该没问题啊。
我在想:是不是对时序中的操作时间没控制好啊,比如说
tDDR(Output Data Delay Time from DS or R/W)最小为20ns 最大为 120ns
而我用1M晶振,一个空操作就为1000ns,时序是不是在这些地方出问题?


当然 我也试了下 想到用外部16M晶振,但发现外部晶振没起到什么作用,还是上面这种显示。
因调用外部晶振,在设置熔丝位时,可能出错了,导致开发板已经锁了-程序下不进去。
我也试了下网上说的用外部有源晶振,让它起振,但发现还是不行,看还有其他办法没?或者再将用外部有源晶振起振的方法,阐述清楚点。

再次谢谢!

相关帖子

沙发
believe0815| | 2010-11-7 18:14 | 只看该作者
mega128用扩展外部RAM的方式吧,很方便的

使用特权

评论回复
板凳
aishiqi| | 2012-4-10 15:43 | 只看该作者
1# guo_mcu
你好,DS12887用之前需要初始化的,试图加上这个初始化函数

void set_time()
{
  unsigned char ss;
  DS_Write(0x0a,0xa0);    //允许更新,禁止周期中断,报警中断,更新结束中断
  _delay_ms(5);
  DS_Write(0x0b,0x82);    //芯片更新被禁止
  _delay_ms(10);
  DS_Write(0x00,0x00);    //初始化时钟秒  0-60
  DS_Write(0x01,0x00);    //初始化时钟秒闹钟
  DS_Write(0x02,0x38);    //初始化时钟分钟 0-60
  DS_Write(0x03,0x00);    //初始化时钟分钟闹钟
  DS_Write(0x04,0x14);    //初始化时钟小时 0-23
  DS_Write(0x05,0x00);    //初始化时钟小时闹钟
  DS_Write(0x06,0x01);    //初始化时钟星期 0-7
  DS_Write(0x07,0x21);    //初始化时钟日  0-31
  DS_Write(0x08,0x02);    //初始化时钟月  0-12
  DS_Write(0x09,0x11);   //初始化时钟年  00-99
  _delay_ms(5);
  ss=DS_Read(0x0c);
  ss=DS_Read(0x0d);       //必须读出0x0c,0x0d的值  芯片要求
  DS_Write(0x0b,0x2a);    //当02改成06时则时钟不会走  最后一直是8A 秒
  _delay_ms(5);
  DS_Write(0x0a,0x20);    //晶体振荡器开启,并且保持时钟运行  
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

2

帖子

1

粉丝