⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canobja.c51

📁 RTX51 example for Intel 82526. it contains example use of CAN.
💻 C51
📖 第 1 页 / 共 3 页
字号:
#pragma large
#pragma debug
#pragma registerbank(3)
#pragma pagelength(80) pagewidth(110)
/***********************************************************************
************************************************************************
*                                                                      *
*  C A N   O B J E C T  A D M I N I S T R A T I O N                    *
*                                                                      *
************************************************************************
************************************************************************
*                                                                      *
*  Funktion:                                                           *
*                                                                      *
*     Dieses Modul 乥ernimmt die Verwaltung von allen vom Benutzer     *
*     definierten Kommunikationsobjekten. Es regelt den Empfang und    *
*     das Senden der Kommunikationsobjekte.                            *
*                                                                      *
*     Beim kompilieren muss ein Makro mit dem Namen I82526 oder        *
*     P82C200 (f乺 den Intel oder Philips Controller) angegeben werden *
*                                                                      *
*                                                                      *
*  Filename           :   CANOBJA.C51                                  *
*                                                                      *
*  Modulename         :   CANOBJA                                      *
*                                                                      *
*  Zielsystem         :   Jedes 8051 System mit einem Philips          *
*                         82C200 oder Intel 82526 CAN-Controller       *
*                                                                      *
*  Entwicklungssystem :   Keil C-51                                    *
*                                                                      *
************************************************************************
*  Versionen:                                                          *
*                                                                      *
*  0.1  26.10.1990  Th. Fischler : Erste Version                       *
*  1.0  21.01.1991  Th. Fischler : Send-Error Handling eingebaut       *
*  1.1  13.02.1991  Th. Fischler : Mit Variante f乺 den Intel-         *
*                                  Controller erweitert                *
*  1.2  09.04.1992  Th. Fischler : Fehler in Akkzeptanzfilterung       *
*                                  und Unbind von Objekten behoben     *
*                                                                      *
************************************************************************
*    Copyright 1991 .. 2001 METTLER  &  FUCHS  AG,  CH-8953 Dietikon   *
************************************************************************/

/*---------------------------------------------------------------------*
 *     D E F I N I T I O N E N                                         *
 *---------------------------------------------------------------------*/

/* Debug */
/* #define P82C200 */

/* Test ob der CAN-Controller angew刪lt wurde */
#ifndef I82526
   #ifndef P82C200
      #ifndef P80592
         #error "I82526 oder P82C200 oder P80592 muss definiert werden"
      #endif
   #endif
#endif



#include "abbrev.h"
#include "canobja.h"
#include "candefs.h"

/* Maximale Anzahl Objekte im Objektbuffer */
#ifdef P82C200
   #define MAX_OBJECTS 255
#endif
#ifdef I82526
   #define MAX_OBJECTS 18
#endif
#ifdef P80592
   #define MAX_OBJECTS 255
#endif


/* Maximale L刵ge der Daten in einem Objekt */
#define MAX_OBJECT_DATA_SIZE 8

/* Gr攕ster Objektidentifier, der benutzt werden darf */
#define MAX_OBJECT_IDENT 2031


/*---------------------------------------------------------------------*
 *     I M P O R T S                                                   *
 *---------------------------------------------------------------------*/

#ifdef P82C200
   #include "bcancont.h"
#endif
#ifdef I82526
   #include "fcancont.h"
#endif
#ifdef P80592
   #include "ccont592.h"
   #undef P80592
   #define P82C200
#endif

#include "canutil.h"


/*---------------------------------------------------------------------*
 *     M O D U L G L O B A L E  V A R I A B L E N                      *
 *---------------------------------------------------------------------*/

#ifdef P82C200
   /*==================================================================*/
   /* NUR FUER Philips 82C200                                          */
   /*==================================================================*/
   /* Die Gr攕se des Objektbuffers kann vom Kunden in einem eigenen    */
   /* Konfigurationsfile festgelegt werden (BCANCONF.A51).             */
   /* Jedes zu definierende Objekt ben攖igt 14 Byte XDATA-RAM          */
   /* (unabh刵gig von der tats刢hlich verwendeten Datenl刵ge).         */
   /* Der Linker alloziert diese Variable automatisch an den die       */
   /* Speicherstelle, die das Symbol CAN_OBJ_BUF im Assembler Modul    */
   /* BCANCONF einnimmt.                                               */
   /* Hier wird die maximal m攇liche Anzahl von Objekten definiert     */
   /* (Korrekte Code-Generierung des Compilers !)                      */
   /* Das Objekt mit dem Index 0 wird nicht verwendet !                */
   /* (Dummy-Element, zum Anzeigen der Nichtexistenz eines Objektes)   */

   extern xdata struct {
                   unsigned int identifier;    /* CAN Objekt-ID      */
                   byte obj_typ;               /* Typ des Objekts    */
                   byte data_length;           /* Anzahl Datenbytes  */
                   byte task_bind;             /* Task-ID oder FFH   */
                   byte obj_read;              /* Objekt gelesen ?   */
				   byte dat[MAX_OBJECT_DATA_SIZE]; /* Objekt-Daten	 */
                } can_obj_buf[MAX_OBJECTS+1];

   /* Hilfsvariablen, liegen an derselben Adresse wie die Symbole    */
   /* CAN_OBJ_BUF_END und CAN_OBJ_BUF_START im Assembler Modul       */
   /* BCANCONF.A51                                                   */
   extern xdata byte can_obj_buf_start;
   extern xdata byte can_obj_buf_end;

   /* Vom Benutzer definierte L刵ge des Objektbuffers in Anzahl        */
   /* Objekten                                                         */
   static xdata unsigned int obj_buf_len;

   static xdata unsigned int acc_code, acc_mask;
   /* Bilden zusammen die 11-Bit Akzeptanzfilterung, die Variable      */
   /* ACC_MASK gibt an, welche Bits der Variable ACC_CODE f乺 die      */
   /* Filterung relevant sind (1->relevant, 0->nicht relevant).        */
   /* Falls der Identifier eines empfangenen Objektes zumindest an den */
   /* durch die Variable ACC_MASK bestimmten Stellen mit der Variablen */
   /* ACC_CODE 乥ereinstimmt, hat das Objekt die zweite Stufe der      */
   /* Akzeptanzfilterung passiert (1. Stufe macht der 82C200).         */
   /*                                                                  */
   /* Eine Identifiaktion (ID) passiert die Akzeptanzfilterung in der  */
   /* zweiten Stufe wenn :                                             */
   /*   (ID XOR ACC_CODE) AND (ACC_MASK) = 00000000000B                */

   static xdata byte new_init;
   /* Ist TRUE falls der Objektbuffer eben mit C_INIT_OBJ_BUFF neu     */
   /* initialisiert wurde                                              */
   /*==================================================================*/
   /*  ENDE Philips 82C200                                             */
   /*==================================================================*/
#endif


#ifdef I82526
   /*==================================================================*/
   /* NUR FUER Intel 82526											   */
   /*==================================================================*/
   /* Definition des Objektbuffers									   */
   /* Das Objekt mit dem Index 0 wird nicht verwendet !                */
   /* (Dummy-Element, zum Anzeigen der Nichtexistenz eines Objektes)   */
   static xdata struct {
				   unsigned int identifier;    /* CAN Objekt-ID 	   */
				   byte obj_typ;			   /* Typ des Objekts	   */
				   byte data_length;		   /* Anzahl Datenbytes    */
				   byte task_bind;			   /* Task-ID oder FFH	   */
				   byte obj_read;			   /* Objekt gelesen ?	   */
				   byte contr_adr;			   /* interne Start-	   */
				} can_obj_buf[MAX_OBJECTS+1];  /* Adresse des Objekts  */

   /* Anzahl freie Bytes im 82526 internen Objekt-Speicher			   */
   static byte xdata free_contr_buf;
   /*==================================================================*/
   /*  ENDE Intel 82526 											   */
   /*==================================================================*/
#endif


   /* Anzahl definierte Objekte                                        */
   static xdata byte nbr_of_obj;

   /* Enth刲t die Indexe aller Objekte die an einen bestimmten Task    */
   /* gebunden sind (deren Feld OBJ_BUF.TASK_BIND ungleich FFH ist).   */
   /* Der Wert 0 zeigt ein unbenutztes Feld an (enth刲t keinen Index). */
   /* Mit Hilfe dieses Arrays kann schnell ein zu einem bestimmten     */
   /* Task geh攔endes Objekt gefunden werden.                          */
   static xdata byte bind_index_list[MAX_BIND_OBJ];


#pragma eject
/*---------------------------------------------------------------------*
 *	   L O K A L E	 P R O Z E D U R E N							   *
 *---------------------------------------------------------------------*/

#ifdef I82526
   /*==================================================================*/
   /* NUR FUER Intel 82526											   */
   /*==================================================================*/
   /*---------------------------------------------------------------------*
	*	  C _ G E T _ I N D E X _ F R O M _ A D R
	*---------------------------------------------------------------------*
	*  Funktion:
	*	  Testet ob das Objekt mit der Controller internen Adresse C_ADR
	*	  im Objekt-Buffer definiert ist und gibt den entsprechenden Index
	*	  innerhalb von CAN_OBJ_BUF zur乧k.
	*
	*---------------------------------------------------------------------*
	*  Parameter:
	*
	*	  c_adr   :    Controller interne Start-Adresse des Objektes
	*
	*	  Returnwert   :	0		 -->   Das Objekt existiert nicht
	*						1 .. 255 -->   Index des Objektes
	*
	*---------------------------------------------------------------------*/

   static byte c_get_index_from_adr (byte c_adr)
   {
	  byte i, temp;

	  temp = nbr_of_obj;
	  for (i=1; i<=temp; i++) {
		 if (can_obj_buf[i].contr_adr == c_adr) return i;
	  }
	  return 0;
   }
   /*==================================================================*/
   /*  ENDE Intel 82526 											   */
   /*==================================================================*/
#endif



#pragma eject
/*---------------------------------------------------------------------*
 *     E X P O R T I E R T E  P R O Z E D U R E N                      *
 *---------------------------------------------------------------------*/


/*---------------------------------------------------------------------*
 *     Initialisieren und Definieren von Objekten                      *
 *---------------------------------------------------------------------*/

/*---------------------------------------------------------------------*
 *     C _ I N I T _ O B J _  B U F
 *---------------------------------------------------------------------*
 *  Funktion:
 *     Neu Initialisieren des Objektbuffers, L攕chen aller vorhandenen
 *     Objekte
 *
 *---------------------------------------------------------------------*
 *  Parameter:
 *
 *     --
 *
 *---------------------------------------------------------------------*/

void c_init_obj_buf (void)
{
   byte i;

   #ifdef P82C200
	  /*==================================================================*/
	  /* NUR FUER Philips 82C200										  */
	  /*==================================================================*/
      obj_buf_len = ((&can_obj_buf_end+1) - &can_obj_buf_start) /
					sizeof(can_obj_buf[1]);
      acc_code = acc_mask = 0xffff;
	  new_init = TRUE;
   #endif

   #ifdef I82526
	  /*==================================================================*/
	  /* NUR FUER Intel 82526											  */
	  /*==================================================================*/
      free_contr_buf = CONTR_BUF_END_ADR - CONTR_BUF_START_ADR + 1;
   #endif

   nbr_of_obj = 0;
   for (i=0; i<=MAX_BIND_OBJ-1; i++) bind_index_list[i] = 0;
}



/*---------------------------------------------------------------------*
 *     C _ D E F I N E _ O B J
 *---------------------------------------------------------------------*
 *  Funktion:
 *     Definiert ein neues Objekt im Objekt-Buffer und berechnet die
 *	   resultierende Akzeptanz-Maske (beim Philips 82C200 Controller).
 *
 *---------------------------------------------------------------------*
 *  Parameter:
 *
 *     identifier   : Identifikation des zu definierenden Objektes
 *     data_length  : Anzahl Datenbytes des zu definierenden
 *                    Objektes (0..8)
 *     obj_typ      : Genauere Beschreibung der Verwendungsart des
 *                    Objektes :
 *
 *                    D_REC        :   Objekt kann nur empfangen werden
 *                    D_SEND       :   Objekt kann nur gesendet werden
 *                    D_REC_R_SEND :   Objekt kann empfangen werden
 *                                     und es kann ein entsprechende
 *                                     Remote-Frame ausgesendet werden
 *                    D_SEND_R_REC :   Objekt kann gesendet werden und es
 *                                     kann ein entsprechendes Remote-Frame
 *                                     empfangen und beantwortet werden
 *
 *
 *     Returnwert   : OK, OBJ_ERROR, TOO_LONG, INVALID_TYPE, MEM_FULL
 *
 *---------------------------------------------------------------------*/

byte c_define_obj (unsigned int identifier,
                   byte data_length,
                   byte obj_typ)
{
   #ifdef P82C200
	  /*==================================================================*/
	  /* NUR FUER Philips 82C200										  */
	  /*==================================================================*/
      /* Test der Input-Werte */
	  if (data_length > MAX_OBJECT_DATA_SIZE) return C_TOO_LONG;
      if ((obj_typ != D_REC) && (obj_typ != D_SEND) &&
         (obj_typ != D_REC_R_SEND) && (obj_typ != D_SEND_R_REC))
		 return C_INVALID_TYPE;
	  if (nbr_of_obj >= obj_buf_len) return C_MEM_FULL;
	  if (nbr_of_obj >= MAX_OBJECTS) return C_MEM_FULL;
	  if (identifier > MAX_OBJECT_IDENT) return C_OBJ_ERROR;
	  if (c_get_index_from_ident(identifier) == 0) {
		 nbr_of_obj++;
		 can_obj_buf[nbr_of_obj].identifier = identifier;
		 can_obj_buf[nbr_of_obj].obj_typ = obj_typ;
		 can_obj_buf[nbr_of_obj].data_length = data_length;
		 can_obj_buf[nbr_of_obj].task_bind = NO_BIND;
		 can_obj_buf[nbr_of_obj].obj_read = TRUE;
		 /* Werte f乺 die Akkzeptanzfilterung berechnen */
         if (obj_typ != D_SEND) {
            if (new_init) {
               /* erstes Objekt */
               acc_code = identifier;
               new_init = FALSE;
            }
            else {
               acc_mask = ~(acc_code ^ identifier) & acc_mask;
               acc_code = acc_code & identifier;
            }
         }
		 return C_OK;
	  }
	  else {
		 /* Objekt existiert schon */
		 return C_OBJ_ERROR;
	  }
   #endif

   #ifdef I82526
	  /*==================================================================*/
	  /* NUR FUER Intel 82526											  */
	  /*==================================================================*/
      /* Test der Input-Werte */
	  if (data_length > MAX_OBJECT_DATA_SIZE) return C_TOO_LONG;
	  if ((obj_typ != D_REC) && (obj_typ != D_SEND) &&
		 (obj_typ != D_REC_R_SEND) && (obj_typ != D_SEND_R_REC))
		 return C_INVALID_TYPE;
	  if ((data_length+OBJ_DESC_SIZE) > free_contr_buf) return C_MEM_FULL;
	  if (nbr_of_obj >= MAX_OBJECTS) return C_MEM_FULL;
	  if (identifier > MAX_OBJECT_IDENT) return C_OBJ_ERROR;
      if (c_get_index_from_ident(identifier) == 0) {
		 nbr_of_obj++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -