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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? canopdriver.c

?? 開放源碼的CanOpen源碼(C)
?? C
?? 第 1 頁 / 共 4 頁
字號:
         ErrorReport(ERROR_SYNC_TIME_OUT, SYNCtimeCopy);
   }
      
}

/*******************************************************************************
   Process CANopen from main function (non blocking function)
*******************************************************************************/
//defines for using timers in main() (timers are immune on overflow)
   #define TMR16Z(ttimerVariable)   ttimerVariable = Timer16TempValue   //time value set to 0
   #define TMR16(ttimerVariable)   (Timer16TempValue - ttimerVariable)  //read time value
   #define TMR8Z(ttimerVariable)    ttimerVariable = Timer8TempValue    //time value set to 0
   #define TMR8(ttimerVariable)    (Timer8TempValue - ttimerVariable)   //read time value
   
//functions for using in main
void CO_SDOresponse(unsigned char cmd, unsigned long Data){
   CO_SDOTXdata[0] = cmd;
   CO_SDOTXdata[1] = CO_SDORXdata[1];
   CO_SDOTXdata[2] = CO_SDORXdata[2];
   CO_SDOTXdata[3] = CO_SDORXdata[3];
   CO_SDOTXdata[4] = BYTE0(Data);
   CO_SDOTXdata[5] = BYTE1(Data);
   CO_SDOTXdata[6] = BYTE2(Data);
   CO_SDOTXdata[7] = BYTE3(Data);
   CO_CanSendOther(CO_NO_USR_CAN_BUFF);
}
   
void CO_ProcessMain(void){
   static unsigned char i;
   //timers (see "def.h")
   unsigned int Timer16TempValue;   //1ms interval, 65536 ms
   unsigned char Timer8TempValue;   //4ms interval, 1024 ms
   
   //Status leds
   static unsigned char tLEDflicker = 0, tLEDblink = 0;
   static unsigned int tLEDflash = 0;
   static char LEDflashState = 0;
   
   //Heartbeat producer
   static unsigned int tProducerHeartbeatTime = 0;

   //EEPROM
   static unsigned char EEPROM_index = 0;
      
   //set timer 1ms temporary variables
   INTCONbits.GIEL = 0;
   Timer16TempValue = CO_Timer16Value;       //1ms, max duration 65,535 sec
   INTCONbits.GIEL = 1;
   Timer8TempValue = Timer16TempValue >> 2;  //4ms, max duration 1,023 sec

/* Reset communication ********************************************************/
   if(CO_IsrHighSignal.ResetComm){
      INTCONbits.GIEH = 0;
      CO_InitResetComm();
      INTCONbits.GIEH = 1;
   }
      
/* Error handling and Emergency message sending *******************************/
   //check errors from IsrHigh
   if(CO_IsrHighSignal.Error.byte){
      if(CO_IsrHighSignal.Error.bits.NMTlength){ErrorReport(ERROR_CO_RXMSG_NMTlength, 0); CO_IsrHighSignal.Error.bits.NMTlength = 0;}
      if(CO_IsrHighSignal.Error.bits.NMTcmd){ErrorReport(ERROR_CO_RXMSG_NMTcmd, 0); CO_IsrHighSignal.Error.bits.NMTcmd = 0;}
      if(CO_IsrHighSignal.Error.bits.HeartBeatLength){ErrorReport(ERROR_CO_RXMSG_HeartBeatLength, 0); CO_IsrHighSignal.Error.bits.HeartBeatLength = 0;}
      if(CO_IsrHighSignal.Error.bits.SyncLength){ErrorReport(ERROR_CO_RXMSG_SyncLength, 0); CO_IsrHighSignal.Error.bits.SyncLength = 0;}
      if(CO_IsrHighSignal.Error.bits.SDOlength){ErrorReport(ERROR_CO_RXMSG_SDOlength, 0); CO_IsrHighSignal.Error.bits.SDOlength = 0;}
      if(CO_IsrHighSignal.Error.bits.PDOlength){ErrorReport(ERROR_CO_RXMSG_PDOlength, 0); CO_IsrHighSignal.Error.bits.PDOlength = 0;}
   }

   //check if errors are gone
//   if((ERROR_BIT_READ(ERROR_CAN_TX_BUS_OFF)) && !COMSTATbits.TXBO) 
//      ErrorReset(ERROR_CAN_TX_BUS_OFF, COMSTAT);
   if((ERROR_BIT_READ(ERROR_CAN_TX_BUS_PASSIVE)) && !COMSTATbits.TXBP) 
      ErrorReset(ERROR_CAN_TX_BUS_PASSIVE, COMSTAT);
   if((ERROR_BIT_READ(ERROR_CAN_RX_BUS_PASSIVE)) && !COMSTATbits.RXBP) 
      ErrorReset(ERROR_CAN_RX_BUS_PASSIVE, COMSTAT);
   if((ERROR_BIT_READ(ERROR_CAN_BUS_WARNING)) && !(COMSTAT&0x07))   
      ErrorReset(ERROR_CAN_BUS_WARNING, COMSTAT);
   
   //calculate Error register
   if(ErrorControl.CheckErrors){ 
      ErrorControl.CheckErrors = 0;
      //generic error
      if(ERROR_REGISTER_BIT0_CONDITION) ODE_Error_Register |= 0x01; 
      else                              ODE_Error_Register &= 0xFE;
      //communication error (overrun, error state)
      if(ERROR_REGISTER_BIT4_CONDITION) ODE_Error_Register |= 0x10; 
      else                              ODE_Error_Register &= 0xEF;
      //device profile specific error
      if(ERROR_REGISTER_BIT5_CONDITION) ODE_Error_Register |= 0x20; 
      else                              ODE_Error_Register &= 0xDF;
      //manufacturer specific error
      if(ERROR_REGISTER_BIT7_CONDITION) ODE_Error_Register |= 0x80; 
      else                              ODE_Error_Register &= 0x7F;

      //send emergency message
      if(CO_NMToperatingState==NMT_PRE_OPERATIONAL || CO_NMToperatingState==NMT_OPERATIONAL){
         static unsigned int tInhibitEmergency = 0;
         //is new emergency, buffer free and no inhibit?
         if(ErrorControl.EmergencyToSend && !(CO_TXCAN_SEMsendReq&2) && 
           (TMR16(tInhibitEmergency) > (ODE_Inhibit_Time_Emergency/10))){
            CO_EmergencyTXdata[0] = ErrorControl.EmergencyErrorCode & 0xFF;
            CO_EmergencyTXdata[1] = ErrorControl.EmergencyErrorCode >> 8;
            CO_EmergencyTXdata[2] = ODE_Error_Register;
            CO_EmergencyTXdata[3] = ErrorControl.CodeVal;
            CO_EmergencyTXdata[4] = ERROR_EMERGENCY_BYTE5;
            CO_EmergencyTXdata[5] = ERROR_EMERGENCY_BYTE6;
            CO_EmergencyTXdata[6] = ERROR_EMERGENCY_BYTE7;
            CO_EmergencyTXdata[7] = ERROR_EMERGENCY_BYTE8;
            CO_TXCAN_SEMsendReq |= 2;
            PIE3bits.TXB2IE = 1; //inform ISR
            ErrorControl.EmergencyToSend = 0;
            TMR16Z(tInhibitEmergency);
            //write to history
            #if CO_NO_ERROR_FIELD > 0
               if(ODE_Pre_Defined_Error_Field_NoOfErrors < CO_NO_ERROR_FIELD)
                  ODE_Pre_Defined_Error_Field_NoOfErrors++;
               for(i=ODE_Pre_Defined_Error_Field_NoOfErrors-1; i>0; i--)
                  ODE_Pre_Defined_Error_Field[i] = ODE_Pre_Defined_Error_Field[i-1];
               ODE_Pre_Defined_Error_Field[0] = ErrorControl.EmergencyErrorCode;
            #endif
         }
      }
   }

   //in case of error enter pre-operational state
   if(ODE_Error_Register && (CO_NMToperatingState == NMT_OPERATIONAL))
      CO_NMToperatingState = NMT_PRE_OPERATIONAL;
      

/* SDO handling ***************************************************************/
   //SDO download means, that SDO client wants to WRITE to object dictionary of SDO server (this node)
   //SDO upload means, that SDO client wants to READ from object dictionary
   //supported is only expedited transfer, that means max 4byte size of OD entry is possible
   if(CO_SDOrequest){
      unsigned int ii;
      rom CO_objectDictionaryEntry* pODE = &CO_OD[0]; //pointer to selected object dictionary entry
      PCB_BANDWIDTH_IsrLow(1);PCB_BANDWIDTH_IsrLow(1);//find pointer
      for(ii=0; ii<CO_OD_NoOfElements; ii++){
         if(CO_SDORXdata[2] == ((pODE->index)>>8) && CO_SDORXdata[1] == ((pODE->index)&0xff) && 
            CO_SDORXdata[3] == pODE->subindex) break;
         pODE++;
      }
      if(ii == CO_OD_NoOfElements)   //object does not exist in OD
         CO_SDOresponse(0x80, 0x06020000);
      else if(pODE->length > 4)  //length of ODE is not valid
         CO_SDOresponse(0x80, 0x06040047);   //general internal incompatibility in the device
      else{
         switch(CO_SDORXdata[0]>>5){  //check CCS
            case 1:   //Initiate SDO Download - request (only expedited transfer)
               if((CO_SDORXdata[0] & 0x03) != 0x03) 
                  CO_SDOresponse(0x80, 0x06010000);   //unsupported access to an object
               else if((4 - ((CO_SDORXdata[0]>>2)&0x03)) != pODE->length) 
                  CO_SDOresponse(0x80, 0x06070010);   //Length of service parameter does not match
               else if(pODE->attribute == ATTR_RO || pODE->attribute == ATTR_CO) 
                  CO_SDOresponse(0x80, 0x06010002);   //attempt to write a read-only object
               else{
                  if(pODE->pData>=0x1000){
                     #ifdef CO_ALLOW_FLASH_WRITE
                        INTCONbits.GIEH = 0;
                        //following function takes ~32 miliseconds
                        memcpyram2flash((rom void*)(pODE->pData), (void*)&CO_SDORXdata[4], pODE->length);
                        INTCONbits.GIEH = 1;
                        CO_SDOresponse(0x60, 0L);
                     #else
                        CO_SDOresponse(0x80, 0x06010002);   //attempt to write a read-only object
                     #endif
                  }
                  else{ 
                     memcpy((void*)(pODE->pData), (void*)&CO_SDORXdata[4], pODE->length);
                     CO_SDOresponse(0x60, 0L);
                     }
               }
               break;
               
            case 2:   //Initiate SDO Upload - request (only expedited transfer)
               if(pODE->attribute == ATTR_WO) 
                  CO_SDOresponse(0x80, 0x06010001);   //attempt to read a write-only object
               else
                  CO_SDOresponse(0x43 | ((4-pODE->length) << 2), 
                     (pODE->pData>=0x1000) ? *((rom unsigned long*)(pODE->pData)) : *((unsigned long*)(pODE->pData)));
               break;
               
            case 4:   //Abort SDO transfer
               break;
            default:
               CO_SDOresponse(0x80, 0x05040001); //send abort, command specifier not valid
         }
      }
      CO_SDOrequest = 0;
   }
      
/* Heartbeat producer message *************************************************/
   //Sent only if not in TX passive, bootup send always
      if((ODE_Producer_Heartbeat_Time && (TMR16(tProducerHeartbeatTime) >= ODE_Producer_Heartbeat_Time))
          || CO_NMToperatingState == NMT_INTIALIZING){
      TMR16Z(tProducerHeartbeatTime);
      CO_CanSendOther(CO_NO_USR_CAN_BUFF+1);
      if(CO_NMToperatingState == NMT_INTIALIZING){
         if((ODE_NMT_Startup & 0x04) == 0) CO_NMToperatingState = NMT_OPERATIONAL;
         else                              CO_NMToperatingState = NMT_PRE_OPERATIONAL;
      }
   }

/* Heartbeat consumer message handling ****************************************/
   //DS 301: "Monitoring starts after the reception of the first heartBeat. (Not bootup)"
  #if CO_NO_CONS_HEARTBEAT > 0
   for(i=0; i<CO_NO_CONS_HEARTBEAT; i++){
      if((unsigned int)ODE_Consumer_Heartbeat_Time[i]){
         if(CO_HBcons_NMTstate[i]){//Monitoring starts after the reception of the first heartbeat
            unsigned int tTemp;
            INTCONbits.GIEH = 0;
            Timer16TempValue = CO_Timer16Value;  //variable must be updated
            tTemp = CO_HBcons_TimerValue[i];
            INTCONbits.GIEH = 1;
            if(TMR16(tTemp) > (unsigned int)ODE_Consumer_Heartbeat_Time[i]){
               ErrorReport(ERROR_HEARTBEAT_CONSUMER, 0);
               CO_HBcons_NMTstate[i] = NMT_INTIALIZING;
            }
         }
      }
   }
  #endif

/* Status LEDs ****************************************************************/
   //10Hz
   if(TMR8(tLEDflicker) >= 25) TMR8Z(tLEDflicker);
   if(TMR8(tLEDflicker) < 12) CO_StatusLED.Flickering = 0; else CO_StatusLED.Flickering = 1;
   
   //2.5Hz
   if(TMR8(tLEDblink) >= 100) TMR8Z(tLEDblink);
   if(TMR8(tLEDblink) < 50) CO_StatusLED.Blinking = 0; else CO_StatusLED.Blinking = 1;
   
   //flashes
   switch(LEDflashState){
      case 0: if(TMR16(tLEDflash) < 200) break;
         LEDflashState++;
         CO_StatusLED.SingleFlash = CO_StatusLED.DoubleFlash = CO_StatusLED.TripleFlash = 1;
      case 1: if(TMR16(tLEDflash) < 400) break;
         LEDflashState++;
         CO_StatusLED.SingleFlash = CO_StatusLED.DoubleFlash = CO_StatusLED.TripleFlash = 0;
      case 2: if(TMR16(tLEDflash) < 600) break;
         LEDflashState++;
         CO_StatusLED.DoubleFlash = CO_StatusLED.TripleFlash = 1;
      case 3: if(TMR16(tLEDflash) < 800) break;
         LEDflashState++;
         CO_StatusLED.DoubleFlash = CO_StatusLED.TripleFlash = 0;
      case 4: if(TMR16(tLEDflash) < 1000) break;
         LEDflashState++;
         CO_StatusLED.TripleFlash = 1;
      case 5: if(TMR16(tLEDflash) < 1200) break;
         LEDflashState++;
         CO_StatusLED.TripleFlash = 0;
      case 6: if(TMR16(tLEDflash) < 2000) break;
         LEDflashState = 0;
         TMR16Z(tLEDflash);
      }
   
   //green RUN LED (DR 303-3)
   switch(CO_NMToperatingState){
      case NMT_STOPPED:
         PCB_RUN_LED(CO_StatusLED.SingleFlash);
         break;
      case NMT_PRE_OPERATIONAL:
         PCB_RUN_LED(CO_StatusLED.Blinking);
         break;
      case NMT_OPERATIONAL:
         PCB_RUN_LED(CO_StatusLED.On);
         break;
   }
          
   //red ERROR LED (DR 303-3)
   if(ERROR_BIT_READ(ERROR_CAN_TX_BUS_OFF))           PCB_ERROR_LED(CO_StatusLED.On); 
   else if(ERROR_BIT_READ(ERROR_SYNC_TIME_OUT))       PCB_ERROR_LED(CO_StatusLED.TripleFlash);
   else if(ERROR_BIT_READ(ERROR_HEARTBEAT_CONSUMER))  PCB_ERROR_LED(CO_StatusLED.DoubleFlash);
   else if( ERROR_BIT_READ(ERROR_CAN_TX_BUS_PASSIVE)  
         || ERROR_BIT_READ(ERROR_CAN_RX_BUS_PASSIVE)
         || ERROR_BIT_READ(ERROR_CAN_BUS_WARNING))    PCB_ERROR_LED(CO_StatusLED.SingleFlash);
   else if(ODE_Error_Register)                        PCB_ERROR_LED(CO_StatusLED.Blinking);//not in CiA standard
   else                                               PCB_ERROR_LED(CO_StatusLED.Off);
   
/* Update EEPROM **************************************************************/
   //update one byte at a cycle
   #ifdef CO_USE_EEPROM
      if(EECON1bits.WR == 0){ //write is not in progress
         if(EEPROM_index == 0) EEPROM_index = sizeof(ODE_EEPROM);
         EEPROM_index--;
         i = *((unsigned char*)&ODE_EEPROM + EEPROM_index); 
         //read eeprom
         EEADR = EEPROM_index;
         EECON1bits.EEPGD = 0;
         EECON1bits.CFGS = 0;
         EECON1bits.RD = 1;
         if(EEDATA != i){
            //write to EEPROM
            EEDATA = i;
            EECON1bits.WREN = 1;
            INTCONbits.GIEH = 0;
            EECON2 = 0x55;
            EECON2 = 0xAA;
            EECON1bits.WR = 1;
            INTCONbits.GIEH = 1;
            EECON1bits.WREN = 0;
         }
      }
   #endif
   
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲婷婷免费| 国产精品美女久久久久aⅴ| 亚洲日本乱码在线观看| 99精品视频在线播放观看| 一区二区三区不卡视频在线观看| 欧美日韩一区二区三区在线| 国模冰冰炮一区二区| 国产精品久久久久影院亚瑟| 欧美卡1卡2卡| 成人自拍视频在线观看| 婷婷久久综合九色国产成人| 国产精品美女久久久久av爽李琼 | 91在线免费看| 色综合中文字幕| 日本亚洲电影天堂| 亚洲精品国产无套在线观| 欧美大片在线观看一区二区| 色综合亚洲欧洲| 日本精品一区二区三区高清 | 极品美女销魂一区二区三区| 亚洲天堂成人在线观看| 国产精品亲子乱子伦xxxx裸| 一区二区三区影院| 毛片一区二区三区| 视频一区国产视频| 亚洲欧美国产三级| 中文成人av在线| 一区二区在线电影| 全国精品久久少妇| 欧美aⅴ一区二区三区视频| 狠狠色狠狠色综合| 97久久精品人人做人人爽50路| 色拍拍在线精品视频8848| 国产成人精品免费在线| 精品中文av资源站在线观看| 成人综合婷婷国产精品久久蜜臀| 日本久久电影网| 久久这里只有精品视频网| 777a∨成人精品桃花网| 色哟哟一区二区在线观看| 欧美精品 日韩| 国产日韩一级二级三级| 久久亚洲精华国产精华液| 亚洲黄色录像片| 麻豆精品视频在线观看视频| 色欧美88888久久久久久影院| 日韩欧美一区二区视频| 亚洲欧美成人一区二区三区| 久久99精品久久久久久国产越南| 色综合色综合色综合色综合色综合 | 久久午夜老司机| 亚洲永久免费av| 亚洲成精国产精品女| 日本不卡一区二区三区高清视频| 国产.欧美.日韩| 国产精品1区2区3区| 波多野洁衣一区| 91黄视频在线观看| 国产人伦精品一区二区| 久久国产视频网| 成年人午夜久久久| 色综合中文字幕国产 | 天天做天天摸天天爽国产一区| 国产乱码精品一区二区三区五月婷| 欧美日韩免费一区二区三区| 国产欧美日韩亚州综合| 国产真实乱偷精品视频免| 5858s免费视频成人| 一区二区三区高清| 成人午夜电影网站| 久久久影视传媒| 成人免费一区二区三区视频 | 91福利社在线观看| 亚洲图片激情小说| 成人国产精品免费| 国产拍欧美日韩视频二区| 久久99蜜桃精品| 日韩一区二区视频| 中文字幕日韩av资源站| 国产成人精品免费看| 国产日韩v精品一区二区| 久久99热狠狠色一区二区| 精品久久久久一区二区国产| 亚洲欧美怡红院| 91亚洲精品乱码久久久久久蜜桃| 8x福利精品第一导航| 亚洲va天堂va国产va久| 欧美丝袜丝nylons| 久久嫩草精品久久久久| 久久69国产一区二区蜜臀| 91精品免费观看| 国产最新精品免费| 国产精品久久毛片a| jizz一区二区| 精品剧情v国产在线观看在线| 久久国产精品露脸对白| 26uuu精品一区二区| 国产91对白在线观看九色| 亚洲视频图片小说| 制服丝袜中文字幕一区| 水野朝阳av一区二区三区| 日韩欧美亚洲国产另类| 国产精选一区二区三区| 国产精品初高中害羞小美女文| 色偷偷久久人人79超碰人人澡| 天堂成人免费av电影一区| 日韩视频一区二区三区| 成人综合婷婷国产精品久久免费| 亚洲靠逼com| 日韩你懂的在线播放| 国产91综合网| 性久久久久久久久| 久久网站最新地址| 一本色道**综合亚洲精品蜜桃冫| 蜜桃av噜噜一区二区三区小说| 久久综合国产精品| 欧美午夜精品理论片a级按摩| 久久国产精品72免费观看| 亚洲天堂a在线| 91精品国产品国语在线不卡| 伊人色综合久久天天| 日韩精品一区国产麻豆| 成人高清免费观看| 久久精品噜噜噜成人88aⅴ| 亚洲免费大片在线观看| 精品日韩在线一区| 欧美午夜精品久久久久久孕妇| 黄一区二区三区| 性做久久久久久免费观看| 中文字幕欧美三区| 国产高清在线观看免费不卡| 午夜久久电影网| 亚洲男人都懂的| 国产亚洲欧美一区在线观看| 欧美日韩高清一区二区三区| 天堂va蜜桃一区二区三区 | 亚洲欧美韩国综合色| 久久久久国产成人精品亚洲午夜| 欧美日韩国产在线播放网站| 99精品视频一区二区三区| 国产另类ts人妖一区二区| 水野朝阳av一区二区三区| 一区二区三区中文字幕电影 | 奇米精品一区二区三区四区| 亚洲宅男天堂在线观看无病毒| 亚洲国产精品av| 久久精品一区八戒影视| 26uuu国产日韩综合| 91精品麻豆日日躁夜夜躁| 欧美狂野另类xxxxoooo| 欧美色窝79yyyycom| 色狠狠色狠狠综合| 色悠久久久久综合欧美99| 99re这里只有精品视频首页| 成人动漫中文字幕| 国产高清不卡一区| 国产成人免费在线视频| 国产精一品亚洲二区在线视频| 国产在线精品一区二区不卡了| 自拍偷拍国产亚洲| 亚洲欧美日韩在线不卡| 亚洲情趣在线观看| 一二三四社区欧美黄| 香蕉影视欧美成人| 日韩精品一区第一页| 免费在线观看一区| 国产制服丝袜一区| 丁香婷婷综合激情五月色| 成人午夜激情影院| 91久久精品网| 欧美乱熟臀69xxxxxx| 欧美va亚洲va在线观看蝴蝶网| 日韩精品一区二区在线观看| 国产日产精品一区| 中文字幕一区二区三中文字幕| 亚洲视频一二三区| 天堂va蜜桃一区二区三区漫画版| 美女国产一区二区| 成人动漫一区二区| 在线免费亚洲电影| 色香蕉成人二区免费| 欧美一区二区三区四区五区| 亚洲精品在线网站| 91精品国产欧美一区二区18| 精品久久人人做人人爰| 亚洲欧洲精品一区二区精品久久久 | 国产午夜亚洲精品羞羞网站| 欧美私人免费视频| 欧美乱妇15p| 久久久久国色av免费看影院| 18涩涩午夜精品.www| 免费看日韩精品| 99riav久久精品riav| 欧美一级日韩不卡播放免费| 欧美激情一区二区三区不卡 | 日本电影欧美片| 日韩女同互慰一区二区| 亚洲日本va在线观看| 极品少妇xxxx精品少妇偷拍| 91免费小视频|