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