16F877 y 16F628 - Sumar, restar y comparar

Feb 25, 2009 2 Replies

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.


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.

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-

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required