No se olviden de la exitación de las bobinas del relé,
ojo al piojo con esto
saludos!!
¿Flacoclau a qué te referís?
Azicuetano estoy utilizando dos 16F873A y dos 16F628A, uno de éstos (METROS) todavía no lo he puesto, entonces lo de los fuses se aplicaría sólo a un 16F628A, que es el que se encarga de la comunicación, y le he cargado dos fuses, pero sólo para probar.
Este es el programa:
'****************************************************************
'* Name : VES-TRACE.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2007 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 15/04/2008 *
'* Version : 1.0 *
'* Notes : PROGRAMA PARA EL PIC 16F628A EN DONDE ESTA LA *
'* : COMUNICACIÓN HACIA EL PC. *
'****************************************************************
SYMBOL TXPIC = PORTB.7 'Para decirle al 16F873 que esta listo para recibir datos
SYMBOL RXPIC = PORTB.6 'Para saber que ocurrió un evento y para recibir los datos del 16F873
SYMBOL TX = PORTB.2 'Para enviar datos al PC
SYMBOL RX = PORTB.1 'Para recibir datos del PC
symbol TRANS = PORTB.5 'Para controlar la transmisión al PC por medio del 75176
UNIDAD VAR BYTE[8] 'Donde se van a guardar los datos recibidos del PC
UNIT VAR BYTE[16] 'Donde se van a guardar los datos recibidos del 16F873
i VAR BYTE 'Para los ciclos for
'Definición de datos de CRC
CRCRX var word 'registro donde se almacenara el resultado del CRCRX
CRCTX var word 'registro donde se almacenara el resultado del CRCTX
cuenta1 var byte 'variable interna de la subrutina 1 del CRC
bit_dato1 var byte 'variable interna de la subrutina 1 del CRC
cuenta2 var byte 'variable interna de la subrutina 2 del CRC
bit_dato2 var byte 'variable interna de la subrutina 2 del CRC
CRCRX1 var CRCRX.BYTE0 'CRC1 es el primer byte del word CRCRX
CRCRX2 var CRCRX.byte1 'CRC2 es el segundo byte del word CRCRX
CRCTX1 var CRCTX.BYTE0 'CRC1 es el primer byte del word CRCTX
CRCTX2 var CRCTX.byte1 'CRC2 es el segundo byte del word CRCTX
'****************** PROGRAMA ************************************
@ DEVICE pic16f628A, MCLR_OFF 'Master Clear Externo desconectado
@ DEVICE pic16f628A, INTRC_OSC_NOCLKOUT 'Reloj interno solo
TRISB = %01011011
TRISA = %111111
PORTA = 0:PORTB = 0
UNIT[0] = 1
'RECEPCIÓN DE DATOS QUE VIENEN DEL 16F873A PRINCIPAL
SER_UNI1:
IF RXPIC = 1 THEN
GOSUB LIMP_UNIT
HIGH TXPIC
LOW TRANS
FOR i = 0 TO 15
SERIN2 RXPIC,84,1000,SER_UNI2,[UNIT
]
NEXT i
UNIT[0] = 1
LOW TXPIC
ENDIF
'RECEPCIÓN Y ENVIO DE DATOS DESDE Y HACIA EL PC
SER_UNI2:
GOSUB LIMP_UNIDAD
LOW TRANS
SERIN2 RX,84,1000,SER_UNI1,[UNIDAD[0]]
IF UNIT[0] = UNIDAD[0] THEN
FOR i = 1 TO 7
SERIN2 RX,84,1000,SER_UNI1,[UNIDAD]
NEXT i
UNIT[1] = UNIDAD[1]
gosub CALC_CRC1
GOSUB CALC_CRC2
HIGH TRANS
HIGH TX
FOR i = 0 TO 15
SEROUT2 TX,84,[UNIT]
NEXT i
SEROUT2 TX,84,[CRCTX2,CRCTX1]
LOW TRANS
GOTO SER_UNI1
else
pause 6
goTO SER_UNI1
endif
'Subrutina de cálculo del CRC de la trama recibida desde el PC
CALC_CRC1:
CRCRX = $FFFF 'inicio del CRCRX
FOR cuenta1 = 0 TO 5 'bucle de análisis de byte
CRCRX = CRCRX ^ UNIDAD[cuenta1] 'or exclusiva
FOR bit_dato1 = 0 to 7 'bucle de análisis de bit de cada byte
if (crcRX&$01) = 1 then 'si el bit es uno
CRCRX = (CRCRX>>1)^ $A001 'desplaza y efectua or exclusiva
else
crcRX = crcRX>>1 'si el bit fué 0 sólo desplaza
ENDIF
NEXT bit_dato1
NEXT cuenta1
IF (CRCRX1 = UNIDAD[6]) AND (CRCRX2 = UNIDAD[7]) THEN RETURN
GOTO SER_UNI1
'Subrutina de cálculo del CRC de la trama que se va a transmitir al PC
CALC_CRC2:
CRCTX = $FFFF 'inicio del CRCTX
FOR cuenta2 = 0 TO 15 'bucle de análisis de byte
CRCTX = CRCTX ^ unit[cuenta2] 'or exclusiva
FOR bit_dato2 = 0 to 7 'bucle de análisis de bit de cada byte
if (crcTX&$01) = 1 then 'si el bit es uno
CRCTX = (CRCTX>>1)^ $A001 'desplaza y efectua or exclusiva
else
crcTX = crcTX>>1 'si el bit fué 0 sólo desplaza
ENDIF
NEXT bit_dato2
NEXT cuenta2
RETURN
LIMP_UNIDAD:
FOR i = 0 TO 7
UNIDAD = 0
NEXT i
RETURN
LIMP_UNIT:
FOR i = 0 TO 15
UNIT = 0
NEXT i
RETURN
end