⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d_lowspeed.r

📁 乐高机器人的源码,开发平台是IAR_for_AVR.
💻 R
📖 第 1 页 / 共 3 页
字号:
										     if (ChannelNr == 1)\
										     {\
										       SETDataComTwoLow;\
										     }\
										     else\
										     {\
										       if (ChannelNr == 2)\
										       {\
										         SETDataComThreeLow;\
										       }\
										       else\
										       {\
										         if (ChannelNr == 3)\
										         {\
										           SETDataComFourLow;\
										         }\
										       }\
										     }\
										   }\
                                         }

#define SETDataHigh(ChannelNr)           {\
										   if (ChannelNr == 0)\
										   {\
										     SETDataComOneHigh;\
										   }\
										   else\
										   {\
										     if (ChannelNr == 1)\
										     {\
										       SETDataComTwoHigh;\
										     }\
										     else\
										     {\
										       if (ChannelNr == 2)\
										       {\
										         SETDataComThreeHigh;\
										       }\
										       else\
										       {\
										         if (ChannelNr == 3)\
										         {\
										           SETDataComFourHigh;\
										         }\
										       }\
										     }\
										   }\
                                         }

#define SETDataToInput(ChannelNr)		 {\
										   if (ChannelNr == 0)\
										   {\
										     SETDataComOneToInput;\
										   }\
										   else\
										   {\
										     if (ChannelNr == 1)\
										     {\
										       SETDataComTwoToInput;\
										     }\
										     else\
										     {\
										       if (ChannelNr == 2)\
										       {\
										         SETDataComThreeToInput;\
										       }\
										       else\
										       {\
										         if (ChannelNr == 3)\
										         {\
										           SETDataComFourToInput;\
										         }\
										       }\
										     }\
										   }\
                                         }


#define SETDataToOutput(ChannelNr)		 {\
										   if (ChannelNr == 0)\
										   {\
										     SETDataComOneToOutput;\
										   }\
										   else\
										   {\
										     if (ChannelNr == 1)\
										     {\
										       SETDataComTwoToOutput;\
										     }\
										     else\
										     {\
										       if (ChannelNr == 2)\
										       {\
										         SETDataComThreeToOutput;\
										       }\
										       else\
										       {\
										         if (ChannelNr == 3)\
										         {\
										           SETDataComFourToOutput;\
										         }\
										       }\
										     }\
										   }\
                                         }


#define   ENABLEPWMTimerForLowCom       {\
                                          *AT91C_PWMC_ENA		= AT91C_PWMC_CHID0;			/* Enable PWM output channel 0 */\
										}

#define    DISABLEPWMTimerForLowCom		{\
                                          *AT91C_PWMC_DIS	 = AT91C_PWMC_CHID0;			/* Disable PWM output channel 0 */\
										}
										
#define    OLD_DISABLEPWMTimerForLowCom	{\
										  *AT91C_PWMC_DIS	 = AT91C_PWMC_CHID0;			/* Disable PWM output channel 0 */\
                                          *AT91C_PWMC_IDR	 = AT91C_PWMC_CHID0;			/* Disable interrupt from PWM output channel 0 */\
										  *AT91C_AIC_IDCR    = 0x400;						/* Disable Irq from PID10 */\
                                          *AT91C_AIC_ICCR    = 0x400;						/* Clear interrupt register PID10*/\
                                          *AT91C_PMC_PCDR    = 0x400;						/* Disable clock for PWM, PID10*/\
										}

__ramfunc void LowSpeedPwmIrqHandler(void)
{
  ULONG TestVar;
  ULONG PinStatus;
  UBYTE ChannelNr;

  TestVar = *AT91C_PWMC_ISR;
  TestVar = TestVar;
  PinStatus = *AT91C_PIOA_PDSR;

  for (ChannelNr = 0; ChannelNr < NO_OF_LOWSPEED_COM_CHANNEL; ChannelNr++)
  {
    switch(LowSpeedData[ChannelNr].ChannelState)
    {
      case LOWSPEED_IDLE:
      {
      }
      break;

      case LOWSPEED_TX_STOP_BIT:
      {
        SETDataHigh(ChannelNr);
        LowSpeedData[ChannelNr].ChannelState = LOWSPEED_IDLE;                                     //Now we have send a STOP sequence, disable this channel
      }
      break;

      case LOWSPEED_TRANSMITTING:
      {
        switch(LowSpeedData[ChannelNr].TxState)
        {
          case TX_DATA_MORE_DATA:
          {
            PinStatus |= CLK_PINS[ChannelNr];
            LowSpeedData[ChannelNr].TxState = TX_DATA_CLK_HIGH;
          }
          break;

          case TX_DATA_CLK_HIGH:
          {
            SETClkLow(ChannelNr);
            if (LowSpeedData[ChannelNr].MaskBit == 0)     				                           //Is Byte Done, then we need a ack from receiver
            {
              SETDataToInput(ChannelNr);                                                             //Set datapin to input
              LowSpeedData[ChannelNr].TxState = TX_DATA_READ_ACK_CLK_LOW;
            }
            else
            {
              if (*LowSpeedData[ChannelNr].pComOutBuffer & LowSpeedData[ChannelNr].MaskBit)          //Setup data pin in relation to the data
              {
	            SETDataHigh(ChannelNr);       						                               //Set data output high
              }
	          else
              {
	            SETDataLow(ChannelNr);                                                               //Set data output low
              }
              LowSpeedData[ChannelNr].TxState = TX_DATA_CLK_LOW;
            }
          }
          break;

          case TX_EVALUATE_ACK_CLK_HIGH:
          {
            SETClkLow(ChannelNr);
            if (LowSpeedData[ChannelNr].AckStatus == 1)	
	        {
	          LowSpeedData[ChannelNr].TxByteCnt--;
	          if (LowSpeedData[ChannelNr].TxByteCnt > 0)	        		    			   //Here initialise to send next byte
	          {
	            LowSpeedData[ChannelNr].MaskBit = MASK_BIT_8;
	            LowSpeedData[ChannelNr].pComOutBuffer++;
	          }
	          LowSpeedData[ChannelNr].TxState = TX_ACK_EVALUATED_CLK_LOW;                    //Received ack, now make a stop sequence or send next byte
	        }
	        else
	        { //Data communication error !
	          LowSpeedData[ChannelNr].TxByteCnt = 0;
	          SETClkHigh(ChannelNr);
              LowSpeedData[ChannelNr].ChannelState = LOWSPEED_TX_STOP_BIT;                     //Received ack, now make a stop sequence or send next byte.
	        }
          }
          break;

          case TX_DATA_READ_ACK_CLK_LOW:
          {
            if (!(PinStatus & DATA_PINS[ChannelNr]))
	        {
	          LowSpeedData[ChannelNr].AckStatus = 1;										//Read ack signal from receiver
	        }	        	        	
	        SETDataToOutput(ChannelNr);
	        SETDataLow(ChannelNr);
	        LowSpeedData[ChannelNr].TxState = TX_EVALUATE_ACK_CLK_HIGH;
	        SETClkHigh(ChannelNr);
          }
          break;

          case TX_DATA_CLK_LOW:
          {
            LowSpeedData[ChannelNr].MaskBit = LowSpeedData[ChannelNr].MaskBit >> 1;			//Get ready for the next bit which should be clk out next time
            SETClkHigh(ChannelNr);															//Clk goes high = The reciever reads the data
            LowSpeedData[ChannelNr].TxState = TX_DATA_CLK_HIGH;
          }
          break;

          case TX_ACK_EVALUATED_CLK_LOW:
          {
            if (LowSpeedData[ChannelNr].MaskBit != 0)
            {
              LowSpeedData[ChannelNr].TxState = TX_DATA_MORE_DATA;
            }
            else
            {
              if (LowSpeedData[ChannelNr].ReStartBit != 0)
              {
                LowSpeedData[ChannelNr].ChannelState = LOWSPEED_RESTART_CONDITION;
                LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_ONE;
                SETDataLow(ChannelNr);
                SETClkHigh(ChannelNr);                                                         //Clk goes high = The reciever reads the data
              }
              else
              {
                if (LowSpeedData[ChannelNr].RxByteCnt != 0)
                {
                  LowSpeedData[ChannelNr].ChannelState = LOWSPEED_WAIT_BEFORE_RX;
                }
                else
                {
                  LowSpeedData[ChannelNr].ChannelState = LOWSPEED_TX_STOP_BIT;
                  SETClkHigh(ChannelNr);                                                         //Clk goes high = The reciever reads the data
                }
              }
              LowSpeedData[ChannelNr].TxState = TX_IDLE;
            }
          }
          break;
        }
      }
      break;

      case LOWSPEED_RESTART_CONDITION:
      {
        switch(LowSpeedData[ChannelNr].ReStartState)
        {
          case RESTART_STATE_ONE:
          {
            LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_TWO;
          }
          break;

          case RESTART_STATE_TWO:
          {
            SETDataHigh(ChannelNr);
            LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_THREE;
          }
          break;

          case RESTART_STATE_THREE:
          {
            SETClkLow(ChannelNr);
            LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_FOUR;
          }
          break;

          case RESTART_STATE_FOUR:
          {
            SETClkHigh(ChannelNr);
            LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_FIVE;
          }
          break;

          case RESTART_STATE_FIVE:
          {
            SETDataLow(ChannelNr);
            LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_SIX;
          }
          break;

          case RESTART_STATE_SIX:
          {
            LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_SEVEN;
          }
          break;

          case RESTART_STATE_SEVEN:
          {
            SETClkLow(ChannelNr);
            LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_IDLE;
            LowSpeedData[ChannelNr].ReStartBit = 0;
            LowSpeedData[ChannelNr].pComOutBuffer = &LowSpeedData[ChannelNr].ComDeviceAddress;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -