baiyutang 发表于 2023-5-22 12:20:36

【提问】动态曲线绘制不连贯

请教一下,绘制曲线,一次最多写入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:13

我也是这个问题。而且更新快了也会丢失一些

baiyutang 发表于 2023-5-29 16:11:04

小博学 发表于 2023-5-26 23:52
我也是这个问题。而且更新快了也会丢失一些

嗯。一个点一个点地写就没问题,每个点间隔20ms。应该是迪文屏自身有bug.

fay 发表于 2023-5-29 16:54:48

baiyutang 发表于 2023-5-29 16:11
嗯。一个点一个点地写就没问题,每个点间隔20ms。应该是迪文屏自身有bug.

T5L的屏如果是写的0X0310地址一次写多个点的话一条指令后需要读0X0310的地址的状态是否清零,清零了再写下一条。或者可以用84指令去写处理会快一些。

baiyutang 发表于 2023-5-31 16:02:46

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:19:44

本帖最后由 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;

}

baiyutang 发表于 2023-6-1 10:00:37

cuijia 发表于 2023-6-1 09:19
检查下这个sys_write_vp这个函数,是不是用的有bug的版本。用我这个void Write_Dgusii_Vp(unsigned int ad ...

您好,你这个函数我见过,我也替换过,是一样的。你这个是官方的吧,我那个是熊工家余的。我想起来了,曾经延时多久等前一组100个点写完都没用。

cuijia 发表于 2023-6-1 11:36:54

baiyutang 发表于 2023-6-1 10:00
您好,你这个函数我见过,我也替换过,是一样的。你这个是官方的吧,我那个是熊工家余的。我想起来了,曾 ...

重点不是写100点再延时,重点是每写4个字节都要加延时,如代码,不然会数据出错的。需要等待cpu操作完成。直接用我这个代码试试。

baiyutang 发表于 2023-6-1 11:52:01

:)早上忙,刚才抽空试了一下,出问题的概率小多了,但还是观察到一次出问题。
页: [1]
查看完整版本: 【提问】动态曲线绘制不连贯