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

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

?? mcohwcc01.c

?? 1開放源碼的CanOpen(C)
?? C
字號:
/**************************************************************************
MODULE:    MCOHWCC01
CONTAINS:  Preliminary, limited hardware driver implementation for
           Atmel 89C51CC01 - tested using the Atmel CANopen Demo Board
		   using a 20Mhz clock (CANgine board: www.cangine.com)
           This version was tested with the Keil compiler system.
           www.keil.com
COPYRIGHT: Embedded Systems Academy, Inc. 2002-2003.
           All rights reserved. www.microcanopen.com
           This software was written in accordance to the guidelines at
		   www.esacademy.com/software/softwarestyleguide.pdf
DISCLAIM:  Read and understand our disclaimer before using this code!
           www.esacademy.com/disclaim.htm
LICENSE:   Users that have purchased a license for PCANopenMagic
           (www.esacademy.com/software/pcanopenmagic)
           may use this code in commercial projects.
           Otherwise only educational use is acceptable.
VERSION:   1.20, Pf/Aa/Ck 27-MAY-03
---------------------------------------------------------------------------
HISTORY:   1.20, Pf 27-MAY-03, Adapted for 20MHz Atmel CANopen Demo Board
                 added support for CANopen ERR and RUN LED
           1.00, Ck 07-OCT-02, First Published Version
---------------------------------------------------------------------------
Known Shortcomings:
Only supports a transmit queue of length "1"
If queue occupied, waits until it is clear
***************************************************************************/ 

#include <Reg51cc01.h>
#include "mcohw.h"

#ifdef USE_LED
BYTE data m200cnt = 0;
#endif // USE_LED

// Global timer/conter variable, incremented every millisecond
WORD data gTimCnt = 0;

// Global conter for number of receive filters used
BYTE gCANFilter = 0;


#ifdef USE_LED
/**************************************************************************
Variables for LED management
**************************************************************************/
BYTE data mLEDtoggle = 0;
BYTE data mLEDcnt = 0;
BYTE data gRLED = LED_OFF; // Current pattern on run led
BYTE data gELED = LED_OFF; // Current pattern on error led


/**************************************************************************
DOES: This function switches the CANopen Err and Run LEDs
as specified by DR-303-3
It must be called once every 200ms
**************************************************************************/
void MCO_SwitchLEDs
  (
  void
  )
{
  mLEDtoggle = ~mLEDtoggle;
  mLEDcnt++;
  if (mLEDcnt >= 6)
  {
    mLEDcnt = 0;
  }

  switch(gRLED) // Run LED
  {
    case LED_OFF:
	  LED_RUN = 1;
	  break;
	case LED_ON:
	  LED_RUN = 0;
	  break;
	case LED_BLINK:
	  LED_RUN = mLEDtoggle;
	  break;
	case LED_FLASH1:
	  if (mLEDcnt == 0)
	  {
	    LED_RUN = 0;
	  }
	  else
	  {
	    LED_RUN = 1;
	  }
	  break;
	default:
	  break;
  }

  switch(gELED) // Error LED
  {
    case LED_OFF:
	  LED_ERR = 1;
	  break;
	case LED_ON:
	  LED_ERR = 0;
	  break;
	case LED_BLINK:
	  LED_ERR = mLEDtoggle;
	  break;
	case LED_FLASH1:
	  if (mLEDcnt == 1)
	  {
	    LED_ERR = 0;
	  }
	  else
	  {
	    LED_ERR = 1;
	  }
	  break;
	default:
	  break;
  }

}
#endif // USE_LED


/*======================================================================*/
/* FUNCTION:   init_can_125_20                                          */
/* DESCRIPTION:Initializes the CAN interface. Bus operates at 125kBit,  */
/*             if processor clock is 20MHz.                             */
/* CAUTION:    Does not initialize filters - nothing will be received   */
/*             unless screeners are set using set_screener_std          */
/* INPUT:      none                                                     */
/* OUTPUT:     none                                                     */
/*======================================================================*/
void init_can_125_20 ( void )
{
BYTE i;

/* Enable X2 mode */
   CKCON = 0x01;

/* timing for X2 mode, 20MHz, 125kbps */
   CANBT1 = 7 << 1;
   CANBT2 = (1 << 5) | (7 << 1); // SJW << 5, PRS << 1
   CANBT3 = (2 << 4) | (7 << 1); // PHS2 << 4, PHS << 1

/* Clear all acceptance filters and masks, receive nothing */
   for (i=0; i<15; i++)
   {
      CANPAGE  = i << 4;            /* select msg object i */
      CANIDT1  = 0xFF;              /* msg id bits 3-10 */
      CANIDT2  = 0xE0;              /* msg id bits 0-2 */
      CANIDT4  = 0x00;              /* no remote request */
      CANIDM1  = 0xFF;              /* mask bits 3-10 */
      CANIDM2  = 0xE0;              /* mask bits 0-2 */
      CANIDM4  = 0x05;              /* only accept that msg id */
      if (i!=0)
         CANSTCH = 0x00;            /* clear receive ok (and all other) flags */
      else
         CANSTCH = 0x40;            /* for transmit buffer we need to set TX for first transmit */
/* disable msg object */
      CANCONCH = 0x00;              /* msg object is disabled */
   }
  
   CANGCON = 0x02;                 /* enable CAN controller */
   while (!(CANGSTA & 0x04));      /* wait for can controller to be enabled */

   // Initialize Timer interrupt here. 
   // MCOHW_TimerISR must be executed once every millisecond.
   TR0     =  0;                   /* timer 0: stop */
   TMOD    |= 1;                   /* mode 1 */
   TH0     =  0xFF;
   TL0     =  0xFF;
   TR0     =  1;                   /* timer 0: start */
   ET0     =  1;                   /* enable timer 0 int */
}


/*======================================================================*/
/* FUNCTION:   set_screener_std                                         */
/* DESCRIPTION:Sets one of the four screeners (acceptance filters) of   */
/*             the CAN controller.                                      */
/* CAUTION:    For the AT89C51CC01 from Atmel the screeners translate   */
/*             to individual message buffers 1-14. The parameters       */
/*             x_Mask and Bx_Match are ignored.                         */
/* INPUT:      Screener - 1 to 4, one of the four screeners             */
/*             ID_Match - Match/Code value for ID                       */
/* OUTPUT:     none                                                     */
/*======================================================================*/
void set_screener_std ( BYTE Screener, WORD ID_Match )
{
   CANPAGE  = Screener << 4;        /* select msg object */
   CANIDT1  = (ID_Match & 0x07F8) >> 3; /* msg id bits 3-10 */
   CANIDT2  = (ID_Match & 0x0007) << 5; /* msg id bits 0-2 */
   CANIDT4  = 0x00;                 /* no remote request */
   CANIDM1  = 0xFF;                 /* mask bits 3-10: must match */
   CANIDM2  = 0xE0;                 /* mask bits 0-2: must match */
   CANIDM4  = 0x05;                 /* only accept that msg id */
/* clear receive ok (and all other) flags */
   CANSTCH  = 0x00;                /* initialize */
/* enable msg object */
   CANCONCH = 0x88;                /* msg object is enabled for receive, expected 8 bytes */
}



BYTE MCOHW_PullMessage (CAN_MSG *pReceiveBuf)
{
DWORD Identifier;                   /* Definition of vars */
BYTE  Length;
BYTE  i,j;

   for (j=1; j<=gCANFilter; j++)   /* Find msg object that has received something */
   {
      CANPAGE = j << 4;    // select msg object

/* Check the CAN status register for received message                */
      if (CANSTCH & 0x20)
      {                                       /* Message received!   */
         /* Copy message to application message buffer.              */
         Identifier = (unsigned int)(CANIDT1 << 3) | (CANIDT2 >> 5);
         Length     = CANCONCH & 0x0F;
 
         pReceiveBuf->ID  = Identifier;
         pReceiveBuf->LEN = Length;

         /* Read data bytes and write to buffer                      */
         for (i=0; i < Length; i++)
    	      *(BYTE *)(pReceiveBuf->BUF+i) = CANMSG;  /* copy bytes   */
 
         // clear receive ok flag
         CANSTCH &= 0xDF;
         // re-enable msg object
         CANCONCH = 0x88;      /* msg object receives and is enabled */
                               /* 8 bytes excpected                  */

         return (1);                /* Return TRUE, msg rcvd    */
     }
  }

  return (0);                      /* Return False, no msg rcvd */
}

BYTE MCOHW_PushMessage (CAN_MSG *pTransmitBuf)
{
DWORD Identifier;                   /* CAN message identifier */
BYTE  Length;                       /* length of data frame */
BYTE  i;                            /* local loop counter */

/* Prepare length code and identifier.                                  */
   Length     = pTransmitBuf->LEN;
   Identifier = pTransmitBuf->ID;

   CANPAGE  = 0 << 4;               /* select msg object 0 */

/* Check if write access to CAN controller buffer is allowed          */
   while (!(CANSTCH & 0x40)) 
   {
   }
   if (!(CANSTCH & 0x40))
   {
     return 0;
   }

   CANCONCH &=  0x3F;              /* disable object */
   CANSTCH  &= ~0x40;              /* clear TXOK bit */

   CANIDT1  = (Identifier & 0x07F8) >> 3;  /* msg id bits 3-10 */
   CANIDT2  = (Identifier & 0x0007) << 5;  /* msg id bits 0-2 */
   CANIDT4  = 0x00;                /* no remote request */

/* Write message to transmit buffer                                     */
   for (i=0; i < Length; i++)        /* write data bytes */
      CANMSG = pTransmitBuf->BUF[i]; /* copy data byte  */

/* set length and enable msg object => send */
   CANCONCH = 0x40 | (Length & 0x0F);
   
   return 1;
}


/**************************************************************************
DOES: Reads and returns the value of the current 1 millisecond system
      timer tick.
**************************************************************************/
WORD MCOHW_GetTime (void)
{
WORD tmp;

  EA = 0; // Disable Interrupts
  tmp = gTimCnt;
  EA = 1; // Enable Interrupts
  return tmp;
}


BYTE MCOHW_IsTimeExpired(WORD timestamp)
{
WORD time_now;

  EA = 0; // Disable Interrupts
  time_now = gTimCnt;
  EA = 1; // Enable Interrupts
  timestamp++; // To ensure the minimum runtime
  if (time_now > timestamp)
  {
    if ((time_now - timestamp) < 0x8000)
      return 1;
    else
      return 0;
  }
  else
  {
    if ((timestamp - time_now) > 0x8000)
      return 1;
    else
      return 0;
  }
}

/**************************************************************************
DOES: Timer Interrupt Service Routine. 
      Increments the global millisecond counter tick.
      This function needs to be executed once every millisecond!
**************************************************************************/
#define T0_RELOAD 62210 
// Time reload to achieve 1 millisecond at 20MHz, 6-clock

void MCOHW_TimerISR (void) interrupt 1
{

  TR0 = 0; // Stop Timer 0
  TH0 = T0_RELOAD / 256;
  TL0 = T0_RELOAD % 256; // Timer reload value
  TR0 = 1; // Start Timer 0

  gTimCnt++; // Increment global counter

#ifdef USE_LED
  m200cnt++;
  if (m200cnt >= 200)
  {
    MCO_SwitchLEDs(); // Call all 200ms
    m200cnt = 0;
  }
#endif // USE_LED
}

BYTE MCOHW_Init (WORD BaudRate)
{
// This version only supports 125kbit at 20MHz
  if (BaudRate == 125)
  {
    init_can_125_20();
    gCANFilter = 0;
	return 1;
  }
  else
  {
    return 0;
  }
}

BYTE MCOHW_SetCANFilter (WORD CANID)
{
  gCANFilter++;
  if (gCANFilter > 14)  // Kl, 10/9/02 Modified for CC01
  {
    return 0;
  }
  else
  {
    set_screener_std(gCANFilter, CANID); 
    return 1;
  }
}


/*----------------------- END OF FILE ----------------------------------*/






?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品综合小说图片区| 国产综合色产在线精品| 日韩专区在线视频| 国产一区二区三区蝌蚪| 97久久久精品综合88久久| 欧美日韩国产成人在线91| 国产女人18毛片水真多成人如厕| 亚洲一区二区欧美日韩 | 精品久久久久久亚洲综合网| 国产精品久久毛片| 国模冰冰炮一区二区| 欧美日韩精品系列| 亚洲欧美日韩国产手机在线| 国产成人自拍在线| 日韩一级大片在线观看| 亚洲妇熟xx妇色黄| 在线免费亚洲电影| 中文字幕在线播放不卡一区| 国产精品小仙女| 欧美va亚洲va香蕉在线| 日韩专区在线视频| 日韩一区二区三区视频在线| 亚洲.国产.中文慕字在线| 91在线看国产| 亚洲色图欧美激情| 不卡av免费在线观看| 中文在线一区二区| 国产成人自拍网| 国产午夜精品久久| 国产一区二区在线看| 精品国产一区二区三区av性色| 天天影视涩香欲综合网| 在线播放日韩导航| 日韩有码一区二区三区| 欧美一区二区三区在线观看视频| 亚洲成人7777| 日韩丝袜美女视频| 国产综合一区二区| 久久久国产一区二区三区四区小说| 激情国产一区二区 | 欧美日韩国产a| 爽爽淫人综合网网站| 91精品国产91热久久久做人人 | 成人免费小视频| 91女神在线视频| 亚洲一区二区影院| 5566中文字幕一区二区电影 | 亚洲线精品一区二区三区 | 日日夜夜免费精品| 精品国产区一区| 成人免费视频caoporn| 亚洲色图色小说| 欧美日韩成人一区二区| 美女视频网站久久| 国产日韩欧美高清在线| 91在线国内视频| 亚洲成人黄色影院| 欧美大度的电影原声| 成人三级在线视频| 亚洲最大成人网4388xx| 欧美一区二区三区视频在线观看| 韩国一区二区在线观看| 国产精品初高中害羞小美女文| 色婷婷国产精品久久包臀| 日韩vs国产vs欧美| 国产精品系列在线| 欧美乱妇15p| 国产美女久久久久| 亚洲一区二区在线免费观看视频| 精品久久久久久久久久久久久久久 | 久久se这里有精品| 国产精品久久久久久久久免费樱桃 | 欧美一区二区三区免费视频 | 26uuu亚洲| 99re6这里只有精品视频在线观看| 香港成人在线视频| 国产精品萝li| 日韩欧美一区二区久久婷婷| 99免费精品视频| 久久99九九99精品| 亚洲一区二区三区不卡国产欧美| 久久五月婷婷丁香社区| 欧美日韩亚洲综合在线| 国产a久久麻豆| 蜜桃视频在线观看一区| 亚洲精品欧美综合四区| 国产亚洲人成网站| 在线不卡一区二区| 色综合久久久网| 国产乱码精品一区二区三区忘忧草| 亚洲一线二线三线久久久| 国产精品不卡一区| 久久精品人人做人人爽97| 欧美一级欧美三级在线观看| 白白色亚洲国产精品| 国产一区二区伦理| 九色综合狠狠综合久久| 亚洲成av人片一区二区| 自拍偷在线精品自拍偷无码专区| 久久亚洲春色中文字幕久久久| 欧美日韩不卡在线| 欧美日韩中字一区| 色狠狠综合天天综合综合| www.在线成人| 成人午夜精品一区二区三区| 国产一区二区三区香蕉 | 洋洋成人永久网站入口| 国产精品久久久久久户外露出| 久久五月婷婷丁香社区| 精品久久久久一区| 2024国产精品| 精品久久人人做人人爰| 精品国产电影一区二区| 精品第一国产综合精品aⅴ| 精品国产sm最大网站| 欧美电视剧免费观看| 亚洲免费观看高清完整版在线观看 | 久久亚洲影视婷婷| 久久久久青草大香线综合精品| 精品88久久久久88久久久| 精品欧美一区二区久久| 久久女同精品一区二区| 欧美国产97人人爽人人喊| 国产喷白浆一区二区三区| 欧美激情一区二区三区全黄| 久久精品欧美一区二区三区麻豆| 国产视频一区在线观看| 中文av一区二区| 亚洲精选视频在线| 午夜成人在线视频| 久久91精品国产91久久小草 | 午夜精品一区二区三区三上悠亚| 亚洲二区在线视频| 看国产成人h片视频| 国产乱妇无码大片在线观看| 成人小视频在线| 色婷婷精品久久二区二区蜜臂av | 成人免费av资源| 色婷婷亚洲精品| 欧美一区二区三区白人 | 国产精品国产三级国产普通话99| 亚洲免费在线视频| 日韩中文字幕av电影| 韩国一区二区三区| 色综合欧美在线视频区| 欧美电影在线免费观看| 久久久亚洲精华液精华液精华液| 中文字幕视频一区| 免费看欧美美女黄的网站| 国产精品小仙女| 欧美日本一道本在线视频| 久久天天做天天爱综合色| 亚洲欧美一区二区三区孕妇| 日韩成人午夜精品| 99re这里只有精品6| 日韩一区二区在线观看视频| 国产精品污www在线观看| 五月天激情综合网| 成人黄色国产精品网站大全在线免费观看 | 国产精品自拍在线| 欧美日韩免费高清一区色橹橹| 精品成人一区二区| 亚洲国产精品一区二区久久恐怖片| 极品少妇xxxx偷拍精品少妇| 一本到三区不卡视频| 精品少妇一区二区三区| 亚洲免费电影在线| 国产精品一区二区x88av| 精品视频资源站| 国产精品美女久久久久久久网站| 日本一区中文字幕| 在线观看国产日韩| 国产日韩一级二级三级| 蜜臀精品一区二区三区在线观看| 91在线观看污| 国产精品理伦片| 国产福利精品一区二区| 欧美一区二区在线免费观看| 狠狠狠色丁香婷婷综合久久五月| 欧美色倩网站大全免费| 亚洲视频狠狠干| 国产成人在线免费| 精品国产乱码久久久久久闺蜜| 性做久久久久久免费观看| 色婷婷av一区二区三区软件| 亚洲国产岛国毛片在线| 国产在线一区二区| 日韩欧美中文字幕制服| 日日摸夜夜添夜夜添精品视频| 色婷婷综合激情| 一区二区三区免费观看| 91免费在线视频观看| 亚洲日本电影在线| 91香蕉视频在线| 亚洲精品午夜久久久| 色成人在线视频| 亚洲午夜久久久久久久久久久 | 亚洲自拍偷拍网站| 色天天综合色天天久久| 亚洲欧美区自拍先锋|