Autor | Mensaje |
---|
| Asunto: 16F877 y 16F628 - Sumar, restar y comparar Publicado: 25 Feb, 2009 - 01:59 |
| Nuevo en el Foro

Registrado: 23 Feb, 2009
Mensajes: 6
|
| Hola
Necesito realizar estas operaciones:
Sumo 12 variables, del resultado debo obtener el siguiente mayor múltiplo de 8 y al múltiplo 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. |
| |
|
| |  | | Asunto: CheckSum Publicado: 25 Feb, 2009 - 06:12 |
| Nuevo en el Foro

Registrado: 23 Feb, 2009
Mensajes: 6
|
| Hola
Bueno, pude terminar la rutina.
Es una rutina para generar el checksum del protocolo ContactID utilizado para la comunicación de alarmas.
Este es el código:
;##############################################################################
list p=16f877 ; list directive to define processor
#include <p16f877.inc> ; 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úmero 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úmero de...
dtCtIDprt2 equ 0x2B ; ...partición
dtCtIDzn1 equ 0x2C ; |
dtCtIDzn2 equ 0x2D ; | Número 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úmero de...
movwf dtCtIDprt1 ; ...partición
movlw 0x01 ; 01
movwf dtCtIDprt2 ;-------------------
movlw 0x02 ; Número 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úmero...
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ón
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
;##############################################################################
Saludos- |
| |
|
| |  | | Asunto: Publicado: 04 Mar, 2009 - 07:51 |
| Experto

Registrado: 03 Sep, 2008
Mensajes: 125
|
| Utiliza las directivas que te vien el MPLAB 8.20, también anteriores.
Tipo así:
(5/2)+(2*3) |
| |
|
| |  |
|
|