16F877 y 16F628 - Sumar, restar y comparar

Hola

Necesito realizar estas operaciones:

Sumo 12 variables, del resultado debo obtener el siguiente mayor m=FAltiplo de 8 y al m=FAltiplo obtenido le tengo que restar el resultado de la suma, todo esto en un 16F877 y en un 16F628

para sumar y restar utilizo ADDWF o ADDLW y SUBWF pero no deduzco como comparar, me dan una ayuda?

Muchas gracias.

Reply to
LucasBols
Loading thread data ...

No necesitas comparar, de todos modos las comparaciones las puees hacer restando y comprobando los flags, tengo muy olvidados los pics para decirte ahora exactamenbte las instrucciones concretas, pero en asm se hace así, restas dos numeros y compruebas el signo o los flags del resultado.

Pero obtener el siguiente multiplo de 8 es muy facil de otro modo, solo súmale 7 al número y luego pon los tres bits más bajos a cero.

Claro que si todo esto es para restarlo luego con la suma, quizas es que solo te interesan esos tres bits precisamente, y entonces ya sería purio masoquismo complicarse tanto, puesto que en ese caso podrías simplemente ir sumando, olvidando acarreos y rescatando los tres bits con un simple and al final.

Reply to
Nolo Pongo

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-

Reply to
LucasBols

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.