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

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

?? canopdriver.c

?? 開放源碼的CanOpen源碼(C)
?? C
?? 第 1 頁 / 共 4 頁
字號:
/*******************************************************************************

    CANopDriver.c - Functions for CANopenNode
    
    Copyright (C) 2004  Janez Paternoster, Slovenia

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


    Author: janez.paternoster@siol.net

    History:
    2004/06/25 [JP]  File Created
    2004/08/09 [JP]  Revised, many changes (interrupt and init routines), added setup 'defines'

*******************************************************************************/

#include <p18cxxx.h>  
#include <string.h>

#include "CANopDriver.h"
#include "CANopErrors.h"
#ifdef CO_ALLOW_FLASH_WRITE
   #include "memcpyram2flash.h"
#endif

//following is not real header file, because it contains variable definitions,
//it may be included only at this point
#include "CANopObjDict.h"


/*******************************************************************************
   Variables used in CANopen
*******************************************************************************/
//CANopen nodeID
   unsigned char CO_NodeID = CO_DEFAULT_NODE_ID;
   
//CANopen Bit rate
   unsigned char CO_BitRate = CO_DEFAULT_BIT_RATE;
   
//timer variable increments every 1ms
   volatile unsigned int CO_Timer16Value;
   
//NMT operating state of node
   volatile unsigned char CO_NMToperatingState;

//Variables used in High Interrupt
#pragma udata access CO_udata_access
   near unsigned char CO_IsrHighIndex;          //index of matched CANid
   near unsigned char CO_IsrHighRxNoOfBytes;    //number of bytes in recived message
   near volatile struct{                        //signals from IsrHigh to IsrLow or ProcessMain
      unsigned char ResetComm    :1;
      union{
         unsigned char byte;
         struct{
            unsigned char NMTlength         :1;
            unsigned char NMTcmd            :1;
            unsigned char HeartBeatLength   :1;
            unsigned char SyncLength        :1;
            unsigned char SDOlength         :1;
            unsigned char PDOlength         :1;
         }bits;
      }Error;
   }CO_IsrHighSignal;
#pragma udata

//SDOs
   unsigned char CO_SDOrequest;        //0=ready for new communication, 1=busy, 0xFF=abort
   unsigned char CO_SDORXdata[8];      //data arrived from bus 
   unsigned char CO_SDOTXdata[8];      //data transmitted to bus 
       
//PDOs
#pragma udata CO_udata=0x100  //some variables are in separate section to avoid section overflow
  #define CO_SIZE_OF_RPDO_DATA    8    //value must match size of one CO_RPDO member   !!!
  #if CO_NO_RPDO > 0
   volatile tData8bytes CO_RPDO[CO_NO_RPDO];         //Data
   volatile unsigned char CO_RPDOlength[CO_NO_RPDO]; //length of recive PDOs in bytes, calculated from mapping parameters
   volatile unsigned char CO_RPDOcount[CO_NO_RPDO];  //counter of recived PDOs, incremented each time PDO is recived, may be erased
  #endif
  #if CO_NO_TPDO > 0
   volatile tData8bytes CO_TPDO[CO_NO_TPDO];         //Data
   volatile unsigned char CO_TPDOlength[CO_NO_TPDO]; //length of transmit PDOs in bytes, calculated from mapping parameters
   volatile unsigned char CO_tTPDOwait[CO_NO_TPDO];  //timer used for trigger PDO sending
  #endif

#pragma udata

//Sync
   volatile struct{
      unsigned int period;
      unsigned int periodTimeout;
      unsigned int window;
   }CO_SYNC;
   
//HeartBeat Consumer
  #if CO_NO_CONS_HEARTBEAT > 0
   volatile unsigned int CO_HBcons_TimerValue[CO_NO_CONS_HEARTBEAT];
   volatile unsigned char CO_HBcons_NMTstate[CO_NO_CONS_HEARTBEAT];
  #endif
  
//Emergency message control and Error codes
   volatile struct{
      char CheckErrors     :1;
      char EmergencyToSend :1;
      unsigned int EmergencyErrorCode;
      unsigned char CodeVal;
   }ErrorControl;
   rom unsigned int ErrorCodesTable[] = ERROR_CODES;
   unsigned char CO_EmergencyTXdata[8];      //data transmitted to bus 
   
   
//Status LEDs
   struct {
      unsigned char On          :1;
      unsigned char Off         :1;
      unsigned char Flickering  :1;
      unsigned char Blinking    :1;
      unsigned char SingleFlash :1;
      unsigned char DoubleFlash :1;
      unsigned char TripleFlash :1;
   } CO_StatusLED;
   
//variable for reciving CAN messages
   unsigned int CO_RXCAN_ID[3+CO_NO_RPDO+CO_NO_CONS_HEARTBEAT];
      //filled at CanInit, IDs are << 5 to match the RXBnSIDx register bit order: 
      //   0=NMT ID, 1=SYNC ID, 2=SDO ID,
      //   3...(2+CO_NO_RPDO)=RPDO ID, 
      //   (3+CO_NO_RPDO)...(2+CO_NO_RPDO+CO_NO_CONS_HEARTBEAT)=Heartbeat consumer ID

//variables for transmitting CAN messages
   //filled at CanInit, IDs are << 5 to match the RXBnSIDx register bit order: 
   //PDOs through Hardware transmit buffer 0, interrupt driven
   #if CO_NO_TPDO > 0
      unsigned char CO_TXCAN_PDOsendReq;   //flag variable for request sending message
      CO_CanMessage CO_TXCAN_PDOmsgs[CO_NO_TPDO];
   #endif
   
   //Emergencies, SDOs, Heartbeats and User defined msgs through Hardware transmit buffer 1, interrupt driven
   unsigned char CO_TXCAN_OtherSendReq;   //flag variable for request sending message
   CO_CanMessage CO_TXCAN_OtherMsgs[CO_NO_USR_CAN_BUFF+2];
      //   0...(CO_NO_USR_CAN_BUFF-1)=User defined messages, 
      //   (CO_NO_USR_CAN_BUFF)=SDO, (CO_NO_USR_CAN_BUFF+1)=HeartBeat
   #if(CO_NO_USR_CAN_BUFF+2) > 8
      #error define_CO_NO_USR_CAN_BUFF CO_NO_USR_CAN_BUFF too big
   #endif

   //SYNCs and Emergency through Hardware transmit buffer 2, interrupt driven
   unsigned char CO_TXCAN_SEMsendReq;   //flag variable for request sending message
   CO_CanMessage CO_TXCAN_SEMmsgs[2];


   
/*******************************************************************************
   CAN bit rates and Timer2 setup
*******************************************************************************/
#if CO_OSCILATOR_FREQ == 16
   #define TIMER2PRESCALE     0     //0=1:1, 1=1:4, 2=1:16
   #define TIMER2POSTSCALE    16    //1...16
   #define TIMER2PR2          249   //0...255
#elif CO_OSCILATOR_FREQ == 20
   #define TIMER2PRESCALE     1     //0=1:1, 1=1:4, 2=1:16
   #define TIMER2POSTSCALE    10    //1...16
   #define TIMER2PR2          124   //0...255
#elif CO_OSCILATOR_FREQ == 32
   #define TIMER2PRESCALE     1     //0=1:1, 1=1:4, 2=1:16
   #define TIMER2POSTSCALE    16    //1...16
   #define TIMER2PR2          124   //0...255
#elif CO_OSCILATOR_FREQ == 40
   #define TIMER2PRESCALE     1     //0=1:1, 1=1:4, 2=1:16
   #define TIMER2POSTSCALE    10    //1...16
   #define TIMER2PR2          249   //0...255
#else
   #error define_CO_OSCILATOR_FREQ CO_OSCILATOR_FREQ not supported
#endif

rom struct{    
   UNSIGNED8  BRP;         //(1...64) Baud Rate Prescaler 
   UNSIGNED8  SJW;         //(1...4) SJW time
   UNSIGNED8  PROP;        //(1...8) PROP time
   UNSIGNED8  PhSeg1;      //(1...8) Phase Segment 1 time
   UNSIGNED8  PhSeg2;      //(1...8) Phase Segment 2 time
}CO_BitRateData[8] = 
#if CO_OSCILATOR_FREQ == 16
   {50,  1, 4, 8, 3, //CAN=10kbps
    25,  1, 4, 8, 3, //CAN=20kbps
    10,  1, 4, 8, 3, //CAN=50kbps
    4,   1, 4, 8, 3, //CAN=125kbps
    2,   1, 4, 8, 3, //CAN=250kbps
    1,   1, 4, 8, 3, //CAN=500kbps
    1,   1, 2, 4, 3, //CAN=800kbps
    1,   1, 2, 3, 2};//CAN=1000kbps
#elif CO_OSCILATOR_FREQ == 20
   {50,  1, 6, 8, 5, //CAN=10kbps
    25,  1, 6, 8, 5, //CAN=20kbps
    10,  1, 6, 8, 5, //CAN=50kbps
    5,   1, 4, 8, 3, //CAN=125kbps
    2,   1, 6, 8, 5, //CAN=250kbps
    1,   1, 6, 8, 5, //CAN=500kbps
    1,   1, 3, 5, 3, //CAN=800kbps     //combination does not work
    1,   1, 2, 4, 3};//CAN=1000kbps
#elif CO_OSCILATOR_FREQ == 32
   {64,  1, 8, 8, 8, //CAN=10kbps
    50,  1, 4, 8, 3, //CAN=20kbps
    20,  1, 4, 8, 3, //CAN=50kbps
    8,   1, 4, 8, 3, //CAN=125kbps
    4,   1, 4, 8, 3, //CAN=250kbps
    2,   1, 4, 8, 3, //CAN=500kbps
    2,   1, 2, 4, 3, //CAN=800kbps
    2,   1, 2, 3, 2};//CAN=1000kbps
#elif CO_OSCILATOR_FREQ == 40
   {64,  4, 8, 8, 8, //CAN=10kbps      //combination does not work
    50,  1, 6, 8, 5, //CAN=20kbps
    25,  1, 4, 8, 3, //CAN=50kbps
    10,  1, 4, 8, 3, //CAN=125kbps
    5,   1, 4, 8, 3, //CAN=250kbps
    2,   1, 6, 8, 5, //CAN=500kbps
    1,   1, 8, 8, 8, //CAN=800kbps
    2,   1, 2, 4, 3};//CAN=1000kbps
#else
   #error define_CO_OSCILATOR_FREQ CO_OSCILATOR_FREQ not supported
#endif

/*******************************************************************************
   INIT CAN BUS INTERFACE, executed at node reset
*******************************************************************************/
void CO_InitResetNode(void){
   unsigned char i;
/* Init Timer2 ****************************************************************/
   //timer2 is used for 1ms interrupt. It is also time-base for PWM modules.
   //So if PWM is used, frequency is set here.
   T2CON = ((TIMER2POSTSCALE-1) << 3) | 0x04 | TIMER2PRESCALE;
   PR2 = TIMER2PR2;
   TMR2 = 0;
   //interrupts
   PIR1bits.TMR2IF = 0;
   IPR1bits.TMR2IP = 0;   //low priority interrupt
   PIE1bits.TMR2IE = 1;
   
/* Init Printed Board *********************************************************/
   PCB_BANDWIDTH_IsrLow_INIT;
   PCB_BANDWIDTH_IsrHigh_INIT;
   PCB_RUN_LED_INIT;
   PCB_ERROR_LED_INIT; 

/* Read EEPROM ****************************************************************/
   #ifdef CO_USE_EEPROM
      EECON1bits.EEPGD = 0;
      EECON1bits.CFGS = 0;
      i=sizeof(ODE_EEPROM);
      do{
         i--;
         EEADR = i;
         EECON1bits.RD = 1;
         *((unsigned char*)&ODE_EEPROM + i) = EEDATA;
      }while(i>0);
   #endif
   
/* Init variables *************************************************************/
   CO_Timer16Value = 0;
   CO_StatusLED.On = 1;
   CO_StatusLED.Off = 0;
   ODE_EEPROM.PowerOnCounter++;
}
   
/*******************************************************************************
   INIT CAN BUS INTERFACE, executed at communication reset
*******************************************************************************/
void CO_InitResetComm(void){
   static char i;

   PCB_RUN_LED(CO_StatusLED.Off);
   CO_NMToperatingState = NMT_INTIALIZING;

   CANCON = 0x80;       //request configuration mode
   while((CANSTAT & 0xE0) != 0x80); //wait until configuration mode is set 

/* Setup variables ************************************************************/
   CO_NodeID = ReadNodeID();     
   if(CO_NodeID==0 || CO_NodeID>127){
      ErrorReport(ERROR_WrongNodeIDorBitRate, CO_NodeID);
      CO_NodeID = 1;
   }

   CO_BitRate = ReadBitRate();
   if(CO_BitRate > 7){
      ErrorReport(ERROR_WrongNodeIDorBitRate, CO_BitRate);
      CO_BitRate = 1;
   }
      
   CO_IsrHighSignal.ResetComm = 0;
   CO_IsrHighSignal.Error.byte = 0;
   
   //SDOs
   CO_SDOrequest = 0;
   ODE_Server_SDO_Parameter.COB_ID_Client_to_Server = 0x00000600L + CO_NodeID;
   ODE_Server_SDO_Parameter.COB_ID_Server_to_Client = 0x00000580L + CO_NodeID;
   

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线精品一区二区夜色| 亚洲欧美另类久久久精品2019| 午夜亚洲福利老司机| 欧美唯美清纯偷拍| 亚洲v精品v日韩v欧美v专区| 欧美精品一卡二卡| 麻豆国产91在线播放| 久久亚洲二区三区| 成人免费视频国产在线观看| 亚洲色图视频网| 精品1区2区3区| 久久精品国产精品亚洲精品| 中文字幕欧美激情一区| 日本精品一级二级| 免费一级片91| 中文字幕在线观看一区| 欧亚一区二区三区| 毛片av一区二区| 国产精品丝袜黑色高跟| 欧美午夜片在线观看| 韩国三级中文字幕hd久久精品| 中文成人综合网| 欧美亚洲日本国产| 激情六月婷婷久久| 亚洲精品日韩一| 久久综合狠狠综合久久综合88 | 在线精品观看国产| 男女激情视频一区| 久久精品国产亚洲aⅴ| 国产精品久久久一本精品| 在线看国产一区二区| 精品午夜久久福利影院| 亚洲品质自拍视频| 欧美哺乳videos| 在线观看91视频| 国产不卡视频一区二区三区| 一个色妞综合视频在线观看| 久久亚洲精精品中文字幕早川悠里 | 成年人国产精品| 亚洲v中文字幕| 中文字幕一区二区三区乱码在线| 欧美年轻男男videosbes| 国产精品中文字幕欧美| 五月天激情小说综合| 国产精品国产自产拍高清av王其| 欧美老人xxxx18| 成人av电影在线| 激情五月婷婷综合| 同产精品九九九| 怡红院av一区二区三区| 国产日韩欧美一区二区三区综合| 欧美精品v国产精品v日韩精品| 国产91精品一区二区麻豆网站| 日韩黄色片在线观看| 日韩美女啊v在线免费观看| 精品日韩99亚洲| 欧美一区二区福利视频| 欧美中文字幕一区| 9人人澡人人爽人人精品| 国产精品亚洲一区二区三区妖精| 首页亚洲欧美制服丝腿| 亚洲影视在线观看| 亚洲人成伊人成综合网小说| 久久久精品综合| 欧美zozo另类异族| 欧美电影免费观看高清完整版在线 | 日韩欧美一级精品久久| 欧美怡红院视频| 欧洲色大大久久| 色噜噜久久综合| 色婷婷亚洲精品| 一本色道久久加勒比精品| caoporn国产一区二区| 国产iv一区二区三区| 国产毛片精品一区| 国产一区91精品张津瑜| 国产在线精品一区二区三区不卡| 久久精品国产久精国产| 经典三级一区二区| 国产美女av一区二区三区| 国产乱子伦一区二区三区国色天香| 蜜臀av亚洲一区中文字幕| 日韩激情一二三区| 另类调教123区| 国产精品一区二区果冻传媒| 国产精品系列在线播放| 成人av片在线观看| 色婷婷av一区二区三区大白胸 | 亚洲成av人片| 日本美女一区二区三区视频| 免费观看30秒视频久久| 久久99精品国产麻豆婷婷洗澡| 精品一区二区三区影院在线午夜| 精品亚洲欧美一区| 国产精品99久久久久久宅男| www.66久久| 欧美三级视频在线播放| 日韩午夜精品电影| 欧美精彩视频一区二区三区| 1000精品久久久久久久久| 一区二区三区精品在线| 奇米色一区二区| 国产麻豆91精品| 色综合咪咪久久| 91精品国产欧美日韩| 国产亚洲欧美一区在线观看| 亚洲视频免费在线| 三级欧美在线一区| 国产高清成人在线| 色香蕉久久蜜桃| 夜夜操天天操亚洲| 日韩高清在线不卡| 粉嫩aⅴ一区二区三区四区| 91色综合久久久久婷婷| 3atv在线一区二区三区| 国产日产亚洲精品系列| 亚洲一区二区三区自拍| 精品一区二区在线观看| 色综合久久综合网97色综合| 日韩一级片在线播放| 亚洲色图一区二区| 久久成人久久鬼色| 色国产综合视频| 亚洲精品一区二区三区99| 亚洲精品免费在线观看| 国产在线国偷精品产拍免费yy| 一本色道亚洲精品aⅴ| 精品国产乱码久久久久久老虎| 一区在线中文字幕| 久久91精品国产91久久小草| 色婷婷综合久久久久中文| www国产亚洲精品久久麻豆| 一区二区三区免费| 国产精品12区| 欧美一区二区在线播放| 亚洲猫色日本管| 粉嫩13p一区二区三区| 欧美不卡一区二区三区四区| 伊人婷婷欧美激情| 国产99久久久国产精品潘金| 91精品国产综合久久福利软件| 亚洲欧美日韩电影| 国产高清成人在线| 日韩欧美久久久| 日韩精品乱码av一区二区| 91高清视频在线| 亚洲欧洲精品天堂一级 | 亚洲国产中文字幕| 成人精品高清在线| 久久久久国产精品人| 青草国产精品久久久久久| 91黄色免费版| 亚洲乱码日产精品bd| 9色porny自拍视频一区二区| 久久久久久久久久久99999| 蜜臀91精品一区二区三区 | 欧美人与禽zozo性伦| 亚洲天堂2016| 99精品热视频| 综合欧美一区二区三区| 99久久久免费精品国产一区二区| 日本一区二区视频在线观看| 国产成人一级电影| 欧美激情中文字幕一区二区| 国产精品自拍毛片| 国产网站一区二区| 国产大陆a不卡| 欧美激情综合五月色丁香小说| 国产乱码精品1区2区3区| 久久综合色8888| 国产成人啪免费观看软件| 国产日韩欧美精品在线| 国产河南妇女毛片精品久久久| 久久综合av免费| 国产99精品视频| 成人免费一区二区三区在线观看| 成人福利视频网站| 亚洲色欲色欲www| 欧美性生活一区| 日本不卡一二三| 久久色视频免费观看| 粉嫩嫩av羞羞动漫久久久 | 粉嫩av一区二区三区粉嫩| 中文字幕欧美激情一区| 91丨porny丨国产| 亚洲影院免费观看| 欧美一区二区免费视频| 国产一区二区在线免费观看| 中文一区二区在线观看| 日本大香伊一区二区三区| 婷婷激情综合网| 精品国产百合女同互慰| 国产成人免费xxxxxxxx| 亚洲裸体xxx| 欧美一级精品大片| 国产999精品久久久久久| 亚洲你懂的在线视频| 91麻豆精品国产91久久久久久| 精品一二线国产| 一区二区三区日韩在线观看|