找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2588|回复: 5
打印 上一主题 下一主题
收起左侧

OA日志

[复制链接]
跳转到指定楼层
楼主
ID:82781 发表于 2015-6-13 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天难题了,昨天建华改了硬件电路,今天不好用了,前天是好用,今天不好用了?奇怪,我又对程序检查,其实很简单啊,ADC嘛,无非是第一步初始化端口,第二选中ADC的通道,然后时能中断,开始转换,就这么简单,为什么呢?后来发现程序在不DBUG的时候不运行,所以引起我的怀疑,我换了硬件电路,换了一块板子,结果程序跑起来了但是还是解不出来了,很是郁闷,然后着重开始对症手册对程序继续检查,其中有一句话是这样的“ It needs about 27 ADC clocks to complete an A/D conversion.”也就是说ADC时钟我是可以控制的,间接地对目标精心采样,但是遗憾的是,我用的是200K的ADC时钟,那么采样肯定达不到200K,但是确实好用 ,信号要求,必须达到300-200K的速率才可以接出来正确的波,很难理解,PLL时钟是50M。这个应该和PLL没什么关系,因为源氏中我选定外部的晶体,下午快下班的时候我把DIV换到4,然后莫名其妙的就好了,此时软件测得采样率每秒钟11万次,根本不对,却可以得到正确的数据,凌乱。示波器波形显示上升沿和下降沿时间均在5微妙左右,所以硬件上没有问题,有问题也是我程序的问题,但是这个真的求不出来这个速率,因为权威的软件取采样率和实际并不相符啊!必须要200K-300K的速率来采才会得到正确的结果,可是我设定的是11万次的采样率一样可以得到正确的值,很诡异很诡异!有待研究学习啊,好神奇啊!真是有神啊!有神!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:82781 发表于 2015-6-13 15:44 | 只看该作者
    今天搞DHCP的时候,也碰到一个很奇怪的问题,无反应,后来检查程序,原来移植程序的时候中断引脚没有改,改掉之后发现仍然获取不到DHCP服务器给的IP地址,万般无奈下只好改成固定IP测试硬件    txrx,测得硬件完全正常,只不过刚开始碰到一个号段问题,那就是0号段的可以向1号段发。反之则不行,修改后好使,但是DHCP任然不好用,并未得导IP地址,不得不跟踪代码。
IP4_ADDR(&gw, 0,0,0,0);
IP4_ADDR(&ipaddr, 0,0,0,0);
IP4_ADDR(&netmask, 0,0,0,0);
清掉IP网管子网掩码信息,
tcpip_init(RT_NULL, RT_NULL);

netif_set_addr(netif_default, &ipaddr, &netmask, &gw);
netif_set_up(netif_default);
初始化TCPIP服务线程,加载地址
dhcp_start(netif_default);
向DHCP服务器发送请求
while (netif_default->ip_addr.addr == 0)
等待分配IP,
结束,这就是DHCP的全过程,如果顺利的分配到IP地址那么就会跳出堵塞,向下执行,如果得不到,那将会启动一个超时等待(DHCP transaction timeout handling)。我得到的是等待,显然发出去请求没有回应,于是实在是没有道理,考虑MAC地址,一看地址是0X27*6,马上改掉,问题解决了,IP地址分配了,一切有正常起来!哈哈也就是说MAC虽然可以乱写,但是不能重复,当然这个变数就多了,经验经验!好使才是王道啊!

回复

使用道具 举报

板凳
ID:82781 发表于 2015-6-13 15:44 | 只看该作者
今天上午在Mbus项目上加上GPRS,做了实验, 经测试数据可以上传下达,当然是测试,工作在透传模式,而且程序均很简洁,有待完善,数据完整性和连接可靠性,均未处理。数据完整主要是Mbus上传数据进行的校验,数据连接性主要是GPRS的可靠性
我们的流程是这样的:

TCP 服务器------》》》》------SIM900A(CLINTE)------>>>TX0---MBUS设备 -----》》mcu 解码------》tx1---sim900a(CLINTE)-----》》--TCP服务器---THE END

数据完整性处理:

数据流设备---》---采集---》TO buff  ------>>take data ----->一定的算法计算差错----》完全正确上传平台
                                                                                                                 |》》》丢弃,报告错误。


链接可靠性

重练机制,自身检测诊断,(参照SIM900AAT集),心跳, 其他的还希望大家提供线索,力求可靠。

gprs部分测试:

对于串口流我采用了分时分批处理的方法,算法是环形队列。只要BUF足够大,就不大会发生丢数据的情况。(环形队列慎用之)


IP :119.184.123.84
PORT:1000


  void initsim900a(void)
{
   
uint8_t m;
POWER_ON;
DrvSYS_Delay(300000);
POWER_OFF;
DrvSYS_Delay(300000); //开机
for(m=5;m;m--)
{
DrvSYS_Delay(100000);
}

if(GET_START)
{
DrvUART_Write(UART_PORT1,"AT\r\n",4);//发送AT命令
DrvUART_Write(UART_PORT0,"AT\r\n",4);//发送AT命令
}

}
void timeout(uint32_t time)
{
     uint32_t n;
  for(n=0;n<time;n++)
{

   DrvSYS_Delay(1000);//1ms
}

}

extern uint8_t *Gprs_Pong(void);
uint8_t  Wait_Gprs_Sure(char *p)
{
   p=p;
   
   
   Gprs_Pong();
   
   
   
   
   
   
    /*
        if(memcmp(SIM900A_DATA,sk,strlen(sk))==0)
     {
     
      send_data();
     
     }

      if(memcmp(SIM900A_DATA,sendok,strlen(sendok))==0)
      {
        //  pa->AT_REC_SEND_OK=1;
      
      }

       if(memcmp(SIM900A_DATA,connect_ok,strlen(connect_ok))==0)
    {

   // pa->AT_REC_CONNECT=1;
     
   
    }
      if(memcmp(SIM900A_DATA,err,strlen(err))==0)
    {

   // pa->AT_REC_ERR=1; //err
     
   
    }
    if(memcmp(SIM900A_DATA,atd,strlen(atd))==0)
    {

   // pa->AT_REC_ATD=1; //拨电话
     
   
    }


    if(memcmp(SIM900A_DATA,power_down,strlen(power_down))==0)
    {
   // pa->AT_REC_POWERDOWN=1;
     // printf_usart0 ("模块掉电请重新上电\r\n");
   
    }


   
       if(memcmp(SIM900A_DATA,ati,strlen(ati))==0)
    {
   
   // pa->AT_REC_ATI=1;
    //  printf_usart0 ("收到设备号\r\n");
   
    }
   
       if(memcmp(SIM900A_DATA,ok,strlen(ok))==0)
    {
  //  pa->AT_REC_OK=1;
    //  printf_usart0 ("收到OK\r\n");
   
    }


      */
   return 0;
}



uint8_t  Connect_Sever(char *Url)
{
   

     Url = Url;
  timeout(1000);//1s
  Gprs_Send_String(at_cmd);//支持包交换和数据交换
  timeout(8000);//1s
  Wait_Gprs_Sure("ok!!");

     Gprs_Send_String(" AT+CGCLASS=\"B\"\r\n\r\n");//支持包交换和数据交换

   timeout(8000);//1s
   Wait_Gprs_Sure("AT+CGCLASS=\"B\"\r\n\r\n");
       // {pa->AT_REC_OK=0;printf_usart0 ("支持包交换和数据交换配置成功\r\n");}

  Gprs_Send_String ("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n\r\n");
      timeout(8000);//1s
   Wait_Gprs_Sure("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n\r\n");
// CoTickDelay(60);
  //  {pa->AT_REC_OK=0;printf_usart0 ("配置GPRS和接入点设置成功\r\n");}

    Gprs_Send_String ("AT+CGATT=1\r\n\r\n"); //附着GPRS业务
     
     timeout(8000);//1s
   Wait_Gprs_Sure("AT+CGATT=1\r\n\r\n");
  //CoTickDelay(60);
     //{pa->AT_REC_OK=0;printf_usart0 ("附着GPRS业务成功\r\n");}
    Gprs_Send_String ("AT+CIPCSGP=1,\"CMNET\"\r\n\r\n"); //选择GPRS连接
      
     timeout(8000);//1s
   Wait_Gprs_Sure("AT+CIPCSGP=1,\"CMNET\"\r\n\r\n");

    // {pa->AT_REC_OK=0;printf_usart0 ("选择GPRS连接成功\r\n");}
      Gprs_Send_String("AT+CIPSTART=\"TCP\",");
   timeout(10);//1s
    Gprs_Send_String ("\"119.184.123.84\","); //ip地址
   timeout(10);//1s
      Gprs_Send_String("1000\r\n");   //端口
   timeout(10);//1s
            timeout(8000);//1s
   Wait_Gprs_Sure("AT+CIPSTART=\"TCP\",\"119.184.123.84\",""1000\r\n");


     return 0;
}


void Send_Data_Gprs(uint8_t *data,uint8_t len)
{
  
    static uint8_t g=0x1A;
    timeout(8000);//1s
   Gprs_Send_String ("AT+CIPSEND\r\n");
  timeout(1000);//1s
  Gprs_Send_Data(data,len);
     // Gprs_Send_String (">嘿!伙计,我是单片机!\r\n");
   DrvUART_Write(UART_PORT1,&g,1);  
           timeout(8000);//1s

  
}


回复

使用道具 举报

地板
ID:82781 发表于 2015-6-13 15:45 | 只看该作者
雾霭湝湝,云露淇淇,日月不得其光,贼星在位,不知朝夕,恍惚逝去!!
沉吟:夫士不可以弘毅,任重而道远!
昨夜食,不得寐,晨其舍饭,余碗粟米也,食罢而去。
吾等继至,建华早至,说如此!

上午本来大打算继续搞GPRS的稳定性滴,没想到打开电脑,看到某大神在讨论修饰符volatile,这个符号可不是一般的符号啊,就我个人而言这个东东很常见于只向寄存的指针上用,因为他要求编译器对他不进行优化,长用的方式如下:
#defien  REG_SRC (*(volatile const unsigned char*)0x2f00345e)
我们在C语言中常常有这样的语句:

unsigned int a;

a=1;
a=2;
a=4;
a=7;
编译器最后得出的结果是a=7,其他的都会编译掉,但是如果A是寄存器呢?他的每一次赋值都是一个变化,又怎么解释呢?就有

#defien  REG_SRC (*(volatile const unsigned*)0x0000345e)

REG_SRC = 0x 0000000;

REG_SRC = 0xff00ff00;

REG_SRC = 0x00ff00ff;

这是决然不同的!后者高速编译器这个地址可能被改变,你要保留不要优化掉,当然,现在的编译器尤其是嵌入式专用的那些对这些绝对地址的寻址上都是有保护滴,当然这也不可以步履啊。

还有就是在ISR服务中使用,其实差不多啦,

嗳气,懂得太少了!

上午应王建华的需求改了路灯终端的AT93C56的CS引脚,下午才知道,本来是对的上午他妈的改错了!晕死,建华不该乱说。我懒得看手册,没拆穿建华!

下午王建华说他找到了问题所在,原因在于93c6\56和7053之间公用的SPI接口的Dout被拉长高电平,导致7053无法拉低,所以读出来的是一个巨大的数据,FFFFff,

下午对GPRS的回复信号做了处理,加上了比较和返回值,

uint8_t  Wait_Gprs_Sure( char *pstr,int len,char *s)
{
   char *rep;
   char *index;
      
       rep = Gprs_Get_Respond();  //save respond data and pointer to it

    index = strstr(rep,pstr);   //find string in dst add
   if(index==((char*)0))
   {
     Mbus_Send_String ("no string !!\r\n");
    return ;
   }
if(0== memcmp (index ,pstr,len-1))
  {
  
   // Mbus_Send_String ("ok \r\n");
    Mbus_Send_String (s);
   //Mbus_Send_Data(char*p,uint8_t len)
  }
  else
     {
  
     Mbus_Send_String ("err!!\r\n");
      }


   
   return 0;
}

值得注意的是内存池里面的数据直接用STRSTR查找的时候他碰到‘\0’就返回,所以要加以处理,不然你是查不到的,我的办法是:
uint8_t  *Gprs_Get_Respond(void)
{  
         uint8_t l,k;
   memset(Gprs_app,1,80);
   len=QueueLength(&Gprs_ctrl_Queue);//updata the "lne"
  for(k=0;k<len;k++)
  {
    DeQueue(&Gprs_ctrl_Queue,&l);
   if(l==0)l=0x0d;
   Gprs_app[k]=l; //save into buff of app

  
  }   k++;
     Gprs_app[k]='\0';
    return Gprs_app;
}
这样一来就可以顺利的比对了,哈哈,办法是笨,但是。。。。。!

晚上刘总说有几个开关不好用,我跟踪了下,两键的开关老是进第三个IS人,所以我屏蔽掉第三个之后,安装上了,上电实验还行,不必要的通道要及时的屏蔽掉,以免干扰正常的工作,其实开关没有死,他一直在进中断,没时间干别的,所以看起来就像死了一样,也许还有其他的原因吧,有待时间去慢慢验证啊,有时候真是倒霉催的,莫名其妙!尽力。。。。


回复

使用道具 举报

5#
ID:82781 发表于 2015-6-13 15:45 | 只看该作者
今天主要是对GPRS的链接做了点处理和测试,双向心跳包,一个是客户端主动发,一个是服务器主动发,但是呢我碰到一个问题,那就是 在客户端检测到没有心跳包之后,要主动发送一个类似socket的close命令,但是呢,发完这个命令,在想要绑定到CMNET就帮不上了,导致链接失败,后来查阅手册GPRS说是要提前进入init状态,后来加了条初始化IP状态,就好了,晕晕的。。这才是万里长征第一步,早来!在等待返回数据和解析上我做的不是很好,有待改进啊。。。。
  char *rep;
   char *index;
      
       rep =(char*) Gprs_Get_Respond();  //save respond data and pointer to it

    index = strstr(rep,pstr);   //find string in dst add
   if(index==((char*)0))
   {
         //Exception Handling

           index = strstr(rep,"CLOSE");   //find string in dst add
      if(index==((char*)0))
     {

         index = strstr(rep,"ERROR");   //find string in dst add  
          if(index==((char*)0))
         {
      
        Mbus_Send_String ("no string !!\r\n");
        Exception_Handling_Evet=1;
      
         }
         else
         {
           Mbus_Send_String ("This is a Error!!\r\n");
             Exception_Handling_Evet=1;
         }

   
     }
     else
     {
              Mbus_Send_String ("SEVER IS CLOSED !!\r\n");
     Exception_Handling_Evet=1;
     }
   


    return 0;
   }

if(0== memcmp (index ,pstr,len-1))
  {
  

    Mbus_Send_String (s); //successfully

  }
  else
     {
  
     Mbus_Send_String ("err!!\r\n");
      }


回复

使用道具 举报

6#
ID:82781 发表于 2015-6-13 15:46 | 只看该作者
下午主要是在搞基于dhcp客户端上的无线协议的移植的透传设备程序,由于之前和上位机软件调试了DHCP,所以只要移植上无线驱动和协议就好啦,碰到一个苦逼问题,就是没开时种啊,晕死,以前的程序忘了做声明,导致了漏掉了始终那一档子事, 读取来的ID是错误的,搞了一下午,嗳气八八!不行不行啊!低落ing,

GPRS仍然再测,一切良好,可以用一个低成本的处理起来实现,够用,gprs抄表的项目似乎领导们不太中意,我却看的很重,这个东西还是可以的,以后来说,用处还是大点的,虽然慢点,但是小数据量,无线传输的场合可以了,总不能每个都托根电线吧。所以我投入了大量的时间来处理链接的可靠性,告一段落了,剩下的时间就是永无休止的测测测测。。。。。。。。

还偶有一屁股的事情要做,路灯的通道板要做,完善,好几个小的整套测试程序都没做,还哦有好几个开关的程序要完善那,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表