Hola
Bueno, gracias a vuestra ayuda, pude terminar la rutina.
Es una rutina para generar el checksum del protocolo ContactID utilizado para la comunicaci=F3n de alarmas.
Este es el c=F3digo:
;##########################################################################= ####
list p=3D16f877 ; list directive to define processor #include ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF
;##########################################################################= #### ; Variables **** ;***************
dtCtIDusr1 equ 0x20 ; | dtCtIDusr2 equ 0x21 ; | N=FAmero de dtCtIDusr3 equ 0x22 ; | usuario dtCtIDusr4 equ 0x23 ; | dtCtIDid1 equ 0x24 ; Identificador... dtCtIDid2 equ 0x25 ; ...de Contact ID dtCtIDnev equ 0x26 ; Indicador de nuevo evento (1 nuevo) dtCtIDev1 equ 0x27 ; | dtCtIDev2 equ 0x28 ; | Tipo de evento dtCtIDev3 equ 0x29 ; | dtCtIDprt1 equ 0x2A ; N=FAmero de... dtCtIDprt2 equ 0x2B ; ...partici=F3n dtCtIDzn1 equ 0x2C ; | dtCtIDzn2 equ 0x2D ; | N=FAmero de zona dtCtIDzn3 equ 0x2E ; | dtCtIDcksm equ 0x2F ; Checksum dtCtIDFIN equ 0x30 ; FIN dtCtIDSum equ 0x31 tmpChkSum equ 0x32
;##########################################################################= #### ; Direcciones de memoria **** ;****************************
ORG 0x000 ; processor reset vector clrf PCLATH ; ensure page bits are cleared goto Inicio ; go to beginning of program
;##########################################################################= #### ; Inicio **** ;************
Inicio ; inicializa los datos fijos movlw 0x01 movwf dtCtIDid1 ; Identificador de Contact ID movlw 0x08 ; 18 movwf dtCtIDid2 ;------------------- movlw 0x01 ; Indicador de nuevo evento 1 movwf dtCtIDnev ;------------------- movlw 0x0A ; N=FAmero de... movwf dtCtIDprt1 ; ...partici=F3n movlw 0x01 ; 01 movwf dtCtIDprt2 ;------------------- movlw 0x02 ; N=FAmero de... movwf dtCtIDusr1 ; ...usuario movlw 0x0A ; movwf dtCtIDusr2 ; movlw 0x05 ; movwf dtCtIDusr3 ; movlw 0x04 ; 2054 movwf dtCtIDusr4 ;------------------- ; setea los datos variables movlw 0x01 movwf dtCtIDev1 ; Tipo... movlw 0x03 ; ...de... movwf dtCtIDev2 ; ...evento movlw 0x01 ; 131 movwf dtCtIDev3 ;------------------- movlw 0x0A ; N=FAmero... movwf dtCtIDzn1 ; ...de... movlw 0x0A ; ...zona movwf dtCtIDzn2 ; movlw 0x04 ; 004 movwf dtCtIDzn3 ;------------------- call CalcChkSum goto Inicio
;##########################################################################= #### ; Suma y calcula el checksum **** ;********************************
CalcChkSum clrw bcf STATUS, C ; limpia los... bcf STATUS, DC ; ...registros bcf STATUS, Z ;------------------- addwf dtCtIDusr1, 0 ; suma los... addwf dtCtIDusr2, 0 ; ...componentes del... addwf dtCtIDusr3, 0 ; ...paquete addwf dtCtIDusr4, 0 ; addwf dtCtIDid1, 0 ; addwf dtCtIDid2, 0 ; addwf dtCtIDnev, 0 ; addwf dtCtIDev1, 0 ; addwf dtCtIDev2, 0 ; addwf dtCtIDev3, 0 ; addwf dtCtIDprt1, 0 ; addwf dtCtIDprt2, 0 ; addwf dtCtIDzn1, 0 ; addwf dtCtIDzn2, 0 ; addwf dtCtIDzn3, 0 ;------------------- movwf dtCtIDSum ; almacena el resultado de la suma
clrf tmpChkSum ; vacia la var temporal del checksum ClcCkSm_Cnt movlw 0x0F ; carga 0x15 en W... addwf tmpChkSum, 1 ; ...y lo suma al contenido de tmpChkSum movf dtCtIDSum, 0 ; copia la suma del paquete en W subwf tmpChkSum, 0 ; resta la suma (W) de tmpChkSum para ver si el resultado es negativo btfss STATUS, C ; verifica el bit de signo de la operaci=F3n goto ClcCkSm_Cnt ; si es negativo, vuelve para sumar 15 btfsc STATUS, Z ; pero si es positivo, el resultado queda en W y si es cero... movlw 0x0F ; ...escribe 0x0F en W movwf dtCtIDcksm ; escribe el checksum con el contenido de W return
;##########################################################################= ####
end
;##########################################################################= ####
Gracias por la ayuda.
Saludos-