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

📄 icanobja.c51

📁 infineon C515C RTX51 example. it contains example on using this device
💻 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.                            *
*                                                                      *
*                                                                      *
*                                                                      *
*  Filename           :   ICANOBJA.C51                                 *
*                                                                      *
*  Modulename         :   ICANOBJA                                     *
*                                                                      *
*  Zielsystem         :   Jedes C515C System                           *
*                                                                      *
*  Entwicklungssystem :   Keil C-51                                    *
*                                                                      *
************************************************************************
*  Versionen:                                                          *
*                                                                      *
*  0.1  12.06.1997  K. Birsen    : Erste Version                       *
*  1.1  11.06.1997  K. Birsen : Extended Identification                *
*                               nicht mehr auf 0xFFFF begrenzt         *
*  5.3  22.7.1997   K. Birsen : 15. Object implementiert.              *
*                                                                      *
************************************************************************
*    Copyright 1991 .. 2001 METTLER  &  FUCHS  AG,  CH-8953 Dietikon   *
************************************************************************/

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

#include "abbrev.h"
#include "icanobja.h"
#include "candefs.h"

/* Maximale Anzahl Objekte im Objektbuffer */
#define MAX_OBJECTS 15


/* 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 0x7FF
#define MAX_OBJECT_IDENT_EXT 0x1FFFFFFF


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

#include "icancont.h"
#include "canutil.h"


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

    /* Definition des Objektbuffers                    */
    /* Das Objekt mit dem Index 0 wird nicht verwendet !                */
    /* (Dummy-Element, zum Anzeigen der Nichtexistenz eines Objektes)   */
    static xdata struct {
                   unsigned long identifier;    /* CAN Objekt-ID     */
                   byte obj_typ;        /* Typ des Objekts    */
                   byte standart;       /* TRUE wenn standart */
                   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 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                               *
 *---------------------------------------------------------------------*/

/*---------------------------------------------------------------------*
*      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 .. 15  -->   Index des Objektes
*
*---------------------------------------------------------------------*/

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

  /* wenn 15. object */
  if (c_adr == CONTR_BUF_END_ADR ){
     return(MAX_OBJECTS);
  }

  temp = nbr_of_obj;
  for (i=1; i<=temp; i++) {
     if (can_obj_buf[i].contr_adr == c_adr) return i;
  }
  return 0;

}


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

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

   for (i=0; i<=MAX_OBJECTS; i++) can_obj_buf[i].identifier = 0;

}



/*---------------------------------------------------------------------*
 *     C _ D E F I N E _ O B J
 *---------------------------------------------------------------------*
 *  Funktion:
 *     Definiert ein neues Objekt im Objekt-Buffer
 *
 *---------------------------------------------------------------------*
 *  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)

    {

          /* 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 >= MAX_OBJECTS-1) 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].standart = TRUE;
             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;

             can_obj_buf[nbr_of_obj].contr_adr =
                 CONTR_BUF_START_ADR + (nbr_of_obj - 1) * MESSAGE_SIZE;

             c_init_obj (identifier,
                        data_length,
                        obj_typ,
                        can_obj_buf[nbr_of_obj].contr_adr,
                        TRUE); /* 1 for standart */
             return C_OK;
          }
          else {
             /* Objekt existiert schon */
             return C_OBJ_ERROR;
          }
   }

/*---------------------------------------------------------------------*
 *     C _ D E F I N E _ O B J _ E X T
 *---------------------------------------------------------------------*
 *  Funktion:
 *     Definiert ein neues Objekt im Objekt-Buffer
 *
 *---------------------------------------------------------------------*
 *  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_ext (unsigned long identifier,
                       byte data_length,
                       byte obj_typ)

    {

          /* 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 >= MAX_OBJECTS-1) return C_MEM_FULL;
          if (identifier > MAX_OBJECT_IDENT_EXT) 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].standart = FALSE;
             can_obj_buf[nbr_of_obj].data_length = data_length;

⌨️ 快捷键说明

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