📄 icanap_2.inc
字号:
;* C_OBJ_ERROR Objekt existiert schon
;* C_TOO_LONG DATA_LENGTH ist gr攕ser als 8
;* C_INVALID_TYPE Falscher Objekttyp
;* C_MEM_FULL Objekt-Speicher ist voll, es k攏nen keine
;* neuen Objekte definiert werden
;* (zuerst alle Objekte mit CAN_HW_INIT l攕chen).
;* Entweder sind bereits 255 Objekte definiert
;* oder der Objekt-Speicher ist voll.
;*
;*---------------------------------------------------------------------*/
?XD?_can_def_obj_ext?ICANAPIF SEGMENT XDATA
RSEG ?XD?_can_def_obj_ext?ICANAPIF
?_can_def_obj_ext?BYTE:
ident_x: DS 4
dat_len: DS 1
obj_typ: DS 1
?CAN?_can_def_obj_ext?ICANAPIF SEGMENT CODE
RSEG ?CAN?_can_def_obj_ext?ICANAPIF
_can_def_obj_ext:
MOV A,R4
MOV DPTR, #C_ORDER_BUF_PARAM
MOVX @DPTR, A
MOV A,R5
MOV DPTR, #C_ORDER_BUF_PARAM + 1
MOVX @DPTR, A
MOV A,R6
MOV DPTR, #C_ORDER_BUF_PARAM + 2
MOVX @DPTR, A
MOV A,R7
MOV DPTR, #C_ORDER_BUF_PARAM + 3
MOVX @DPTR, A
MOV DPTR, #dat_len
MOVX A, @DPTR
MOV DPTR, #C_ORDER_BUF_PARAM + 4
MOVX @DPTR, A
MOV DPTR, #obj_typ
MOVX A, @DPTR
MOV DPTR, #C_ORDER_BUF_PARAM + 5
MOVX @DPTR, A
; Testen ob CAN-Task besetzt
CALL C_ENTER_DRIVER
CJNE A, #TRUE, CDOX_1
SETUP_ORDER CAN_DEF_OBJ_ORDER_EXT, 0
; Befehle an CAN-Task aufsetzen
; CAN-Task starten
MOV R7, #C_DRIVER_ID
CALL _os_send_signal
MOV R7, #K_SIG
CALL _os_wait
;Returnwert retten
MOV DPTR, #C_ORDER_BUF_PARAM
MOVX A, @DPTR
PUSH ACC
CALL C_LEAVE_DRIVER
POP ACC
MOV R7, A
RET
CDOX_1: MOV R7, #C_CAN_FAILURE
RET
$EJECT
;*---------------------------------------------------------------------*
;* C A N _ D E F _ L A S T _ O B J
;*---------------------------------------------------------------------*
;* Funktion:
;* Definieren 15. Kommunikationsobjekts. Diese Funktion
;* kann nur nach CAN_HW_INIT oder nach CAN_STOP ausgef乭rt werden.
;* Es k攏nen Objekte definiert werden, bis der Objekt-Speicher voll
;* ist (beim Full-CAN ist dies das Controller-interne Dual-Port RAM,
;* beim Basic-CAN wird der Objekt-Speicher im externen RAM alloziert)
;* oder die maximale Anzahl von 255 definierten Objekten erreicht ist.
;* Falls ein Objekt definiert wird, dass bereits existiert, wird eine
;* Fehlermeldung (in CANRETURN) zur乧kgegeben.
;* Nach der Beendigung der Initialisierung kann der CAN-Treiber mit
;* CAN_START gestartet werden.
;*
;* BEGIN
;* R4 := HIGH(IDENTIFIER);
;* R5 := LOW(IDENTIFIER);
;* R6 := HIGH(IDENTIFIER);
;* R7 := LOW(IDENTIFIER);
;* IF C_ENTER_DRIVER THEN
;* C_ORDER_BUF.ORDER := CAN_DEF_L_OBJ_ORDER;
;* C_ORDER_BUF.PARAM[0] := R4;
;* C_ORDER_BUF.PARAM[1] := R5;
;* C_ORDER_BUF.PARAM[2] := R6;
;* C_ORDER_BUF.PARAM[3] := R7;
;* C_ORDER_BUF.PARAM[4] := dat_len;
;* C_ORDER_BUF.TASK_ID := os_running_task_id ();
;* os_send_signal an CAN-Task;
;* os_wait (K_SIG,0,0);
;* PUSH(C_ORDER_BUF.PARAM[0]); (* Returnwert auf Stack pushen *)
;* C_LEAVE_DRIVER;
;* POP(ACC); (* Returnwert in Akku *)
;* RETURN;
;* ELSE
;* RETURN C_CAN_FAILURE;
;* END IF;
;* END CAN_HW_INIT;
;*
;*---------------------------------------------------------------------*
;* Parameter :
;*
;* R4/R7 : IDENTIFIER Identifikation des Kommunikationsobjektes
;* entsprechend der CAN-Definition (0 .. 7EFH)
;* dat_len : DATA_LENGTH Anzahl Datenbyte im Objekt (0..8)
;*
;*
;* Returnwert in R7 :
;*
;* C_OK Objekt definiert
;* C_NOT_STOPPED CAN_STOP oder CAN_HW_INIT muss vor der
;* Ausf乭rung dieser Funktion aufgerufen werden
;* C_OBJ_ERROR Objekt existiert schon
;* C_TOO_LONG DATA_LENGTH ist gr攕ser als 8
;* C_INVALID_TYPE Falscher Objekttyp
;* C_MEM_FULL Objekt-Speicher ist voll, es k攏nen keine
;* neuen Objekte definiert werden
;* (zuerst alle Objekte mit CAN_HW_INIT l攕chen).
;* Entweder sind bereits 255 Objekte definiert
;* oder der Objekt-Speicher ist voll.
;*
;*---------------------------------------------------------------------*/
?XD?_can_def_last_obj?ICANAPIF SEGMENT XDATA
RSEG ?XD?_can_def_last_obj?ICANAPIF
?_can_def_last_obj?BYTE:
l_ident: DS 4
l_dat_len: DS 1
?CAN?_can_def_last_obj?ICANAPIF SEGMENT CODE
RSEG ?CAN?_can_def_last_obj?ICANAPIF
_can_def_last_obj:
MOV A,R4
MOV DPTR, #C_ORDER_BUF_PARAM
MOVX @DPTR, A
MOV A,R5
MOV DPTR, #C_ORDER_BUF_PARAM + 1
MOVX @DPTR, A
MOV A,R6
MOV DPTR, #C_ORDER_BUF_PARAM + 2
MOVX @DPTR, A
MOV A,R7
MOV DPTR, #C_ORDER_BUF_PARAM + 3
MOVX @DPTR, A
MOV DPTR, #l_dat_len
MOVX A, @DPTR
MOV DPTR, #C_ORDER_BUF_PARAM + 4
MOVX @DPTR, A
; Testen ob CAN-Task besetzt
CALL C_ENTER_DRIVER
CJNE A, #TRUE, L_CDOX_1
SETUP_ORDER CAN_DEF_L_OBJ_ORDER, 0
; Befehle an CAN-Task aufsetzen
; CAN-Task starten
MOV R7, #C_DRIVER_ID
CALL _os_send_signal
MOV R7, #K_SIG
CALL _os_wait
;Returnwert retten
MOV DPTR, #C_ORDER_BUF_PARAM
MOVX A, @DPTR
PUSH ACC
CALL C_LEAVE_DRIVER
POP ACC
MOV R7, A
RET
L_CDOX_1: MOV R7, #C_CAN_FAILURE
RET
$EJECT
;*---------------------------------------------------------------------*
;* C A N _ D E F _ L _ O B J _ E X T
;*---------------------------------------------------------------------*
;* Funktion:
;* Definieren 15. Kommunikationsobjekts. Diese Funktion
;* kann nur nach CAN_HW_INIT oder nach CAN_STOP ausgef乭rt werden.
;* Es k攏nen Objekte definiert werden, bis der Objekt-Speicher voll
;* ist (beim Full-CAN ist dies das Controller-interne Dual-Port RAM,
;* beim Basic-CAN wird der Objekt-Speicher im externen RAM alloziert)
;* oder die maximale Anzahl von 255 definierten Objekten erreicht ist.
;* Falls ein Objekt definiert wird, dass bereits existiert, wird eine
;* Fehlermeldung (in CANRETURN) zur乧kgegeben.
;* Nach der Beendigung der Initialisierung kann der CAN-Treiber mit
;* CAN_START gestartet werden.
;*
;* BEGIN
;* R4 := HIGH(IDENTIFIER);
;* R5 := LOW(IDENTIFIER);
;* R6 := HIGH(IDENTIFIER);
;* R7 := LOW(IDENTIFIER);
;* IF C_ENTER_DRIVER THEN
;* C_ORDER_BUF.ORDER := CAN_DEF_L_OBJ_ORDER_EXT;
;* C_ORDER_BUF.PARAM[0] := R4;
;* C_ORDER_BUF.PARAM[1] := R5;
;* C_ORDER_BUF.PARAM[2] := R6;
;* C_ORDER_BUF.PARAM[3] := R7;
;* C_ORDER_BUF.PARAM[4] := dat_len;
;* C_ORDER_BUF.TASK_ID := os_running_task_id ();
;* os_send_signal an CAN-Task;
;* os_wait (K_SIG,0,0);
;* PUSH(C_ORDER_BUF.PARAM[0]); (* Returnwert auf Stack pushen *)
;* C_LEAVE_DRIVER;
;* POP(ACC); (* Returnwert in Akku *)
;* RETURN;
;* ELSE
;* RETURN C_CAN_FAILURE;
;* END IF;
;* END CAN_HW_INIT;
;*
;*---------------------------------------------------------------------*
;* Parameter :
;*
;* R4/R7 : IDENTIFIER Identifikation des Kommunikationsobjektes
;* entsprechend der CAN-Definition (0 .. 7EFH)
;* dat_len : DATA_LENGTH Anzahl Datenbyte im Objekt (0..8)
;*
;*
;* Returnwert in R7 :
;*
;* C_OK Objekt definiert
;* C_NOT_STOPPED CAN_STOP oder CAN_HW_INIT muss vor der
;* Ausf乭rung dieser Funktion aufgerufen werden
;* C_OBJ_ERROR Objekt existiert schon
;* C_TOO_LONG DATA_LENGTH ist gr攕ser als 8
;* C_INVALID_TYPE Falscher Objekttyp
;* C_MEM_FULL Objekt-Speicher ist voll, es k攏nen keine
;* neuen Objekte definiert werden
;* (zuerst alle Objekte mit CAN_HW_INIT l攕chen).
;* Entweder sind bereits 255 Objekte definiert
;* oder der Objekt-Speicher ist voll.
;*
;*---------------------------------------------------------------------*/
?XD?_can_def_last_obj_ext?ICANAPIF SEGMENT XDATA
RSEG ?XD?_can_def_last_obj_ext?ICANAPIF
?_can_def_last_obj_ext?BYTE:
lx_ident: DS 4
lx_dat_len: DS 1
?CAN?_can_def_last_obj_ext?ICANAPIF SEGMENT CODE
RSEG ?CAN?_can_def_last_obj_ext?ICANAPIF
_can_def_last_obj_ext:
MOV A,R4
MOV DPTR, #C_ORDER_BUF_PARAM
MOVX @DPTR, A
MOV A,R5
MOV DPTR, #C_ORDER_BUF_PARAM + 1
MOVX @DPTR, A
MOV A,R6
MOV DPTR, #C_ORDER_BUF_PARAM + 2
MOVX @DPTR, A
MOV A,R7
MOV DPTR, #C_ORDER_BUF_PARAM + 3
MOVX @DPTR, A
MOV DPTR, #lx_dat_len
MOVX A, @DPTR
MOV DPTR, #C_ORDER_BUF_PARAM + 4
MOVX @DPTR, A
; Testen ob CAN-Task besetzt
CALL C_ENTER_DRIVER
CJNE A, #TRUE, LX_CDOX_1
SETUP_ORDER CAN_DEF_L_OBJ_ORDER_EXT, 0
; Befehle an CAN-Task aufsetzen
; CAN-Task starten
MOV R7, #C_DRIVER_ID
CALL _os_send_signal
MOV R7, #K_SIG
CALL _os_wait
;Returnwert retten
MOV DPTR, #C_ORDER_BUF_PARAM
MOVX A, @DPTR
PUSH ACC
CALL C_LEAVE_DRIVER
POP ACC
MOV R7, A
RET
LX_CDOX_1: MOV R7, #C_CAN_FAILURE
RET
$EJECT
;*---------------------------------------------------------------------*
;* C A N _ G E T _ S T A T U S
;*---------------------------------------------------------------------*
;* Funktion:
;* Lesen des aktuellen CAN-Controller Status.
;*
;* BEGIN
;* IF C_ENTER_DRIVER THEN
;* C_ORDER_BUF.ORDER := CAN_GET_STATUS_ORDER;
;* C_ORDER_BUF.TASK_ID := os_running_task_id ();
;* os_send_signal an CAN-Task;
;* os_wait (K_SIG,FFH,0);
;* C_LEAVE_DRIVER;
;* RETURN;
;* ELSE
;* RETURN C_CAN_FAILURE;
;* END IF;
;* END CAN_STOP;
;*
;*---------------------------------------------------------------------*
;* Parameter :
;*
;* --
;*
;* Returnwert in R7 :
;*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -