单片机疑难问题,(宇宙级难题)

[复制链接]
huanben 发表于 2011-10-29 10:18 | 显示全部楼层
8# zq1987731
我觉得你肯定写错了 呵呵:)

你是怎么解决这似曾相识的问题的?
huanben 发表于 2011-10-29 10:25 | 显示全部楼层
10# NE5532
请问NE5532 这句话怎么理解?
 楼主| taijing33 发表于 2011-10-29 10:26 | 显示全部楼层
huanben  你这一句那一句的说的怎么啊?
zq1987731 发表于 2011-10-29 11:03 | 显示全部楼层
21# huanben
呵呵,CSMA/CD算法足以,贴一段上来好了,反正只是做着玩玩..
  1. /*******************************************************************************************************************************
  2. * Function Name : RS485_Tx_Mainloop
  3. * Description   : Frame architecture
  4. * Parameter     :
  5. * Return        :
  6. * Notes         :
  7. *******************************************************************************************************************************/
  8.     void RS485_Tx_Mainloop(void)
  9.     {
  10.         register UINT8 i;
  11.         UINT8 mTxDataTemp;
  12.         UINT8 mCheckSum;

  13.         // RS485 Protocol processing(Send)
  14.         switch(eRS485_TxStateMachine)
  15.         {
  16.             case eBusIdle:
  17.                 l_TxBufferProber++;
  18.                 if(l_TxBufferProber == TX_FRAME_BUFFER_SIZE)
  19.                 {
  20.                     l_TxBufferProber = 0;
  21.                 }
  22.                 if(sTxFrameBuffer[l_TxBufferProber].mFrameBufferEmpty)
  23.                 {
  24.                     pRxFrameCompare = &l_FrameCompare[0];
  25.                     mTxDataTemp = (UINT8)sTxFrameBuffer[l_TxBufferProber].eTxFrameType;
  26.                     switch(mTxDataTemp)
  27.                     {
  28.                         case eFrameType_MsgUnicast:
  29.                         case eFrameType_MsgMulticast:
  30.                             // Byte 1: 0x80/0x90|Length
  31.                             l_RxFrameCount = sTxFrameBuffer[l_TxBufferProber].mFrameLength + 6;
  32.                             mTxDataTemp |= l_RxFrameCount;
  33.                             *pRxFrameCompare++ = mTxDataTemp;
  34.                             mCheckSum = mTxDataTemp;
  35.                             // Byte 2: TargetAddress(Unicast or Multicast)
  36.                             mTxDataTemp = sTxFrameBuffer[l_TxBufferProber].mFrameTargetAddress;
  37.                             *pRxFrameCompare++ = mTxDataTemp;      
  38.                             mCheckSum += mTxDataTemp;
  39.                             break;
  40.                         case eFrameType_MsgBroadcast:
  41.                             // Byte 1: 0xA0|Length
  42.                             l_RxFrameCount = sTxFrameBuffer[l_TxBufferProber].mFrameLength + 5;
  43.                             mTxDataTemp |= l_RxFrameCount;
  44.                             *pRxFrameCompare++ = mTxDataTemp;     
  45.                             mCheckSum = mTxDataTemp;
  46.                             break;
  47.                         default:
  48.                             assert(0);
  49.                             break;
  50.                     }
  51.                     // Common: MsgWord[0], MsgParam[1-mFrameLength]
  52.                     sTxFrameBuffer[l_TxBufferProber].mFrameContentHead = 0;
  53.                     for(i = 0; i <= sTxFrameBuffer[l_TxBufferProber].mFrameLength; i++)
  54.                     {
  55.                         mTxDataTemp = sTxFrameBuffer[l_TxBufferProber].mFrameContent[i];
  56.                         if(mTxDataTemp & 0x80)
  57.                         {
  58.                             mTxDataTemp &= 0x7F;
  59.                             sTxFrameBuffer[l_TxBufferProber].mFrameContentHead |= (0x01 << i);
  60.                         }
  61.                         *pRxFrameCompare++ = mTxDataTemp;
  62.                         mCheckSum += mTxDataTemp;
  63.                     }
  64.                     // Common: MsgParamHead
  65.                     mTxDataTemp = sTxFrameBuffer[l_TxBufferProber].mFrameContentHead;
  66.                     *pRxFrameCompare++ = mTxDataTemp;
  67.                     mCheckSum += mTxDataTemp;
  68.                     // Common: LocalAddress
  69.                     *pRxFrameCompare++ = gUnicastAddress;
  70.                     mCheckSum += gUnicastAddress;
  71.                     // Last Byte: CheckSum(Delete the most significant bit)
  72.                     mTxDataTemp = mCheckSum & 0x7F;
  73.                     *pRxFrameCompare = mTxDataTemp;
  74.                     eRS485_TxStateMachine = eTxBusDetect;              
  75.                 }
  76.                 break;
  77.             case eTxBusDetect:
  78.                 BusDetect_Init();
  79.                 eRS485_TxStateMachine = eTxBusDetectResult;
  80.                 break;
  81.             case eTxBusDetectResult:
  82.                 switch(BusDetect_Results())
  83.                 {
  84.                     case eScanning:
  85.                         break;
  86.                     case eBusbusy:
  87.                         eRS485_TxStateMachine = eTxBusDetect;
  88.                         break;
  89.                     case eBusLeisure:
  90.                         l_RxFrameCompareChecksum = 0;
  91.                         l_RxFrameCount = l_FrameCompare[0] & 0x0F;
  92.                         pRxFrameCompare = &l_FrameCompare[0];
  93.                         l_TxFrameSendError = 0;
  94.                         l_TxFrameSendComplete = 0;
  95.                         for(i = 0; i < (l_FrameCompare[0] & 0x0F); i++)
  96.                         {
  97.                             Uart0_Push(l_FrameCompare[i]);
  98.                         }
  99.                         eRS485_TxStateMachine = eTxSending;
  100.                     default:
  101.                         assert(0);
  102.                         break;
  103.                 }
  104.                 break;
  105.             case eTxSending:
  106.                 if(l_TxFrameSendError)
  107.                 {
  108.                     switch(sTxFrameBuffer[l_TxBufferProber].mFrameResendTime)
  109.                     {   // mFrameResendTime: 1 - 255(The number of times a frame to send), 0 - unlimited
  110.                         case 0:     // Unlimited number of try again
  111.                             l_TxBufferProber--;
  112.                             break;
  113.                         case 1:     // Give up this frame data
  114.                             sTxFrameBuffer[l_TxBufferProber].mFrameBufferEmpty = 0;
  115.                             break;
  116.                         default:    // 2 - 255: Try to send data once again
  117.                             l_TxBufferProber--;
  118.                             sTxFrameBuffer[l_TxBufferProber].mFrameResendTime--;
  119.                             break;
  120.                     }
  121.                     eRS485_TxStateMachine = eBusIdle;
  122.                 }
  123.                 else if(l_TxFrameSendComplete)
  124.                 {   // Data frame sent successfully, Clear the buffer
  125.                     sTxFrameBuffer[l_TxBufferProber].mFrameBufferEmpty = 0;
  126.                     eRS485_TxStateMachine = eBusIdle;
  127.                 }
  128.                 break;
  129.             default:
  130.                 assert(0);
  131.                 break;
  132.         }            
  133.     }
  134. #endif /*---------------------------------------------------------------------------------------------------------------------*/

  135. /*******************************************************************************************************************************
  136. * Function Name : Uart_FrameHandle_Register
  137. * Description   : Registration. Allocation function processing receives the legal frame
  138. * Parameter     : pFunction - Scan code callback function pointer
  139. * Return        :
  140. * Notes         :
  141. *******************************************************************************************************************************/
  142.     void Uart_FrameHandle_Register(void (*pFunction)(struct RxFrameArchitecture *pEffectiveFrame))
  143.     {
  144.         sRxFrameArchitecture.pFramehandler = pFunction;
  145.     }

  146. /*******************************************************************************************************************************
  147. * Function Name : Uart_Rx_Mainloop
  148. * Description   : Deal with the received data from a serial port
  149. * Parameter     :
  150. * Return        :
  151. * Notes         :
  152. *******************************************************************************************************************************/   
  153.     void Uart_Rx_Mainloop(void)
  154.     {  
  155.         register UINT8 temp;

  156.         assert(sRxFrameArchitecture.pFramehandler != NULL);
  157.         // RS485 Protocol processing(Receive)  
  158.         while(Uart0_ReciNum())
  159.         {
  160.             temp = Uart0_Pop();
  161.             if(temp & 0x80)
  162.             {   // Frame head is always 1XXXXXXXB
  163.                 eUart_RxStateMachine = eRxFindFrameHead;
  164.             }
  165.             switch(eUart_RxStateMachine)
  166.             {
  167.                 case eRxFindFrameHead:
  168.                     sRxFrameArchitecture.eRxFrameType = temp & 0xF0;
  169.                     sRxFrameArchitecture.mFrameLength = temp & 0x0F;
  170.                     sRxFrameArchitecture.pFrameBuffer = &sRxFrameArchitecture.mFrameBuffer[0];
  171.                     sRxFrameArchitecture.mFrameCheckSum = temp;
  172.                     switch(sRxFrameArchitecture.eRxFrameType)
  173.                     {
  174.                         case eFrameType_MsgUnicast:
  175.                         case eFrameType_MsgMulticast:
  176.                             // Except 3-Bytes(FrameHead + TargetAddress + Checksum)
  177.                             sRxFrameArchitecture.mRxDataCounter = sRxFrameArchitecture.mFrameLength - 3;
  178.                             eUart_RxStateMachine = eRxFrameAddressCompire;
  179.                             break;
  180.                         case eFrameType_MsgBroadcast:
  181.                             // Except 2-Bytes(FrameHead + Checksum)
  182.                             sRxFrameArchitecture.mRxDataCounter = sRxFrameArchitecture.mFrameLength - 2;
  183.                             eUart_RxStateMachine = eRxFrameReceiving;   
  184.                             break;
  185.                         default:
  186.                             assert(0);
  187.                             break;
  188.                     }
  189.                     break;
  190.                 case eRxFrameAddressCompire:
  191.                     switch(sRxFrameArchitecture.eRxFrameType)
  192.                     {
  193.                         case eFrameType_MsgUnicast:
  194.                             eUart_RxStateMachine = (gUnicastAddress == temp) ? eRxFrameReceiving : eRxFrameIgnore;
  195.                             break;
  196.                         case eFrameType_MsgMulticast:
  197.                             eUart_RxStateMachine = (gMulticastAddress == temp) ? eRxFrameReceiving : eRxFrameIgnore;
  198.                             break;
  199.                         default:
  200.                             assert(0);
  201.                             break;
  202.                     }
  203.                     sRxFrameArchitecture.mFrameCheckSum += temp;
  204.                     break;
  205.                 case eRxFrameReceiving:
  206.                     if(1 < sRxFrameArchitecture.mRxDataCounter)
  207.                     {
  208.                         sRxFrameArchitecture.mRxDataCounter--;
  209.                         *sRxFrameArchitecture.pFrameBuffer++ = temp;
  210.                         sRxFrameArchitecture.mFrameCheckSum += temp;
  211.                     }
  212.                     else if(1 == sRxFrameArchitecture.mRxDataCounter)
  213.                     {       // Record the sender's address
  214.                         sRxFrameArchitecture.mRxDataCounter = 0;
  215.                         sRxFrameArchitecture.mSenderAddress = temp;
  216.                         sRxFrameArchitecture.mFrameCheckSum += temp;
  217.                     }
  218.                     else    // Last Byte: CheckSum
  219.                     {       // Frame have received success
  220.                         if(temp == (sRxFrameArchitecture.mFrameCheckSum & 0x7F))
  221.                         {   // The frame currently being processed is not sent to their own
  222.                             if(gUnicastAddress != sRxFrameArchitecture.mSenderAddress)
  223.                             {
  224.                                 (*sRxFrameArchitecture.pFramehandler)(&sRxFrameArchitecture);
  225.                             }
  226.                         }
  227.                         eUart_RxStateMachine = eRxFrameIgnore;   
  228.                     }  
  229.                     break;
  230.                 case eRxFrameIgnore:
  231.                     break;
  232.                 default:
  233.                     assert(0);
  234.                     break;
  235.             }         
  236.         }
  237.     }
 楼主| taijing33 发表于 2011-10-29 11:07 | 显示全部楼层
你搞什么啊?我的问题还没解决。
huanben 发表于 2011-10-29 12:15 | 显示全部楼层
25# taijing33

不好意思 taijing33 不能对你的问题提出建设性解决意见。

22楼提问的是NE5532在10楼那句话怎么理解。

虽然没办法对你有所帮助,但是我的问题应该和你不相干扰。
刘前辈 发表于 2011-10-29 12:15 | 显示全部楼层
三个120并联等于40欧姆,近距离没什么问题,30欧姆以上实验都没问题。实验结果而已。产品可不行,算设计错误,最后原因查出来评不上工程师。

我的系统接了80个从机,最远800米。只需要在800米双绞线两端焊2个120欧姆即可;板子上无需加电阻。



、、
刘前辈 发表于 2011-10-29 12:30 | 显示全部楼层
还有就是,下载程序时,必须保证半双工485芯片 75176 处于输出状态,也就是第2/3管脚RE/DE 必须为低电平! 如图,这只要在2个红色X 之一位置焊接一个短路块即可;——下载程序时拔掉短路块,工作时短接短路块。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
zq1987731 发表于 2011-10-29 12:31 | 显示全部楼层
简单来说就是各节点同时争抢总线,发送冲突检测随机时间退避算法。原理图??呵呵...485的EN脚还要用个IO去控制,岂不是浪费资源?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
zq1987731 发表于 2011-10-29 12:38 | 显示全部楼层
LZ认为,B上拉A下拉、A上拉B下拉在这里哪一个才是正确的?无数据收发的状态下总线默认的电平状态应该是什么?
zq1987731 发表于 2011-10-29 13:23 | 显示全部楼层
反正今天闲得无聊...翻箱倒柜就弄出这么3个自动布线的破板子...既然有485就凑合了......软件几乎没什么改动,没有对应硬件的模块程序空转就是了...
接着么就这样子,互发带有多重校验的封包,单播/组播/广播虽为变长帧,但只各加了一个参数,即7/7/6字节,内容么就是发送一个随机数,让从机根据这个随机数改变边上LED的状态...

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
xyz769 发表于 2011-10-29 13:37 | 显示全部楼层
简单来说就是各节点同时争抢总线,发送冲突检测随机时间退避算法。原理图??呵呵...485的EN脚还要用个IO去控制,岂不是浪费资源?
83413
zq1987731 发表于 2011-10-29 12:31



LS回复好快啊。。呵呵。。

用状态机处理收发, 程序风格不错, 但封装应该还能再精简一些,这样对LZ才有帮助。。
huanben 发表于 2011-10-29 13:41 | 显示全部楼层
34# xyz769
你好 LZ已经批评我给他的帖子捣乱了

你更厉害 连LZ问什么问题都不看下。
xyz769 发表于 2011-10-29 13:51 | 显示全部楼层
34# xyz769  
你好 LZ已经批评我给他的帖子捣乱了

你更厉害 连LZ问什么问题都不看下。
huanben 发表于 2011-10-29 13:41


哈哈。。 LZ的问题,首先是电路设计问题,再者是程序设计问题。
应该是搞设计经验还不足,所以能参考一下优秀的设计是十分重要的。

但LZ硬要在自己的电路上钻牛角尖 ,也也没法子。。:D
7805125 发表于 2011-10-29 13:57 | 显示全部楼层
你再式试
 楼主| taijing33 发表于 2011-10-29 15:20 | 显示全部楼层
还是你看的准,我确实在这个地方弄反了。我改正后原来哦问题没有了。但是程序执行完那个子函数后就似乎停止了,。 32# zq1987731
jiabin1024 发表于 2011-10-29 15:39 | 显示全部楼层
没做过,帮不上忙
 楼主| taijing33 发表于 2011-10-29 15:45 | 显示全部楼层
谢谢捧场
 楼主| taijing33 发表于 2011-10-29 16:30 | 显示全部楼层
怎么给分啊?我要结贴。
weshiluwei6 发表于 2011-10-29 16:35 | 显示全部楼层
点我要结贴 然后 在每个人的回复的右边会出现一个小框 你在小框里填分就行 41# taijing33
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部