【提问】动态曲线绘制不连贯
请教一下,绘制曲线,一次最多写入6E(即110)个点。我用4.3寸COF屏,用c51直接往dgus变量地址写命令,一次写入109或110个点都不显示。108个点以内可以显示。这不是问题,问题是:每次写入100个点,有时候上100个点和下100个点不能平滑连接是什么回事?本来想绘制的波形是连续的,比如正玄波。我在AD1脚加正玄波,经T5L模数转换后,在屏幕上显示出AD1脚的波形。加29Hz左右的正弦波最容易出现上述情况,50Hz会好很多。我是连续采样300个点,采样频率1000hz,然后分3次输入dgus,每次间隔20ms。试过各种方法,包括16kHz采样、改变写dgus的时间数据量等等。我也是这个问题。而且更新快了也会丢失一些 小博学 发表于 2023-5-26 23:52
我也是这个问题。而且更新快了也会丢失一些
嗯。一个点一个点地写就没问题,每个点间隔20ms。应该是迪文屏自身有bug. baiyutang 发表于 2023-5-29 16:11
嗯。一个点一个点地写就没问题,每个点间隔20ms。应该是迪文屏自身有bug.
T5L的屏如果是写的0X0310地址一次写多个点的话一条指令后需要读0X0310的地址的状态是否清零,清零了再写下一条。或者可以用84指令去写处理会快一些。 fay 发表于 2023-5-29 16:54
T5L的屏如果是写的0X0310地址一次写多个点的话一条指令后需要读0X0310的地址的状态是否清零,清零了再写 ...
您好,读了一下0x0310,并判断。没啥效果。还是有时候会出现曲线不连贯的现象。
#define CHART_ADDR 0x0310
#define CHART_NUM 1
#define CHART_ID 0
#define POINT_NUM 100
u16 chart_cmd = {0x5AA5,CHART_NUM<<8,(CHART_ID<<8)+POINT_NUM};
sys_write_vp(CHART_ADDR,(u8*)&chart_cmd,3);
sys_write_vp(CHART_ADDR+3,(u8*)&shsh_ad1,POINT_NUM);//写100个点
do
{
sys_delay_about_ms(20);
buffer = Read_Dgus(0x0310);
sys_write_vp(0x3020,(u8*)&buffer,1);
}while(buffer);
sys_write_vp(CHART_ADDR,(u8*)&chart_cmd,3);
sys_write_vp(CHART_ADDR+3,(u8*)&shsh_ad1,POINT_NUM); //写第二个100个点
do
{
sys_delay_about_ms(20);;
buffer = Read_Dgus(0x0310);
sys_write_vp(0x3020,(u8*)&buffer,1);
}while(buffer);
sys_write_vp(CHART_ADDR,(u8*)&chart_cmd,3);
sys_write_vp(CHART_ADDR+3,(u8*)&shsh_ad1,POINT_NUM); //写第201个点到第300个点
sys_delay_about_ms(1000);
写DGUS就用的这格式应该没有错。数组shsh_ad1里装的数据代表一条平滑的曲线。我帧头5AA5...和要写入缓冲区的数据是分两条指令写入DGUS的,以前我也试过合成一条指令,没区别。 本帖最后由 cuijia 于 2023-6-1 09:21 编辑
baiyutang 发表于 2023-5-31 16:02
您好,读了一下0x0310,并判断。没啥效果。还是有时候会出现曲线不连贯的现象。
#define CHART_ADDR 0x0 ...
检查下这个sys_write_vp这个函数,是不是用的有bug的版本。用我这个void Write_Dgusii_Vp(unsigned int addr,unsigned char *buf,unsigned int len){
unsigned char i;
i = (unsigned char)(addr & 0x01);
addr = addr / 2;
ADR_H = 0x00;
ADR_M = (unsigned char)(addr >> 8);
ADR_L = (unsigned char)(addr);
ADR_INC = 0x01;
RAMMODE = 0x8F;
while(APP_ACK == 0);
if(i && len > 0){
RAMMODE = 0x83;
DATA1 = *buf++;
DATA0 = *buf++;
APP_EN = 1;
while(APP_EN == 1);//重点检查是不是漏了这行了
len--;
}
RAMMODE = 0x8F;
while(len >= 2){
DATA3 =* buf++;
DATA2 =* buf++;
DATA1 =* buf++;
DATA0 =* buf++;
APP_EN = 1;
while(APP_EN == 1);//重点检查是不是漏了这行了
len = len - 2;
}
if(len){
RAMMODE = 0x8C;
DATA3 =* buf++;
DATA2 =* buf++;
APP_EN = 1;
while(APP_EN == 1);//重点检查是不是漏了这行了
}
RAMMODE = 0x00;
} cuijia 发表于 2023-6-1 09:19
检查下这个sys_write_vp这个函数,是不是用的有bug的版本。用我这个void Write_Dgusii_Vp(unsigned int ad ...
您好,你这个函数我见过,我也替换过,是一样的。你这个是官方的吧,我那个是熊工家余的。我想起来了,曾经延时多久等前一组100个点写完都没用。 baiyutang 发表于 2023-6-1 10:00
您好,你这个函数我见过,我也替换过,是一样的。你这个是官方的吧,我那个是熊工家余的。我想起来了,曾 ...
重点不是写100点再延时,重点是每写4个字节都要加延时,如代码,不然会数据出错的。需要等待cpu操作完成。直接用我这个代码试试。 :)早上忙,刚才抽空试了一下,出问题的概率小多了,但还是观察到一次出问题。
页:
[1]