FAQ FAQ  •  Buscar Buscar  •  Registrarse Registrarse  •  Entre para ver sus mensajes privados Entre para ver sus mensajes privados  • Login Login

16F877 y 16F628 - Sumar, restar y comparar

Índice de los Foros Electronica Facil » FOROS ELECTRONICA » Microcontroladores PIC
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
AutorMensaje
LucasBols
Asunto: 16F877 y 16F628 - Sumar, restar y comparar MensajePublicado: 25 Feb, 2009 - 01:59
Nuevo en el Foro
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.
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
LucasBols
Asunto: CheckSum MensajePublicado: 25 Feb, 2009 - 06:12
Nuevo en el Foro
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-
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Meta
Asunto:  MensajePublicado: 04 Mar, 2009 - 07:51
Experto
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)
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Mostrar mensajes anteriores:     
Cambiar a:  
Todas las horas son GMT
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
 Índice de los Foros Electronica Facil » FOROS ELECTRONICA »  Microcontroladores PIC
powered by phppowered by MySQLPOWERED BY APACHEPOWERED BY CentOS© 2004 - 2025Información Legalpoliticas de cookiesipv6 ready