Rx
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC & _BODEN_OFF &_LVP_OFF &_CPD_OFF &_WRT_OFF
ERRORLEVEL -302 ;para que no se notifiquen los errires por los registros fuera del banco de ram.
;
;---------------------------------------------------------------
;MACROS
;---------------------------------------------------------------
BANK0 MACRO ;macro para la seleccion del banco 0
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANK1 MACRO ;macro para la seleccion del banco 1
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;
CBLOCK H'20'
TEMP1
TEMP2
TEMP3
TEMP4
DATO1
DATO2
DATO3
DATO4
Dividendo_c
Dividendo_b
Dividendo_a
Divisor_b
Divisor_a
Temp0
Resto_b
Resto_a
millar
centena
decena
unidad
decimo
dem1
dem2
dem3
cuenta_tabla
cursor
curdisp
poeslcd
temperaturaAL
temperaturaBA
humedad
v_direcciónAL
v_direcciónBA
v_velocidad
precipitaciónAL
precipitaciónBA
presiónAL
presiónBA
estado1
estado2
trabajoAL
trabajoBA
temp_negativo ;bit0 si es 1, la temperatura es negativa, si es 0 la temperatura es positiva.
ENDC
;
;******************************************
;BLOQUE DE MEMORIA ACCESIBLE DE TODOS LOS BANCOS 70h A 7Fh.
;******************************************
;
CBLOCK H'70'
SALVAR_W ;SALVA EL CONTENIDO DE W EN UN INTERRUPCIÓN
SALVAR_STATUS ;SALVA EL CONTENIDO DE STATUS EN UNA INTERRUPCIÓN
SALVAR_FSR ;SALVA EL CONTENIDO DE FSR EN UNA INTERRUPCIÓN
SALVAR_PCLATH ;SALVA EL CONTENIDO DE PCLATH EN UNA INTERRUPCIÓN
SALVAR_OPTION_REG ;SALVA EL CONTENIDO DE OPTION_REG EN UNA INTERRUPCIÓN
estado ;7F ESTE REGISTRO NOS PERMITE SABER SI HAY DATOS POSITIVOS Y/O NEGATIVOS PARA LA TEMPERATURA.
ENDC
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIÓN
INTERRUP
;*****************************************************************************************************************************
;RECEPCIÓN DE DATOS POR LA USART
;*****************************************************************************************************************************
MOVWF SALVAR_W ;SALVA EL CONTENIDO DE W
SWAPF STATUS,W ;PASAMOS A W STATUS (ES CON SWAPF PARA NO AFECTAR EL BIT Z)
MOVWF SALVAR_STATUS ;SALVA EL CONTENIDO DE STATUS
SWAPF FSR,W ;PASAMOS A W FSR
MOVWF SALVAR_FSR ;SALVA FSR
SWAPF PCLATH,W ;PASAMOS A W PCLATH (Pagina de programa)
MOVWF SALVAR_PCLATH ;SALVA EL CONTENIDO DE PCLATH
BCF STATUS,RP1
BSF STATUS,RP0 ;BANCO 1
SWAPF OPTION_REG,W ;PASAMOS A W OPTION_REG (Bancos)
MOVWF SALVAR_OPTION_REG ;SALVA EL CONTENIDO DE OPTION_REG
BCF STATUS,RP0 ;BANCO 0
BTFSS PIR1,RCIF ;¿SE ACTIVÓ RECEPCIÓN USART?
GOTO SALIR ;FALSA INTERRUPCIÓN
BCF PIR1,RCIF ;SI, REESTABLECEMOS EL BIT DE RCIF
;********************************************************************************************************************************
;estado1:
; b0: 1: Se recibió la sincronización AA
; 0: No se recibió la sincronozación AA
;
; b1: 1: Se recibió ambos sincronización AA y 55
; 0: No se recibió ninguna de las sincronizaciones AA y 55
;
;estado2:
; b0: 1: Se recibió el primer dato
; 0: No se recibió ningún dato
;
; b1: 1: Se recibió el segundo dato
; 0: No se recibió ningún dato
;
; b2: 1: Se recibió el tercer dato
; 0: No se recibió ningún dato
;
; b3: 1: Se recibió el cuarto dato
; 0: No se recibió ningún dato
;
; b4: 1: Se recibió el quinto dato
; 0: No se recibió ningún dato
;
; b5: 1: Se recibió el sexto dato
; 0: No se recibió ningún dato
;
; b6: 1: Se recibió el séptimo dato
; 0: No se recibió ningún dato
;
; b7: 1: Se recibió el octavo dato
; 0: No se recibió ningún dato
;-----------------------------------------------------------------------------------------------------------------------------------
;PROTOCOLO:
;-----------
;1- Salvamos los datos de W, OPTION REG, STATUS, FSR, PCLATH.
;2- ¿HUBO INTERRUPCIÓN POR RECEPCIÓN DE USART?
;3- NO, VAMOS A SALIR Y AQUÍ SE REESTABLECEN LOS DATOS GUARDADOS ANTERIORMENTE.
;4- SI, ¿RECIBIMOS EL DATO AA?
;5- NO, SI EL DATO RECIBIDO ES AA PONEMOS A 1 EL BIT 0 DEL REG. ESTADO1, EN CASO NEGATIVO VAMOS A SALIR.
;6- SI; YA RECIBIMOS AA, AHORA ¿RECIBIMOS EL DATO 55? NO--> SI EL DATO RECIBIDO ES 55 PONEMOS A 1 EL BIT 1 DEL REG. ESTADO1, EN CASO NEGATIVO VAMOS A SALIR.
;7- SI; YA RECIBIMOS EL DATO 55.
;8- A PARTIR DE ACÁ, PREGUNTAMOS UNO POR UNO LOS DATOS YA RECIBIDOS. PREGUNTAMOS POR EL PRIMERO, SI YA LO RECIBIMOS, PREGUNTAMOS POR EL SEGUNDO Y ASÍ
; SUSECIVAMENTE HASTA EL OCTAVO DATO, SI EL OCTAVO DATO YA LO RECIBIMOS, EL DATO A GUARDAR ES EL NOVENO QUE CORRESPONDE A LA PARTE BAJA DE LA PRESIÓN (presiónBA)
; AL LLEGAR A ESTE PUNTO, BORRAMOS LOS DOS REGISTROS ESTADO1 Y ESTADO2.
; EN CASO DE TOPARNOS CON LA OPCIÓN DE QUE UN DATO NO FUE RECIBIDO, LO GUARDAMOS Y MARCAMOS 1 EL BIT CORRESPONDIENTE AL REGISTRO ESTADO2
; POR EJEMPLO, PREGUNTAMOS POR EL PRIMER DATO, SI NO LO RECIBIMOS, LO GUARDAMOS EN temperaturaAL Y PONEMOS A 1 EL BIT 0 DEL REGISTRO ESTADO2 Y VAMOS A SALIR.
; AL RETORNAR POR OTRA INTERRUPCIÓN, PASAREMOS POR EL CONTROL DE LA SINCRONIZACIÓN Y LLEGAREMOS AL PUNTO EN QUE PREGUNTAMOS POR EL PRIMER DATO, LA RESPUESTA SERÁ
; AFIRMATIVA AL PREGUNTAR SI RECIBIMOS EL PRIMER DATO. PREGUNTAMOS SI RECIBIMOS EL SEGUNDO DATO, AL SER NEGATIVO, GUARDAMOS EL VALOR EN temperaturaBA Y PONEMOS A 1
; EL BIT 1 DEL REGISTRO ESTADO2.
;------------------------------------------------------------------------------------------------------------------------------------
BSF PORTC,0 ;ENCENDEMOS EL LED DE RECEPCIÓN
BTFSS estado1,0 ;¿RECIBIMOS EL DATO AA DE LA SINCRONIZACIÓN?
GOTO NO_AA ;NO, VAMOS A NO_AA PARA PREGUNTAR SI EL DATO QUE RECIBIMOS AHORA ES AA
BTFSS estado1,1 ;SI, ¿RECIBIMOS EL DATO 55 DE LA SINCRONIZACIÓN?
GOTO NO_55 ;NO, VAMOS A NO_55 PARA PREGUNTAR SI EL DATO QUE RECIBIMOS AHORA ES 55
BTFSS estado2,0 ;SI, ¿RECIBIMOS EL DATO DE temperaturaAL?
GOTO NO_TEMPAL ;NO, VAMOS A NO_TEMPAL PARA GUARDAR EL DATO ACÁ Y AJUSTAMOS EL BIT ESTADO2,0
BTFSS estado2,1 ;SI, ¿RECIBIMOS EL DATO DE temperaturaBA?
GOTO NO_TEMPBA ;NO, VAMOS A NO_TEMPBA PARA GUARDAR EL DATO ACÁ Y AJUSTAMOS EL BIT ESTADO2,1
BTFSS estado2,2 ;SI, ¿RECIBIMOS EL DATO DE humedad?
GOTO NO_HUM ;NO, VAMOS A NO_HUM PARA GUARDAR EL DATO ACÁ Y AJUSTAMOS EL BIT ESTADO2,2
BTFSS estado2,3 ;SI, ¿RECIBIMOS EL DATO DE v_direcciónAL?
GOTO NO_V_DIRAL ;NO, VAMOS A NO_V_DIRAL PARA GUARDAR EL DATO ACÁ Y AJUSTAMOS EL BIT ESTADO2,3
BTFSS estado2,4 ;SI, ¿RECIBIMOS EL DATO DE v_direcciónBA?
GOTO NO_V_DIRBA ;NO, VAMOS A NO_V_DIRBA PARA GUARDAR EL DATO ACÁ Y AJUSTAMOS EL BIT ESTADO2,4
BTFSS estado2,5 ;SI, ¿RECIBIMOS EL DATO DE v_velocidad?
GOTO NO_V_VEL ;NO, VAMOS A NO_V_VEL PARA GUARDAR EL DATO ACÁ Y AJUSTAMOS EL BIT ESTADO2,5
BTFSS estado2,6 ;SI, ¿RECIBIMOS EL DATO DE precipitaciónBA?
GOTO NO_PRE ;NO, VAMOS A NO_PRE PARA GUARDAR SUMARLE EL DATO RECIBIDO A precipitaciónBA Y SI HAY ACARREO, SUMAR 1 A precipitaciónAL
BTFSS estado2,7 ;SI, ¿RECIBIMOS EL DATO DE presiónAL?
GOTO NO_PREAL ;NO, VAMOS A NO_PREAL PARA GUARDAR EL DATO ACÁ Y AJUSTAMOS EL BIT ESTADO2,7
MOVFW RCREG ;SI, EL DATO RECIBIDO CORRESPONDDE A presiónBA. RECUPERAMOS EL VALOR RECIBIDO
MOVWF presiónBA ;Y LO PASAMOS A presiónBA.
CLRF estado1 ;BORRAMOS ESTE REGISTRO PARA RECIBIR DE NUEVO LA SINCRONIZACIÓN
CLRF estado2 ;BORRAMOS ESTE REGISTRO PARA RECIBIR DATOS DESDE temperaturaAL
;
SALIR BSF STATUS,RP0 ;BANCO 1
SWAPF SALVAR_OPTION_REG,W ;RESTAURA EL VALOR A OPTION_REG
MOVWF OPTION_REG
SWAPF SALVAR_PCLATH,W ;RESTAURA EL VALOR A PCLATH
MOVWF PCLATH
SWAPF SALVAR_FSR,W ;RESTAURA EL VALOR A FSR
MOVWF FSR
SWAPF SALVAR_STATUS,W ;RESTAURA EL VALOR A STATUS
MOVWF STATUS
SWAPF SALVAR_W,W ;RESTAURA EL VALOR A W
BCF PORTC,0 ;APAGAMOS EL LED DE RECEPCIÓN
RETFIE
;
NO_AA MOVLW H'AA' ;HACEMOS UNA RESTA PARA PREGUNTAR SI EL DATO DE AHORA ES AA
SUBWF RCREG,W ;RESTAMOS Y EL RESULTADO LO GUARDAMOS EN W
BTFSS STATUS,Z ;SI ES 1, EL RESULTADO ES 0, POR CONSIGUIENTE EL VALOR ES AA
GOTO SALIR ;NO, EL DATO RECIBIDO NO ES AA. VAMOS A SALIR
BSF estado1,0 ;SI, AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS.
GOTO SALIR ;NOS VAMOS.
;
NO_55 MOVLW H'55' ;HACEMOS UNA RESTA PARA PREGUNTAR SI EL DATO DE AHORA ES 55
SUBWF RCREG,W ;RESTAMOS Y EL RESULTADO LO GUARDAMOS EN W
BTFSS STATUS,Z ;SI ES 1, EL RESULTADO ES 0, POR CONSIGUIENTE EL VALOR ES 55
GOTO SALIR ;NO, EL DATO RECIBIDO NO ES 55. VAMOS A SALIR
BSF estado1,1 ;SI, AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS.
GOTO SALIR ;NOS VAMOS.
;
NO_TEMPAL MOVFW RCREG ;RECUPERAMOS EL DATO RECIBIDO POR LA USART
MOVWF temperaturaAL ;LO GUARDAMOS EN LA MEMORIA PARA LUEGO SER MOSTRADO EN EL LCD
BSF estado2,0 ;AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS
GOTO SALIR
;
NO_TEMPBA MOVFW RCREG ;RECUPERAMOS EL DATO RECIBIDO POR LA USART
MOVWF temperaturaBA ;LO GUARDAMOS EN LA MEMORIA PARA LUEGO SER MOSTRADO EN EL LCD
BSF estado2,1 ;AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS
GOTO SALIR
;
NO_HUM MOVFW RCREG ;RECUPERAMOS EL DATO RECIBIDO POR LA USART
MOVWF humedad ;LO GUARDAMOS EN LA MEMORIA PARA LUEGO SER MOSTRADO EN EL LCD
BSF estado2,2 ;AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS
GOTO SALIR
;
NO_V_DIRAL MOVFW RCREG ;RECUPERAMOS EL DATO RECIBIDO POR LA USART
MOVWF v_direcciónAL ;LO GUARDAMOS EN LA MEMORIA PARA LUEGO SER MOSTRADO EN EL LCD
BSF estado2,3 ;AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS
GOTO SALIR
;
NO_V_DIRBA MOVFW RCREG ;RECUPERAMOS EL DATO RECIBIDO POR LA USART
MOVWF v_direcciónBA ;LO GUARDAMOS EN LA MEMORIA PARA LUEGO SER MOSTRADO EN EL LCD
BSF estado2,4 ;AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS
GOTO SALIR
;
NO_V_VEL MOVFW RCREG ;RECUPERAMOS EL DATO RECIBIDO POR LA USART
MOVWF v_velocidad ;LO GUARDAMOS EN LA MEMORIA PARA LUEGO SER MOSTRADO EN EL LCD
BSF estado2,5 ;AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS
GOTO SALIR
;
NO_PRE MOVFW RCREG ;RECUPERAMOS EL DATO RECIBIDO POR LA USART
ADDWF precipitaciónBA,F ;Y LO SUMAMOS A LA PARTE BAJA DE LA PRECIPITACIÓN
BTFSS STATUS,C ;¿HUBO ACARREO?
GOTO AJUS_BIT
MOVLW .1
ADDWF precipitaciónAL,F ;SUMO 1 A LA PARTE ALTA DE LA PRECIPITACIÓN
AJUS_BIT BSF estado2,6 ;AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS
GOTO SALIR
;
NO_PREAL MOVFW RCREG ;RECUPERAMOS EL DATO RECIBIDO POR LA USART
MOVWF presiónAL ;LO GUARDAMOS EN LA MEMORIA PARA LUEGO SER MOSTRADO EN EL LCD
BSF estado2,7 ;AJUSTAMOS EL BIT PARA INDICAR QUE YA LO RECIBIMOS
GOTO SALIR
;*****************************************************************************************************
;
;************************************************************************************************
;CONFIGURO LOS PUERTOS COMO ENTRADA Y SALIDAS Y ACTIVO LA INTERRUPCIÓN.
;************************************************************************************************
;
INICIO BCF STATUS,RP0 ;BANCO 0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTC
CLRF PORTE
CLRF precipitaciónBA
CLRF precipitaciónAL
BSF STATUS,RP0 ;BANCO 1
MOVLW B'11000000' ;HABILITO INTERRUPCIONES GENERALES.
MOVWF INTCON
CLRF TRISC ;PUERTO C SALIDA.
BSF TRISC,7 ;RC7 ENTRADA.
CLRF TRISB ;PUERTO B SALIDA.
CLRF TRISD ;PUERTO D SALIDA.
CLRF TRISE ;PUERTO E SALIDA.
;************************************************************************************************
;CONFIGURO EL USART: ASINCRONO, 2400 BAUDIOS, 8 BIT DE DATOS, SIN PARIDAD (SE HACE UNA SOLA VEZ Y AL PRINCIPIO DEL PROGRAMA.
;************************************************************************************************
BANK1
movlw .25 ;valor para seleccionar 9600 baudios
movwf SPBRG
movlw b'00100100' ;Configuracion USART modo alta velocidad 9600 baud y activacion de transmision
movwf TXSTA ;carga valor anterior en registro asociado al generador del baud rate
bsf PIE1,RCIE ;Habilitacion interrupcion RX
BANK0 ;Cambio al banco 0
movlw b'10010000' ;Configuracion de la usart
movwf RCSTA ;para recepcion continua y habilitacion de la usart
movlw b'11000000' ;Habilitacion para las
movwf INTCON ;interrupciones generales
;MOVLW D'25'
;MOVWF SPBRG ;AJUSTAMOS PARA 2400 BAUDIOS.
;BCF TXSTA,BRGH ;BAJA VELOCIDAD.
;BCF TXSTA,SYNC ;MODO ASINCRONO
;BCF STATUS,RP1
;BCF STATUS,RP0 ;BANCO 0
;BSF RCSTA,SPEN
;BCF RCSTA,RX9 ;8 BIT DE DATOS
;BSF RCSTA,CREN ;HABILITAMOS LA RECEPCIÓN.
;BSF STATUS,RP0 ;BANCO 1
;BSF PIE1,RCIE ;HABILITAMOS LA INTERRUPCIÓN POR RECEPCIÓN DE LA USART
;BCF STATUS,RP0 ;BANCO 0
;BCF PIR1,RCIF
;
END
Noten que en la parte que configuro a la usart, hay varias instrucciones con ";", estas instrucciones las omití porque son de una configuración fallida.
Ya he probado a modo de alta y baja velocidad y nada. Lo más extraño es que con el MPLAB, simulando la USART, entra a la interrupción, pero en la realidad jamás entra a la interrupción porque no prende ni apaga el led indicándome que no recibe nada. Los datos en el LCD se muestran perfectamente.
Si alguien quiere los hex para simularlo en el proteus, no dejen de pedirlo.
Al momento, estoy comunicando a los pic con un cable entre ellos en sus respectivos pines. Ya cambié los PIC y nada.
Fin parte II de II