P89V51RD2FN的ISP下载成功
昨天下午P89V51RD2FN的ISP下载成功了,原理图按照周立功网站的提供的下载电路(直接用串口下载)。以前用51开发板不知道为什么下载不行,电路是一样的。后来自己重新焊了一块板下载就成功了(把Option->Advance Options...中的Misc页下的Disable device signature checking选上,见下图)。可是下载后的程序似乎跑不起来,写了个用P0.0控制灯闪烁的程序,但P0.0根本没有变高电平。
改了一下程序检查一下其他口可否输出高电平,发现可以。觉得是不是p0口坏了呢?但芯片是新买的,应该不会啊。于是看看芯片datasheet的p0口介绍。
Port 0: Port 0 is an 8-bit open drain bi-directional I/O port. Port 0 pins that have ‘1’s written to them float, and
in this state can be used as high-impedance inputs
原来p0是集电极开路,也就是说要外接上拉电阻,否则写1到P0口电平是浮动的。我当时怎样测都是0.3V。
其他口都内部带上拉电阻,所以写1当然输出高电平。
晚上调试键盘和显示电路,浮点数能正确地写入AT24C08,也能正确地读出。但是前面的序号就是显示成乱码。
我想是否ZLG7290的显示缓存DpRam0~DpRam7只能按一定的方向次序写,不能先写DpRam7,6,然后再按次序写DpRam0~4?后来按从DpRam0~DpRam7方向写还是乱码,不是这个原因。在和师兄的讨论中发现原理在调用ZLG7290_WriteReg()函数的第二个参数填错了,这个参数是字型码不是显示的数字,太粗心了。
后来发现低四位数码管总是不亮,程序逻辑检查了多遍完全没错,想了很久不知道原因。后来偶尔发现在key_handle()中声明的一个len局部变量覆盖了全局的len变量。当时为什么就不用gd来检查变量呢。alas
2008-10-26
基本完成了键盘显示功能
在被ZLG7290郁闷了很久后,昨天把键盘从7290分离出来,因为这芯片作为数码管显示扫描(包括闪烁等功能)还是很好用的,但是在扫描数码管的同时接入了键盘电路后(分时扫描键盘),按键时有时会影响显示。试验了多次决定把6个按键直接接到单片机的io脚。
本来这时挺简单的硬件电路,再写写对应的软件就ok的,但是却花了一天的时间调试软件,整数能写进存储器AT24C08但读不出来,后来发现sprintf ()的格式化字符串“%ld”和“%d”是不同的,从存储器读出的占4B的长整型用“%ld”才能正确转换成字符串,用“%d”总是转换成0。
2008-10-28
T2定时器成功
昨晚用51的T2定时器,写了些代码配置T2对应的寄存器,发现T2似乎不工作,怀疑寄存器某些位没写好于是整天晚上看datasheet,想不明。第二天早上在main()函数的最后加上while(1);后就可以了。
2008-10-30
整数无法显示
硬件软件检查了一天,最后把ZLG_7290Download()改成用ZLG_WriteReg()就能显示整数了。今天竟然P89V51RD2FN又不能下载程序了,不明!!!!后来换到串口1下载又成功了。
2008-10-31
SegA又亮起来了
上次那块高低位数码管布反了的板能正常显示,开心很久,重新做了一块板把高低位反过来,其他的元件都一样,以为大功告成,谁知这几天调试发现SegA总是亮,明明跟上次那块板一个样,新做的这块就亮,上次的就不亮,真是莫名其妙!后来摇一摇各个三极管,发现竟然会影响这段是否亮,初步确定是虚焊。于是把松的三极管都再焊,这时发现A段一直亮着,my God,想它亮就不亮,想不亮它就亮。后来再细心测每个三极管的各个脚,发现A段的这个3906竟然短路,靠!!!重新换个三极管后就OK了。
2008-12-3
终于大功初成
今天晚上在初步调试DA转换时发现原来没有把ad420的clear引脚置0,失误了一小下。接着正常准确采到脉冲数,一切很顺利。最后把按键逻辑再改善了一下,加入面板负数加减显示同步,也很顺利,写程序逻辑清楚就快就完成了。至此,这台仪器除了装进机箱,其他的所有硬件和软件都基本完成,剩下的就要看时间的考验了。
2008-12-8
继电器不稳定
最后测试继电器发现报警时继电器的触点很不稳定,每过几秒会迅速跳跃一下,发现单片机的io口电平不稳定导致,但程序似乎没得再改了,为什么写too_high=0时出现不稳定,而failure不会呢?下午细心再检查一遍程序,发现把time_out这个变量添加上(此变量在计时器时间到设置为1),即在计时器时间到才判断是否报警,而原来的程序在主程序中不断地判断有没有超临界值,这会不断地写报警的io口,导致继电器不稳定。
void main()
{
....
while(1)
{
...
//是否有按键
if(key_press)
{ key_press=0;
if(key_handle()==1)//没有此键值,或按compute键后计算错
{ ZLG7290_WriteReg(0x15,0x2A);//在第5位显示|^|
}
}
if(measure && time_out)//如果处于测量且时间到,把百分比对应65535划分值送到ad420
{ time_out=0;
if(pulse_num0==0)//没测到脉冲
{ failure=0;//报警
led_probefail=1;//probefail灯亮
}
else
{ failure=1;
led_probefail=0;
}
//显示计数值
len=sprintf(flstr,"%ld",(long int)pulse_num0);
pos=11;
display(11);
compute_wet((long)(pulse_num0/measure_times));//计算湿度并且判断超上下限报警
AD420Write(wet*65535);//输出湿度百分比对应的电流值
}
}
}
....
void compute_wet(long plses)//{{{
{
if(plses<N0)
{
wet=0.0;
empty=0;//empty报警
too_high=1;
too_low=1;
}
else
{ empty=1;//没报警
wet=eA*pow((plses-N0),M);
if(wet>FgH)
{ too_high=1;//超最大值报警
too_low=0;
}
else if(wet<FgL)
{ too_low=1;//lowalert,超最小值报警
too_high=0;
}
else//如果不小于又不大于域值则不报警
{ too_high=1;
too_low=1;
}
}
}//}}}
....
2008-12-11
昨天下午P89V51RD2FN的ISP下载成功了,原理图按照周立功网站的提供的下载电路(直接用串口下载)。以前用51开发板不知道为什么下载不行,电路是一样的。后来自己重新焊了一块板下载就成功了(把Option->Advance Options...中的Misc页下的Disable device signature checking选上,见下图)。可是下载后的程序似乎跑不起来,写了个用P0.0控制灯闪烁的程序,但P0.0根本没有变高电平。
改了一下程序检查一下其他口可否输出高电平,发现可以。觉得是不是p0口坏了呢?但芯片是新买的,应该不会啊。于是看看芯片datasheet的p0口介绍。
Port 0: Port 0 is an 8-bit open drain bi-directional I/O port. Port 0 pins that have ‘1’s written to them float, and
in this state can be used as high-impedance inputs
原来p0是集电极开路,也就是说要外接上拉电阻,否则写1到P0口电平是浮动的。我当时怎样测都是0.3V。
其他口都内部带上拉电阻,所以写1当然输出高电平。
晚上调试键盘和显示电路,浮点数能正确地写入AT24C08,也能正确地读出。但是前面的序号就是显示成乱码。
我想是否ZLG7290的显示缓存DpRam0~DpRam7只能按一定的方向次序写,不能先写DpRam7,6,然后再按次序写DpRam0~4?后来按从DpRam0~DpRam7方向写还是乱码,不是这个原因。在和师兄的讨论中发现原理在调用ZLG7290_WriteReg()函数的第二个参数填错了,这个参数是字型码不是显示的数字,太粗心了。
后来发现低四位数码管总是不亮,程序逻辑检查了多遍完全没错,想了很久不知道原因。后来偶尔发现在key_handle()中声明的一个len局部变量覆盖了全局的len变量。当时为什么就不用gd来检查变量呢。alas
2008-10-26
基本完成了键盘显示功能
在被ZLG7290郁闷了很久后,昨天把键盘从7290分离出来,因为这芯片作为数码管显示扫描(包括闪烁等功能)还是很好用的,但是在扫描数码管的同时接入了键盘电路后(分时扫描键盘),按键时有时会影响显示。试验了多次决定把6个按键直接接到单片机的io脚。
本来这时挺简单的硬件电路,再写写对应的软件就ok的,但是却花了一天的时间调试软件,整数能写进存储器AT24C08但读不出来,后来发现sprintf ()的格式化字符串“%ld”和“%d”是不同的,从存储器读出的占4B的长整型用“%ld”才能正确转换成字符串,用“%d”总是转换成0。
2008-10-28
T2定时器成功
昨晚用51的T2定时器,写了些代码配置T2对应的寄存器,发现T2似乎不工作,怀疑寄存器某些位没写好于是整天晚上看datasheet,想不明。第二天早上在main()函数的最后加上while(1);后就可以了。
2008-10-30
整数无法显示
硬件软件检查了一天,最后把ZLG_7290Download()改成用ZLG_WriteReg()就能显示整数了。今天竟然P89V51RD2FN又不能下载程序了,不明!!!!后来换到串口1下载又成功了。
2008-10-31
SegA又亮起来了
上次那块高低位数码管布反了的板能正常显示,开心很久,重新做了一块板把高低位反过来,其他的元件都一样,以为大功告成,谁知这几天调试发现SegA总是亮,明明跟上次那块板一个样,新做的这块就亮,上次的就不亮,真是莫名其妙!后来摇一摇各个三极管,发现竟然会影响这段是否亮,初步确定是虚焊。于是把松的三极管都再焊,这时发现A段一直亮着,my God,想它亮就不亮,想不亮它就亮。后来再细心测每个三极管的各个脚,发现A段的这个3906竟然短路,靠!!!重新换个三极管后就OK了。
2008-12-3
终于大功初成
今天晚上在初步调试DA转换时发现原来没有把ad420的clear引脚置0,失误了一小下。接着正常准确采到脉冲数,一切很顺利。最后把按键逻辑再改善了一下,加入面板负数加减显示同步,也很顺利,写程序逻辑清楚就快就完成了。至此,这台仪器除了装进机箱,其他的所有硬件和软件都基本完成,剩下的就要看时间的考验了。
2008-12-8
继电器不稳定
最后测试继电器发现报警时继电器的触点很不稳定,每过几秒会迅速跳跃一下,发现单片机的io口电平不稳定导致,但程序似乎没得再改了,为什么写too_high=0时出现不稳定,而failure不会呢?下午细心再检查一遍程序,发现把time_out这个变量添加上(此变量在计时器时间到设置为1),即在计时器时间到才判断是否报警,而原来的程序在主程序中不断地判断有没有超临界值,这会不断地写报警的io口,导致继电器不稳定。
void main()
{
....
while(1)
{
...
//是否有按键
if(key_press)
{ key_press=0;
if(key_handle()==1)//没有此键值,或按compute键后计算错
{ ZLG7290_WriteReg(0x15,0x2A);//在第5位显示|^|
}
}
if(measure && time_out)//如果处于测量且时间到,把百分比对应65535划分值送到ad420
{ time_out=0;
if(pulse_num0==0)//没测到脉冲
{ failure=0;//报警
led_probefail=1;//probefail灯亮
}
else
{ failure=1;
led_probefail=0;
}
//显示计数值
len=sprintf(flstr,"%ld",(long int)pulse_num0);
pos=11;
display(11);
compute_wet((long)(pulse_num0/measure_times));//计算湿度并且判断超上下限报警
AD420Write(wet*65535);//输出湿度百分比对应的电流值
}
}
}
....
void compute_wet(long plses)//{{{
{
if(plses<N0)
{
wet=0.0;
empty=0;//empty报警
too_high=1;
too_low=1;
}
else
{ empty=1;//没报警
wet=eA*pow((plses-N0),M);
if(wet>FgH)
{ too_high=1;//超最大值报警
too_low=0;
}
else if(wet<FgL)
{ too_low=1;//lowalert,超最小值报警
too_high=0;
}
else//如果不小于又不大于域值则不报警
{ too_high=1;
too_low=1;
}
}
}//}}}
....
2008-12-11