打印

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

[复制链接]
楼主: taijing33
手机看帖
扫描二维码
随时随地手机跟帖
21
8# zq1987731
我觉得你肯定写错了 呵呵:)

你是怎么解决这似曾相识的问题的?

使用特权

评论回复
22
huanben| | 2011-10-29 10:25 | 只看该作者
10# NE5532
请问NE5532 这句话怎么理解?

使用特权

评论回复
23
taijing33|  楼主 | 2011-10-29 10:26 | 只看该作者
huanben  你这一句那一句的说的怎么啊?

使用特权

评论回复
24
zq1987731| | 2011-10-29 11:03 | 只看该作者
21# huanben
呵呵,CSMA/CD算法足以,贴一段上来好了,反正只是做着玩玩..
/*******************************************************************************************************************************
* Function Name : RS485_Tx_Mainloop
* Description   : Frame architecture
* Parameter     :
* Return        :
* Notes         :
*******************************************************************************************************************************/
    void RS485_Tx_Mainloop(void)
    {
        register UINT8 i;
        UINT8 mTxDataTemp;
        UINT8 mCheckSum;

        // RS485 Protocol processing(Send)
        switch(eRS485_TxStateMachine)
        {
            case eBusIdle:
                l_TxBufferProber++;
                if(l_TxBufferProber == TX_FRAME_BUFFER_SIZE)
                {
                    l_TxBufferProber = 0;
                }
                if(sTxFrameBuffer[l_TxBufferProber].mFrameBufferEmpty)
                {
                    pRxFrameCompare = &l_FrameCompare[0];
                    mTxDataTemp = (UINT8)sTxFrameBuffer[l_TxBufferProber].eTxFrameType;
                    switch(mTxDataTemp)
                    {
                        case eFrameType_MsgUnicast:
                        case eFrameType_MsgMulticast:
                            // Byte 1: 0x80/0x90|Length
                            l_RxFrameCount = sTxFrameBuffer[l_TxBufferProber].mFrameLength + 6;
                            mTxDataTemp |= l_RxFrameCount;
                            *pRxFrameCompare++ = mTxDataTemp;
                            mCheckSum = mTxDataTemp;
                            // Byte 2: TargetAddress(Unicast or Multicast)
                            mTxDataTemp = sTxFrameBuffer[l_TxBufferProber].mFrameTargetAddress;
                            *pRxFrameCompare++ = mTxDataTemp;      
                            mCheckSum += mTxDataTemp;
                            break;
                        case eFrameType_MsgBroadcast:
                            // Byte 1: 0xA0|Length
                            l_RxFrameCount = sTxFrameBuffer[l_TxBufferProber].mFrameLength + 5;
                            mTxDataTemp |= l_RxFrameCount;
                            *pRxFrameCompare++ = mTxDataTemp;     
                            mCheckSum = mTxDataTemp;
                            break;
                        default:
                            assert(0);
                            break;
                    }
                    // Common: MsgWord[0], MsgParam[1-mFrameLength]
                    sTxFrameBuffer[l_TxBufferProber].mFrameContentHead = 0;
                    for(i = 0; i <= sTxFrameBuffer[l_TxBufferProber].mFrameLength; i++)
                    {
                        mTxDataTemp = sTxFrameBuffer[l_TxBufferProber].mFrameContent[i];
                        if(mTxDataTemp & 0x80)
                        {
                            mTxDataTemp &= 0x7F;
                            sTxFrameBuffer[l_TxBufferProber].mFrameContentHead |= (0x01 << i);
                        }
                        *pRxFrameCompare++ = mTxDataTemp;
                        mCheckSum += mTxDataTemp;
                    }
                    // Common: MsgParamHead
                    mTxDataTemp = sTxFrameBuffer[l_TxBufferProber].mFrameContentHead;
                    *pRxFrameCompare++ = mTxDataTemp;
                    mCheckSum += mTxDataTemp;
                    // Common: LocalAddress
                    *pRxFrameCompare++ = gUnicastAddress;
                    mCheckSum += gUnicastAddress;
                    // Last Byte: CheckSum(Delete the most significant bit)
                    mTxDataTemp = mCheckSum & 0x7F;
                    *pRxFrameCompare = mTxDataTemp;
                    eRS485_TxStateMachine = eTxBusDetect;              
                }
                break;
            case eTxBusDetect:
                BusDetect_Init();
                eRS485_TxStateMachine = eTxBusDetectResult;
                break;
            case eTxBusDetectResult:
                switch(BusDetect_Results())
                {
                    case eScanning:
                        break;
                    case eBusbusy:
                        eRS485_TxStateMachine = eTxBusDetect;
                        break;
                    case eBusLeisure:
                        l_RxFrameCompareChecksum = 0;
                        l_RxFrameCount = l_FrameCompare[0] & 0x0F;
                        pRxFrameCompare = &l_FrameCompare[0];
                        l_TxFrameSendError = 0;
                        l_TxFrameSendComplete = 0;
                        for(i = 0; i < (l_FrameCompare[0] & 0x0F); i++)
                        {
                            Uart0_Push(l_FrameCompare[i]);
                        }
                        eRS485_TxStateMachine = eTxSending;
                    default:
                        assert(0);
                        break;
                }
                break;
            case eTxSending:
                if(l_TxFrameSendError)
                {
                    switch(sTxFrameBuffer[l_TxBufferProber].mFrameResendTime)
                    {   // mFrameResendTime: 1 - 255(The number of times a frame to send), 0 - unlimited
                        case 0:     // Unlimited number of try again
                            l_TxBufferProber--;
                            break;
                        case 1:     // Give up this frame data
                            sTxFrameBuffer[l_TxBufferProber].mFrameBufferEmpty = 0;
                            break;
                        default:    // 2 - 255: Try to send data once again
                            l_TxBufferProber--;
                            sTxFrameBuffer[l_TxBufferProber].mFrameResendTime--;
                            break;
                    }
                    eRS485_TxStateMachine = eBusIdle;
                }
                else if(l_TxFrameSendComplete)
                {   // Data frame sent successfully, Clear the buffer
                    sTxFrameBuffer[l_TxBufferProber].mFrameBufferEmpty = 0;
                    eRS485_TxStateMachine = eBusIdle;
                }
                break;
            default:
                assert(0);
                break;
        }            
    }
#endif /*---------------------------------------------------------------------------------------------------------------------*/

/*******************************************************************************************************************************
* Function Name : Uart_FrameHandle_Register
* Description   : Registration. Allocation function processing receives the legal frame
* Parameter     : pFunction - Scan code callback function pointer
* Return        :
* Notes         :
*******************************************************************************************************************************/
    void Uart_FrameHandle_Register(void (*pFunction)(struct RxFrameArchitecture *pEffectiveFrame))
    {
        sRxFrameArchitecture.pFramehandler = pFunction;
    }

/*******************************************************************************************************************************
* Function Name : Uart_Rx_Mainloop
* Description   : Deal with the received data from a serial port
* Parameter     :
* Return        :
* Notes         :
*******************************************************************************************************************************/   
    void Uart_Rx_Mainloop(void)
    {  
        register UINT8 temp;

        assert(sRxFrameArchitecture.pFramehandler != NULL);
        // RS485 Protocol processing(Receive)  
        while(Uart0_ReciNum())
        {
            temp = Uart0_Pop();
            if(temp & 0x80)
            {   // Frame head is always 1XXXXXXXB
                eUart_RxStateMachine = eRxFindFrameHead;
            }
            switch(eUart_RxStateMachine)
            {
                case eRxFindFrameHead:
                    sRxFrameArchitecture.eRxFrameType = temp & 0xF0;
                    sRxFrameArchitecture.mFrameLength = temp & 0x0F;
                    sRxFrameArchitecture.pFrameBuffer = &sRxFrameArchitecture.mFrameBuffer[0];
                    sRxFrameArchitecture.mFrameCheckSum = temp;
                    switch(sRxFrameArchitecture.eRxFrameType)
                    {
                        case eFrameType_MsgUnicast:
                        case eFrameType_MsgMulticast:
                            // Except 3-Bytes(FrameHead + TargetAddress + Checksum)
                            sRxFrameArchitecture.mRxDataCounter = sRxFrameArchitecture.mFrameLength - 3;
                            eUart_RxStateMachine = eRxFrameAddressCompire;
                            break;
                        case eFrameType_MsgBroadcast:
                            // Except 2-Bytes(FrameHead + Checksum)
                            sRxFrameArchitecture.mRxDataCounter = sRxFrameArchitecture.mFrameLength - 2;
                            eUart_RxStateMachine = eRxFrameReceiving;   
                            break;
                        default:
                            assert(0);
                            break;
                    }
                    break;
                case eRxFrameAddressCompire:
                    switch(sRxFrameArchitecture.eRxFrameType)
                    {
                        case eFrameType_MsgUnicast:
                            eUart_RxStateMachine = (gUnicastAddress == temp) ? eRxFrameReceiving : eRxFrameIgnore;
                            break;
                        case eFrameType_MsgMulticast:
                            eUart_RxStateMachine = (gMulticastAddress == temp) ? eRxFrameReceiving : eRxFrameIgnore;
                            break;
                        default:
                            assert(0);
                            break;
                    }
                    sRxFrameArchitecture.mFrameCheckSum += temp;
                    break;
                case eRxFrameReceiving:
                    if(1 < sRxFrameArchitecture.mRxDataCounter)
                    {
                        sRxFrameArchitecture.mRxDataCounter--;
                        *sRxFrameArchitecture.pFrameBuffer++ = temp;
                        sRxFrameArchitecture.mFrameCheckSum += temp;
                    }
                    else if(1 == sRxFrameArchitecture.mRxDataCounter)
                    {       // Record the sender's address
                        sRxFrameArchitecture.mRxDataCounter = 0;
                        sRxFrameArchitecture.mSenderAddress = temp;
                        sRxFrameArchitecture.mFrameCheckSum += temp;
                    }
                    else    // Last Byte: CheckSum
                    {       // Frame have received success
                        if(temp == (sRxFrameArchitecture.mFrameCheckSum & 0x7F))
                        {   // The frame currently being processed is not sent to their own
                            if(gUnicastAddress != sRxFrameArchitecture.mSenderAddress)
                            {
                                (*sRxFrameArchitecture.pFramehandler)(&sRxFrameArchitecture);
                            }
                        }
                        eUart_RxStateMachine = eRxFrameIgnore;   
                    }  
                    break;
                case eRxFrameIgnore:
                    break;
                default:
                    assert(0);
                    break;
            }         
        }
    }

使用特权

评论回复
25
taijing33|  楼主 | 2011-10-29 11:07 | 只看该作者
你搞什么啊?我的问题还没解决。

使用特权

评论回复
26
huanben| | 2011-10-29 12:15 | 只看该作者
25# taijing33

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

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

虽然没办法对你有所帮助,但是我的问题应该和你不相干扰。

使用特权

评论回复
27
刘前辈| | 2011-10-29 12:15 | 只看该作者
三个120并联等于40欧姆,近距离没什么问题,30欧姆以上实验都没问题。实验结果而已。产品可不行,算设计错误,最后原因查出来评不上工程师。

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



、、

使用特权

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


使用特权

评论回复
29
zq1987731| | 2011-10-29 12:31 | 只看该作者
简单来说就是各节点同时争抢总线,发送冲突检测随机时间退避算法。原理图??呵呵...485的EN脚还要用个IO去控制,岂不是浪费资源?

使用特权

评论回复
30
zq1987731| | 2011-10-29 12:38 | 只看该作者
LZ认为,B上拉A下拉、A上拉B下拉在这里哪一个才是正确的?无数据收发的状态下总线默认的电平状态应该是什么?

使用特权

评论回复
31
zq1987731| | 2011-10-29 13:23 | 只看该作者
反正今天闲得无聊...翻箱倒柜就弄出这么3个自动布线的破板子...既然有485就凑合了......软件几乎没什么改动,没有对应硬件的模块程序空转就是了...
接着么就这样子,互发带有多重校验的封包,单播/组播/广播虽为变长帧,但只各加了一个参数,即7/7/6字节,内容么就是发送一个随机数,让从机根据这个随机数改变边上LED的状态...

使用特权

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



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

用状态机处理收发, 程序风格不错, 但封装应该还能再精简一些,这样对LZ才有帮助。。

使用特权

评论回复
33
huanben| | 2011-10-29 13:41 | 只看该作者
34# xyz769
你好 LZ已经批评我给他的帖子捣乱了

你更厉害 连LZ问什么问题都不看下。

使用特权

评论回复
34
xyz769| | 2011-10-29 13:51 | 只看该作者
34# xyz769  
你好 LZ已经批评我给他的帖子捣乱了

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


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

但LZ硬要在自己的电路上钻牛角尖 ,也也没法子。。:D

使用特权

评论回复
35
7805125| | 2011-10-29 13:57 | 只看该作者
你再式试

使用特权

评论回复
36
taijing33|  楼主 | 2011-10-29 15:20 | 只看该作者
还是你看的准,我确实在这个地方弄反了。我改正后原来哦问题没有了。但是程序执行完那个子函数后就似乎停止了,。 32# zq1987731

使用特权

评论回复
37
jiabin1024| | 2011-10-29 15:39 | 只看该作者
没做过,帮不上忙

使用特权

评论回复
38
taijing33|  楼主 | 2011-10-29 15:45 | 只看该作者
谢谢捧场

使用特权

评论回复
39
taijing33|  楼主 | 2011-10-29 16:30 | 只看该作者
怎么给分啊?我要结贴。

使用特权

评论回复
40
weshiluwei6| | 2011-10-29 16:35 | 只看该作者
点我要结贴 然后 在每个人的回复的右边会出现一个小框 你在小框里填分就行 41# taijing33

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则