亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? canopdriver.c

?? 開(kāi)放源碼的CanOpen源碼(C)
?? C
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
   //find out, if message matches entry in CO_RXCAN_ID array and remember index
   _asm
      //move CO_RXCAN_ID address to FSR0
      LFSR     0, CO_RXCAN_ID
      //do{
   CO_IH_PF1:
       //if(*(FSR0++) == RXB0SIDL){
      MOVF     POSTINC0, 0, ACCESS
      SUBWF    RXB0SIDL, 0, ACCESS
      BNZ      CO_IH_PF2
        //if(*FSR0 == RXB0SIDH){
      MOVF     INDF0, 0, ACCESS
      SUBWF    RXB0SIDH, 0, ACCESS
      BNZ      CO_IH_PF2
         //break
      BRA      CO_IH_PF3
        //}
       //}
   CO_IH_PF2:
       //FSR0++; CO_IsrHighIndex++;
      INCF     FSR0L, 1, ACCESS
      INCF     CO_IsrHighIndex, 1, ACCESS
      //}while(CO_IsrHighIndex != (3+CO_NO_RPDO+CO_NO_CONS_HEARTBEAT));
      MOVLW    3+CO_NO_RPDO+CO_NO_CONS_HEARTBEAT
      SUBWF    CO_IsrHighIndex, 0, ACCESS
      BNZ      CO_IH_PF1
   CO_IH_PF3:
   _endasm
   
   if(CO_IsrHighIndex < (3+CO_NO_RPDO+CO_NO_CONS_HEARTBEAT)){//matched message
      CO_IsrHighRxNoOfBytes = RXB0DLC & 0x0F;

      /* NMT message from master */
      if(CO_IsrHighIndex == 0){
         if(CO_IsrHighRxNoOfBytes != 2) CO_IsrHighSignal.Error.bits.NMTlength = 1;
         else if(RXB0D1 == 0 || RXB0D1 == CO_NodeID){
            switch(RXB0D0){
               case NMT_ENTER_OPERATIONAL:      CO_NMToperatingState = NMT_OPERATIONAL; break;
               case NMT_ENTER_STOPPED:          CO_NMToperatingState = NMT_STOPPED; break;
               case NMT_ENTER_PRE_OPERATIONAL:  CO_NMToperatingState = NMT_PRE_OPERATIONAL; break;
               case NMT_RESET_NODE:             Reset(); break;  //reset node
               case NMT_RESET_COMMUNICATION:    CO_IsrHighSignal.ResetComm = 1; break; //reset communication
               default:  CO_IsrHighSignal.Error.bits.NMTcmd = 1;
            }
         }
      }
      
      else if(CO_NMToperatingState==NMT_PRE_OPERATIONAL || CO_NMToperatingState==NMT_OPERATIONAL){      
         /* SYNC messaage */
         if(CO_IsrHighIndex == 1){
            if(CO_IsrHighRxNoOfBytes != 0) CO_IsrHighSignal.Error.bits.SyncLength = 1;
            else{//valid sync recived
               ODE_SYNCcounter++;
               ODE_SYNCtime = 0;
            }
         }
            
         /* SDO communication */
         else if(CO_IsrHighIndex == 2){
            if(CO_IsrHighRxNoOfBytes != 8) CO_IsrHighSignal.Error.bits.SDOlength = 1;
            else if(CO_SDOrequest == 0){//check if previous SDO was processed, otherwise ignore
               //copy CAN data to SDO data
               //memcpy((void*)CO_SDO.data, (void*)&RXB0D0, 8);
               _asm
                  LFSR     0, CO_SDORXdata
                  MOVFF    RXB0D0, POSTINC0
                  MOVFF    RXB0D1, POSTINC0
                  MOVFF    RXB0D2, POSTINC0
                  MOVFF    RXB0D3, POSTINC0
                  MOVFF    RXB0D4, POSTINC0
                  MOVFF    RXB0D5, POSTINC0
                  MOVFF    RXB0D6, POSTINC0
                  MOVFF    RXB0D7, POSTINC0
               _endasm
               CO_SDOrequest = 1;
            }
         }
            
         #if CO_NO_RPDO > 0
         /* Recived PDOs communication */
         else if(CO_IsrHighIndex < (3+CO_NO_RPDO)){
            if(CO_NMToperatingState==NMT_OPERATIONAL){
               CO_IsrHighIndex -= 3;
               if(CO_IsrHighRxNoOfBytes != CO_RPDOlength[CO_IsrHighIndex]) CO_IsrHighSignal.Error.bits.PDOlength = 1;
               else if(CO_IsrHighRxNoOfBytes){
                  CO_RPDOcount[CO_IsrHighIndex]++;
                  //copy CAN data to RPDO data
                  //memcpy((void*)&CO_RPDO[CO_IsrHighIndex], (void*)&RXB0D0, CO_IsrHighRxNoOfBytes);
                  _asm
                     LFSR     0, CO_RPDO
                     MOVF     FSR0L, 0, ACCESS

                  CO_IH_RPDO1:
                     DECF     CO_IsrHighIndex, 1, ACCESS
                     BNC      CO_IH_RPDO2
                     ADDLW    CO_SIZE_OF_RPDO_DATA
                     BRA      CO_IH_RPDO1
                     
                  CO_IH_RPDO2:
                     MOVWF    FSR0L, ACCESS
                     MOVFF    RXB0D0, POSTINC0
                     DCFSNZ   CO_IsrHighRxNoOfBytes, 1, ACCESS
                     BRA      CO_IH_RPDO3
                     MOVFF    RXB0D1, POSTINC0
                     DCFSNZ   CO_IsrHighRxNoOfBytes, 1, ACCESS
                     BRA      CO_IH_RPDO3
                     MOVFF    RXB0D2, POSTINC0
                     DCFSNZ   CO_IsrHighRxNoOfBytes, 1, ACCESS
                     BRA      CO_IH_RPDO3
                     MOVFF    RXB0D3, POSTINC0
                     DCFSNZ   CO_IsrHighRxNoOfBytes, 1, ACCESS
                     BRA      CO_IH_RPDO3
                     MOVFF    RXB0D4, POSTINC0
                     DCFSNZ   CO_IsrHighRxNoOfBytes, 1, ACCESS
                     BRA      CO_IH_RPDO3
                     MOVFF    RXB0D5, POSTINC0
                     DCFSNZ   CO_IsrHighRxNoOfBytes, 1, ACCESS
                     BRA      CO_IH_RPDO3
                     MOVFF    RXB0D6, POSTINC0
                     DCFSNZ   CO_IsrHighRxNoOfBytes, 1, ACCESS
                     BRA      CO_IH_RPDO3
                     MOVFF    RXB0D7, POSTINC0
                  CO_IH_RPDO3:
                  _endasm  //index and NoOfBytes are no more correct
               }
            }
         }
         #endif
            
         #if CO_NO_CONS_HEARTBEAT > 0
          /* Consumer heartbeat message */
          else{
             if(CO_IsrHighRxNoOfBytes != 1) CO_IsrHighSignal.Error.bits.HeartBeatLength = 1;
             else if(RXB0D0){ //ignore bootup message
                CO_IsrHighIndex -= (3+CO_NO_RPDO);
                CO_HBcons_TimerValue[CO_IsrHighIndex] = CO_Timer16Value;  //reset timer
                CO_HBcons_NMTstate[CO_IsrHighIndex] = RXB0D0;
             }
          }
         #endif
            
      }
         
   }
   RXB0CONbits.RXFUL = 0;  //release buffer
   PCB_BANDWIDTH_IsrHigh(0);   
}

/*******************************************************************************
   INTERRUPT SERVICE ROUTINE
   
   Transmition of messages:
      There are three transmit buffers, all are interrupt driven. First is used 
      for transmitting SDOs, Heartbeats and user messages, second is for PDOs, 
      third for Sync and Emergencies. These messages has own buffer. When CAN transmit
      registers are free, interrupt occures and copies message to CAN registers.
      
*******************************************************************************/
void CO_IsrCANtxErr(void){
   static char i;

   /***** Transmition of SYNC and Emergency ***********************************/
   if(PIE3bits.TXB2IE && PIR3bits.TXB2IF){
      if(CO_TXCAN_SEMsendReq & 1){
         CO_CanSend(CO_TXCAN_SEMmsgs[0], 2, 3);
         CO_TXCAN_SEMsendReq &= 0xFE;
      }
      else if(CO_TXCAN_SEMsendReq & 2){
         CO_CanSend(CO_TXCAN_SEMmsgs[1], 2, 3);
         CO_TXCAN_SEMsendReq &= 0xFD;
      }
      else //disable interrupt if buffers are empty
         PIE3bits.TXB2IE = 0; 
   }

   /***** Transmition of PDOs *************************************************/
   #if CO_NO_TPDO > 0
   else if(PIE3bits.TXB1IE && PIR3bits.TXB1IF){
      //check if there are any data in buffers to send
      if(CO_TXCAN_PDOsendReq){
         unsigned char SendReq = CO_TXCAN_PDOsendReq;
         unsigned int SYNCtimeCopy;
         INTCONbits.GIEH = 0;
         SYNCtimeCopy = ODE_SYNCtime;
         INTCONbits.GIEH = 1;
   
         for(i=0; i<CO_NO_TPDO; i++){
            if(SendReq & 1){
               //check if synchronous PDOs are transmitted inside preset window
               if(CO_SYNC.window && SYNCtimeCopy > CO_SYNC.window && 
                  (ODE_TPDO_Parameter[i].Transmission_type-1) <= 239)
                  ErrorReport(ERROR_TPDO_OUTSIDE_WINDOW, SYNCtimeCopy);
               else 
                  CO_CanSend(CO_TXCAN_PDOmsgs[i], 0, 2);
               break;
            }
            SendReq >>= 1;
         }
         //clear flag
         CO_TXCAN_PDOsendReq &= (1 << i) ^ 0xFF;
      }
      else //disable interrupt if buffers are empty
         PIE3bits.TXB1IE = 0; 
   }
   #endif

   /***** Transmition of other messages ***************************************/
   else if(PIE3bits.TXB0IE && PIR3bits.TXB0IF){
      //check if there are any data in buffers to send
      if(CO_TXCAN_OtherSendReq){
         unsigned char SendReq = CO_TXCAN_OtherSendReq;
         for(i=0; i<CO_NO_USR_CAN_BUFF+2; i++){
            if(SendReq & 1){
               CO_CanSend(CO_TXCAN_OtherMsgs[i], 1, 1);
               break;
            }
            SendReq >>= 1;
         }
         //clear flag
         CO_TXCAN_OtherSendReq &= (1 << i) ^ 0xFF;
      }
      else //disable interrupt if buffers are empty
         PIE3bits.TXB0IE = 0; 
   }

   /***** Errors **************************************************************/
   //ERRIF is set on every change of COMSTAT, except on change to zero
   else if(PIR3bits.ERRIF && PIE3bits.ERRIE){
      if(COMSTAT & 0xC0){
         ErrorReport(ERROR_CAN_RXB_OVERFLOW, COMSTAT);
         COMSTAT &= 0x3F;   //RXBnOVFL bits must be cleared or ERRIF can not be reset
      }
      if(COMSTATbits.TXBO)
         ErrorReport(ERROR_CAN_TX_BUS_OFF, COMSTAT);
      if(COMSTATbits.TXBP)
         ErrorReport(ERROR_CAN_TX_BUS_PASSIVE, COMSTAT);
      if(COMSTATbits.RXBP)
         ErrorReport(ERROR_CAN_RX_BUS_PASSIVE, COMSTAT);
      if(COMSTAT & 0x07)
         ErrorReport(ERROR_CAN_BUS_WARNING, COMSTAT);
      PIR3bits.ERRIF = 0;
   }
}

/*******************************************************************************
   Process CANopen from 1ms interrupt
   Used for reliable, accurate and fast procedures
*******************************************************************************/
void CO_IsrProcess1ms(void){
   static unsigned char i;
    
   INTCONbits.GIEH = 0;
   CO_Timer16Value++;
   INTCONbits.GIEH = 1;

/* Dealing with SYNC **********************************************************/
   if(CO_SYNC.period){//SYNC is enabled
      unsigned int SYNCtimeCopy;
      INTCONbits.GIEH = 0;
      SYNCtimeCopy = ODE_SYNCtime;
      INTCONbits.GIEH = 1;
   
      //if SYNC is recived or transmitted send SYNC PDOs
      #if CO_NO_TPDO > 0
         if(SYNCtimeCopy == 0 && CO_NMToperatingState==NMT_OPERATIONAL){
            for(i=0; i<CO_NO_TPDO; i++){
               if((romBYTE3(ODE_TPDO_Parameter[i].COB_ID) & 0x80) == 0 && //is TPDO used
                  CO_TPDOlength[i] && --CO_tTPDOwait[i] == 0){
                  if((ODE_TPDO_Parameter[i].Transmission_type-1) <= 239){//is value from 1...240
                     unsigned char flag = 1 << i;
                     CO_tTPDOwait[i] = ODE_TPDO_Parameter[i].Transmission_type;
                     if(CO_TXCAN_PDOsendReq & flag)
                        ErrorReport(ERROR_CanSendPDO_Overflow, i);
                     else{
                        CO_TXCAN_PDOsendReq |= flag;
                        PIE3bits.TXB1IE = 1; //inform ISR
                     }
                  }
                  else CO_tTPDOwait[i] = 254;
               }
            }
         }
      #endif
      
      //increment timers
      INTCONbits.GIEH = 0;
      ODE_SYNCtime++;
      INTCONbits.GIEH = 1;
      
      //SYNC producer
         //SYNC message can be recived or transmited, not both in same time. 
         //Useful variables are ODE_SYNCcounter and ODE_SYNCtime, which define 
         //exact time in [ms] synchronised in all nodes. 
      if((romBYTE3(ODE_SYNC_COB_ID) & 0x40) &&
        (CO_NMToperatingState==NMT_PRE_OPERATIONAL || CO_NMToperatingState==NMT_OPERATIONAL)){
         static unsigned int tSYNCperiod = 0;
         if(++tSYNCperiod >= CO_SYNC.period){
            CO_TXCAN_SEMsendReq |= 1;
            PIE3bits.TXB2IE = 1; //inform ISR
            INTCONbits.GIEH = 0;
            ODE_SYNCcounter++;
            ODE_SYNCtime = 0;
            INTCONbits.GIEH = 1;
            tSYNCperiod = 0;
         }
      }
      
      //presence of sync pulse
      if((SYNCtimeCopy>CO_SYNC.periodTimeout) && CO_NMToperatingState==NMT_OPERATIONAL)

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91视频免费看| 欧美乱妇一区二区三区不卡视频 | 国产嫩草影院久久久久| 在线精品视频一区二区三四| 精品影视av免费| 亚洲精品成人天堂一二三| 精品国产91亚洲一区二区三区婷婷 | 免费观看久久久4p| 17c精品麻豆一区二区免费| 欧美成人三级在线| 欧美在线观看视频一区二区 | 日韩黄色一级片| 国产精品私人影院| 精品三级在线看| 欧美视频在线一区| 99久久精品国产精品久久| 日本成人在线网站| 亚洲一区二区三区四区的| 中文字幕+乱码+中文字幕一区| 欧美一区二区私人影院日本| 色偷偷久久一区二区三区| 夫妻av一区二区| 久久99精品国产.久久久久久| 亚洲自拍偷拍欧美| 经典三级视频一区| 无吗不卡中文字幕| 亚洲免费成人av| 国产精品久久久久婷婷二区次| 欧美成人r级一区二区三区| 欧美日韩亚洲综合一区| 日本韩国欧美国产| 91丨九色porny丨蝌蚪| 丁香激情综合国产| 国产精品一级黄| 激情伊人五月天久久综合| 亚洲成人先锋电影| 午夜久久电影网| 亚洲国产精品尤物yw在线观看| 亚洲人亚洲人成电影网站色| 中文在线一区二区| 国产视频一区在线观看| 国产亚洲欧洲997久久综合| 精品久久人人做人人爰| 欧美电影免费观看完整版| 日韩视频中午一区| 日韩欧美黄色影院| 精品久久久久久久久久久久久久久 | 高清不卡在线观看av| 国产一区二区三区最好精华液| 美女被吸乳得到大胸91| 麻豆精品在线看| 老鸭窝一区二区久久精品| 久久er精品视频| 国产一区二区三区日韩 | 色噜噜夜夜夜综合网| 色婷婷综合久色| 欧美亚洲自拍偷拍| 91精品在线免费观看| 欧美一区三区四区| 久久久噜噜噜久久中文字幕色伊伊| 久久综合视频网| 国产精品网站在线观看| 亚洲日本成人在线观看| 亚洲大片免费看| 日本欧美久久久久免费播放网| 久久www免费人成看片高清| 国产一区二区三区av电影| 波多野结衣一区二区三区 | 国产综合久久久久久鬼色| 国产精品一区二区91| 91亚洲大成网污www| 欧美影院精品一区| 欧美变态tickling挠脚心| 国产亚洲精品精华液| 亚洲人午夜精品天堂一二香蕉| 亚洲愉拍自拍另类高清精品| 免费在线观看成人| 国内国产精品久久| 99久久综合精品| 欧美日韩一区二区三区在线| 精品欧美一区二区三区精品久久| 国产精品毛片高清在线完整版| 亚洲精品国产成人久久av盗摄 | 日本精品视频一区二区| 91麻豆精品国产91久久久久| 国产欧美va欧美不卡在线| 亚洲国产精品综合小说图片区| 国产一区二三区| 欧美艳星brazzers| 国产亲近乱来精品视频| 一区二区三区 在线观看视频| 久久国产婷婷国产香蕉| 99re成人在线| 欧美变态口味重另类| 亚洲欧美欧美一区二区三区| 六月丁香婷婷久久| 91片黄在线观看| 精品国产亚洲在线| 亚洲狠狠丁香婷婷综合久久久| 久久99精品久久久久| 欧洲视频一区二区| 国产日韩精品一区二区三区| 丝袜美腿亚洲色图| a级精品国产片在线观看| 日韩亚洲欧美一区二区三区| 亚洲精品欧美专区| 国产精品影音先锋| 日韩一区二区精品葵司在线| 亚洲天堂免费看| 国产精品一区二区视频| 欧美片网站yy| 中文字幕制服丝袜一区二区三区| 青青草精品视频| 在线观看视频欧美| 国产精品美女久久久久久久| 黄色成人免费在线| 欧美日韩精品高清| 亚洲人xxxx| 成人激情综合网站| 久久亚洲欧美国产精品乐播| 麻豆精品国产传媒mv男同 | 国产亚洲婷婷免费| 久草在线在线精品观看| 欧美日韩一区二区三区视频| 国产精品欧美一区二区三区| 国产一区二区在线电影| 精品剧情v国产在线观看在线| 亚洲成av人片| 欧美三区免费完整视频在线观看| 国产精品久久久久精k8| 国产精品综合一区二区| 久久一区二区三区四区| 另类欧美日韩国产在线| 欧美一区二区精品久久911| 亚洲国产日韩a在线播放性色| 色综合久久久久网| 亚洲免费av高清| 色丁香久综合在线久综合在线观看| 中文字幕av不卡| av电影天堂一区二区在线| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 亚洲精品国产精品乱码不99| 一本一本大道香蕉久在线精品| 国产精品大尺度| 色综合婷婷久久| 亚洲曰韩产成在线| 欧美酷刑日本凌虐凌虐| 亚洲chinese男男1069| 欧美人牲a欧美精品| 麻豆国产精品一区二区三区| 欧美成人国产一区二区| 国产伦精品一区二区三区免费| 久久久影视传媒| 不卡的av中国片| 亚洲精品成a人| 5858s免费视频成人| 捆绑紧缚一区二区三区视频| 精品1区2区在线观看| 粉嫩一区二区三区在线看| 亚洲欧洲精品一区二区精品久久久| www.av亚洲| 午夜精品福利视频网站| 日韩视频一区二区三区在线播放 | 亚洲二区视频在线| 日韩美女主播在线视频一区二区三区 | 中文字幕免费不卡| av在线播放一区二区三区| 亚洲欧美国产三级| 4hu四虎永久在线影院成人| 国内精品伊人久久久久av一坑 | 日韩欧美综合一区| 顶级嫩模精品视频在线看| 亚洲另类色综合网站| 日韩一级片网站| 成人av在线影院| 视频一区二区不卡| 久久精品亚洲精品国产欧美kt∨| 91在线免费播放| 热久久一区二区| 国产精品无人区| 欧美精品 日韩| 成人免费观看男女羞羞视频| 亚洲午夜久久久久久久久电影网 | 又紧又大又爽精品一区二区| 日韩一级免费一区| 91丨国产丨九色丨pron| 蜜臀91精品一区二区三区| 国产精品久久夜| 日韩一级大片在线观看| 91丨九色丨黑人外教| 美女视频黄免费的久久| 亚洲裸体在线观看| 久久综合色播五月| 欧美视频一区二区三区在线观看| 国产一区二区精品久久91| 亚洲午夜影视影院在线观看| 久久久噜噜噜久噜久久综合| 欧美男生操女生| 99精品热视频| 国产麻豆欧美日韩一区|