📄 icanobja.c51
字号:
*
* arr : Array in den die Daten gelesen werden sollen
*
*
*---------------------------------------------------------------------*/
void c_read_data (byte index,
byte xdata *arr)
{
byte length;
length = can_obj_buf[index].data_length;
if (length > 0) {
c_read_obj (can_obj_buf[index].contr_adr, arr);
}
can_obj_buf[index].obj_read = TRUE;
}
/*---------------------------------------------------------------------*
* C _ R E C E I V E _ O B J
*---------------------------------------------------------------------*
* Funktion:
* F乭rt die nach einem Receive-Interrupt n攖igen Funktionen aus.
*
*---------------------------------------------------------------------*
* Parameter:
*
* Normale R乧kmeldung bei einwandfrei Empfangenen
* Data-Frames :
* 1 bis 15 -> Index innerhalb OBJ_BUF des
* empfangenen und abgespeicherten
* Objektes
*
* R乧kmeldungen falls kein
* Data-Frame f乺 die Applikation
* empfangen :
*
* FFF0H -> Ein Remote-Frame wurde empfangen und
* beantwortet
* FFF1H -> Ein Remote-Frame wurde empfangen,
* das entsprechende Objekt hat aber
* einen falschen Typ
* FFF2H -> Ein Remote-Frame wurde empfangen,
* die Antwort konnte aber wegen
* Bus-Problemen nicht gesendet werden
* FFF3H -> Das Objekt hat die 2. Stufe der
* Akzeptanzfilterung nicht passiert
* FFF4H -> Das Objekt hat die 3. Stufe der
* Akzeptanzfilterung nicht passiert
* FFF5H -> Ein Objekt wurde empfangen und
* akzeptiert, das entsprechende
* Objekt hat aber einen falschen Typ
* FFF6H -> Ein Objekt wurde empfangen,
* akzeptiert und abgespeichert,
* die Applikation muss aber nicht
* benachrichtigt werden, da das
* Objekt nur neu beschrieben wurde
* (seit dem letzten Empfang noch
* nicht gelesen durch die
* Applikation).
*
*
*---------------------------------------------------------------------*/
unsigned int c_receive_obj (void)
{
byte index, adr;
adr = c_get_obj_int_adr();
index = c_get_index_from_adr (adr);
if (index == 0) {
/* Objekt ist nicht bekannt */
c_receipt_obj_int (adr);
return 0xfff0;
}
/* G乴tiges Data-Frame empfangen, Typ testen */
if ((can_obj_buf[index].obj_typ == D_REC) ||
(can_obj_buf[index].obj_typ == D_REC_R_SEND)) {
/* Interrupt freigeben */
c_receipt_obj_int (adr);
if (can_obj_buf[index].obj_read) {
can_obj_buf[index].obj_read = FALSE;
return index;
}
else {
return 0xfff2;
}
}
else {
/* falscher Objekttyp */
c_receipt_obj_int (adr);
return 0xfff1;
}
}
/*---------------------------------------------------------------------*
* C _ T R A N S M I T _ O B J
*---------------------------------------------------------------------*
* Funktion:
* Senden eines Data-Frames 乥er den CAN-Bus mit Abspeichern der
* Daten im Objektbuffer.
*
*---------------------------------------------------------------------*
* Parameter:
*
* Index : Index des zu sendenden Objektes
*
* arr : Array mit den Daten die gesendet werden sollen
*
* Returnwert : TRUE --> Objekt erfolgreich gesendet
* FALSE --> Objekt konnte nicht gesendet werden
* (Bus-Fehler)
*
*---------------------------------------------------------------------*/
byte c_transmit_obj (byte index,
byte xdata *arr)
{
return c_send_obj (can_obj_buf[index].contr_adr, FALSE, arr);
}
/*---------------------------------------------------------------------*
* C _ S E N D _ R E M O T E
*---------------------------------------------------------------------*
* Funktion:
* Senden eines eines Remote-Frames 乥er den CAN-Bus
*
*---------------------------------------------------------------------*
* Parameter:
*
* Index : Index des Objektes von dem ein Remote-Frame
* gesendet werden soll
*
* Returnwert : TRUE --> Objekt erfolgreich gesendet
* FALSE --> Objekt konnte nicht gesendet werden
* (Bus-Fehler)
*
*---------------------------------------------------------------------*/
byte c_send_remote (byte index)
{
return c_send_obj (can_obj_buf[index].contr_adr, TRUE, 0);
}
/*---------------------------------------------------------------------*
* C _ S E T _ B I N D
*---------------------------------------------------------------------*
* Funktion:
* Setzt das Feld TASK_BIND innerhalb des Objektes INDEX im
* Objekt-Buffer auf eine bestimmte TASK_ID (wird zum festen
* Anbinden eines Objektes an einen Task ben攖igt, der CAN-Driver
* kann damit ermitteln, zu welchem Task er ein Signal senden muss,
* wenn dieses Objekt empfangen wird). Gleichzeitig wird der Index
* des Objektes im Array BIND_INDEX_LIST abgespeichert.
*
*---------------------------------------------------------------------*
* Parameter:
*
* index : Index des Objekts bei dem der Task-Bind Wert
* gesetzt werden soll
*
* task_id : Wert auf den der Task-Bind Wert gesetzt werden soll
*
* Returnwert : TRUE --> OK
* FALSE --> Die BIND_INDEX_LIST ist voll
* (bereits 8 Objekte angebunden)
*
*---------------------------------------------------------------------*/
byte c_set_bind (byte index,
byte task_id)
{
byte i;
for (i=0; i<=MAX_BIND_OBJ-1; i++) {
if ((bind_index_list[i] == 0) || (bind_index_list[i] == index)) {
bind_index_list[i] = index;
can_obj_buf[index].task_bind = task_id;
return TRUE;
}
}
return FALSE;
}
/*---------------------------------------------------------------------*
* C _ C L E A R _B I N D
*---------------------------------------------------------------------*
* Funktion:
* Markiert das Objekt als zu keinem bestimmten Task zugeh攔ig.
* Setzt das Feld TASK_BIND innerhalb des Objektes INDEX im
* Objekt-Buffer auf FFH (in RTX-51 keine g乴tige TASK-ID).
*
*---------------------------------------------------------------------*
* Parameter:
*
* index : Index des Objekts bei dem der Task-Bind Wert gel攕cht
* werden soll
*
*---------------------------------------------------------------------*/
void c_clear_bind (byte index)
{
byte i;
for (i=0; i<=7; i++) {
if (bind_index_list[i] == index) bind_index_list[i] = 0;
}
can_obj_buf[index].task_bind = NO_BIND;
}
/*---------------------------------------------------------------------*
* C _ G E T _ B I N D
*---------------------------------------------------------------------*
* Funktion:
* Gibt den aktuellen Wert des Feldes TASK_BIND im Objekt
* INDEX zur乧k. NO_BIND bedeutet dabei, dass das Objekt an keinen
* Task gebunden ist.
*
*---------------------------------------------------------------------*
* Parameter:
*
* index : Index des Objekts dessen Task-Bind Wert gelesen
* werden soll
*
* Returnwert : Alle Werte ausser FFH sind eine g乴tige Task-ID.
* FFH bedeutet, dass das Objekt an keinen Task
* gebunden ist.
*
*---------------------------------------------------------------------*/
byte c_get_bind (byte index)
{
return can_obj_buf[index].task_bind;
}
/*---------------------------------------------------------------------*
* C _ S E T _ R E A D
*---------------------------------------------------------------------*
* Funktion:
* Setzt OBJ_READ innerhalb des Objektes INDEX auf TRUE. Diese
* Funktion dient dazu ein neu empfangenes Objekt als von der
* Applikation gelesen zu markieren, falls die Applikation nicht
* getstartet werden kann (Mailbox voll usw.).
*
*---------------------------------------------------------------------*
* Parameter:
*
* index : Index des Objekts bei dem OBJ_READ gesetzt
* werden soll
*
*---------------------------------------------------------------------*/
void c_set_read (byte index)
{
can_obj_buf[index].obj_read = TRUE;
}
/*---------------------------------------------------------------------*
* C _ S E T _ A L L _ R E A D
*---------------------------------------------------------------------*
* Funktion:
* Setzt OBJ_READ innerhalb aller Objekte auf TRUE. Diese
* Funktion dient dazu alle empfangenen Objekte als von der
* Applikation gelesen zu markieren.
*
*---------------------------------------------------------------------*/
void c_set_all_read (void)
{
byte i;
for (i=1; i<=nbr_of_obj; i++) {
can_obj_buf[i].obj_read = TRUE;
}
}
/*---------------------------------------------------------------------*
* Ende Modul ICANOBJA *
*---------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -