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

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

?? 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;
   

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区激情视频| 亚洲欧美偷拍卡通变态| 欧美中文字幕一区| 91天堂素人约啪| 色综合网色综合| 99国产精品久久久久久久久久久| 成人高清免费观看| av一区二区久久| 99re这里都是精品| 色综合久久九月婷婷色综合| 99久久99久久精品免费观看| 色婷婷久久99综合精品jk白丝| 91蝌蚪porny九色| 欧美日韩综合不卡| 91精品国产色综合久久不卡蜜臀 | 日本亚洲电影天堂| 日韩中文欧美在线| 国产一区二区三区久久悠悠色av| 国产原创一区二区| 国产成人精品免费视频网站| 99精品久久久久久| 欧美专区亚洲专区| 538prom精品视频线放| 欧美成人a∨高清免费观看| 久久影音资源网| 亚洲欧洲性图库| 午夜精品视频一区| 国产一区中文字幕| 色噜噜狠狠成人中文综合| 欧美色倩网站大全免费| 精品久久五月天| 亚洲天堂精品视频| 日本午夜一区二区| 国产九九视频一区二区三区| 99精品热视频| 欧美xxx久久| 中文字幕一区av| 另类调教123区| 99国内精品久久| 国产三区在线成人av| 亚洲男人的天堂在线观看| 日韩在线一区二区三区| av影院午夜一区| 日韩欧美美女一区二区三区| 中文字幕日韩一区二区| 久久成人精品无人区| 欧美综合久久久| 久久综合九色综合欧美亚洲| 亚洲老妇xxxxxx| 国产精品一区在线| 91精品国产91热久久久做人人 | 亚洲午夜激情网页| 国产成人欧美日韩在线电影 | 视频一区视频二区中文| proumb性欧美在线观看| 欧美mv和日韩mv的网站| 一区二区理论电影在线观看| 国精产品一区一区三区mba视频| 欧洲av一区二区嗯嗯嗯啊| 日本一区二区三区国色天香| 蜜桃av噜噜一区| 欧美剧情电影在线观看完整版免费励志电影 | 一区二区三区加勒比av| 国产精品自在欧美一区| 欧美日韩精品一区二区三区| 亚洲女人****多毛耸耸8| 粉嫩嫩av羞羞动漫久久久| 国产欧美一区二区精品性色| 捆绑变态av一区二区三区| 91超碰这里只有精品国产| 中文字幕va一区二区三区| 黑人巨大精品欧美黑白配亚洲| 91精品国产综合久久精品app| 亚洲精品国产精品乱码不99| 91丨九色丨尤物| 成人免费小视频| 色久优优欧美色久优优| 亚洲欧洲一区二区三区| 91丨九色丨国产丨porny| 国产精品欧美一区二区三区| 国产成人精品亚洲777人妖| 国产日韩精品久久久| 成人午夜碰碰视频| 18欧美乱大交hd1984| 91在线视频官网| 亚洲特级片在线| 欧美色成人综合| 午夜av区久久| 精品久久久久久久人人人人传媒 | 欧美激情一区二区三区蜜桃视频 | 亚洲男人都懂的| voyeur盗摄精品| 亚洲欧美日韩久久| 精品视频1区2区| 另类成人小视频在线| 久久免费的精品国产v∧| 国产不卡高清在线观看视频| 久久久精品免费网站| caoporn国产精品| 亚洲自拍欧美精品| 91精品国产一区二区三区蜜臀 | 欧美韩国日本不卡| 99精品久久久久久| 亚洲成人一区二区在线观看| 日韩亚洲欧美高清| 国产999精品久久| 亚洲综合男人的天堂| 欧美一区二区三区不卡| 成人在线综合网| 亚洲第一精品在线| 2019国产精品| 欧美性猛片xxxx免费看久爱| 久久99九九99精品| 亚洲特级片在线| 26uuu亚洲综合色欧美| 91蜜桃网址入口| 九九国产精品视频| 亚洲美女视频一区| 精品盗摄一区二区三区| 在线日韩一区二区| 国产精品69久久久久水密桃| 亚洲自拍偷拍欧美| 国产日韩欧美精品综合| 欧美顶级少妇做爰| 成人av网站大全| 久久99蜜桃精品| 婷婷国产v国产偷v亚洲高清| 中文字幕第一区综合| 91精品国产91热久久久做人人| 成人精品小蝌蚪| 国内偷窥港台综合视频在线播放| 亚洲美女视频在线观看| 欧美国产日韩一二三区| 日韩视频在线你懂得| 欧美亚洲一区二区在线| 成人丝袜高跟foot| 美国毛片一区二区| 亚洲一区二区三区四区五区黄| 国产精品日产欧美久久久久| 日韩欧美国产一区二区在线播放 | 国产亚洲女人久久久久毛片| 欧美偷拍一区二区| 91久久精品一区二区| 在线日韩一区二区| 成人av小说网| 国产aⅴ综合色| 国内精品国产成人| 激情六月婷婷综合| 美女视频黄 久久| 日韩国产精品久久久久久亚洲| 一区二区三区成人在线视频| 欧美激情在线观看视频免费| 久久久蜜臀国产一区二区| 精品久久久久久久久久久久久久久 | 欧美日韩视频不卡| 91久久人澡人人添人人爽欧美| 99久久综合国产精品| 国产mv日韩mv欧美| av色综合久久天堂av综合| 成人午夜电影小说| 91在线观看美女| 在线观看国产日韩| 欧洲国内综合视频| 91精品国产品国语在线不卡 | 另类欧美日韩国产在线| 日精品一区二区| 美女看a上一区| 极品美女销魂一区二区三区| 久久国产婷婷国产香蕉| 久久97超碰色| 成熟亚洲日本毛茸茸凸凹| 成人午夜电影网站| 色呦呦国产精品| 欧美日本免费一区二区三区| 日韩视频中午一区| 国产午夜精品在线观看| 国产精品欧美综合在线| 亚洲一区视频在线观看视频| 美女网站色91| 成人国产精品免费| 欧美日韩中文字幕一区二区| 欧美一区二区啪啪| 国产精品三级久久久久三级| 日本不卡高清视频| 老司机精品视频导航| 成人黄色小视频| 欧美军同video69gay| 久久精品一区二区| 亚洲激情综合网| 精品一区二区在线视频| 99久久综合精品| 精品久久人人做人人爽| 日韩码欧中文字| 久久精品72免费观看| 一本色道久久加勒比精品| 日韩欧美美女一区二区三区| 亚洲欧美日韩在线播放| 久久疯狂做爰流白浆xx| 色偷偷88欧美精品久久久| xf在线a精品一区二区视频网站|