Tengo un problema relacionado con este tema, tengo un termometro digital y mediante el hyperterminal si le envío una letra mayuscula en particular me envia la temperatura y si le envio la misma letra minuscula es para introducir el set point. El 485 que va conectado al Pic tiene su linea de control conectada al mismo, y la que va junto al max232 a la PC se controla manualmente mediante un interruptor. Cuando le pido la temperatura me funciona bien, pero no me envía bien el retorno de linea y cambio de linea, solo me envía el segundo que escriba de los dos. En cuanto al set point yo mando un mensaje al hyperterminal que dice algo como "Introduzca el set point" pero no me lo envía no se por que. Aqui esta una parte del codigo
INICIO:
call Cond_Iniciales
Principal:
btfss flagi,1
goto sigue
call Convertir
bcf flagi,1
call Mostrar
sigue:
call atencion_int
call comparar_temp_setpoint
goto Principal
;********************************************************************
;--------------------------------------------------------------------
; Subrutinas...
;-------------------------------------------------------------------
INTERRUPCION:
btfss PIR1,RCIF
goto check_tmro_int
banksel PIR1
bcf PIR1,RCIF
bsf flagi,0
movf RCREG,w
movwf Dato_recibido
goto salir_de_interrupcion
check_tmro_int:
btfss INTCON,T0IF
goto salir_de_interrupcion
banksel TMR0
movlw 0x3C
movwf TMR0
banksel INTCON
bcf INTCON,T0IF
incf cuenta_convertir
bcf STATUS,C
movf cuenta_convertir,w
sublw 0x28
btfsc STATUS,C
goto salir_de_interrupcion
clrf cuenta_convertir
bsf flagi,1
goto salir_de_interrupcion
salir_de_interrupcion:
movf pclath_Anterior,w
movwf PCLATH
movf status_Anterior,w
movwf STATUS
movf w_Anterior,w
retfie
;-------------------------------------------------------------------
atencion_int:
btfss flagi,0
goto volver
bcf flagi,0
movlw 0x60
bcf STATUS,C
subwf Dato_recibido,w
movwf ID
movf PORTA,w
andlw b'00111100'
movwf rest
bcf STATUS,C
rrf rest
rrf rest,w
bcf STATUS,Z
subwf ID,w
btfss STATUS,Z
goto check_set_point
call CarryRet_USART
call NextLine_USART
call Enviar_temp
goto volver
check_set_point:
bcf flagi,0
movlw 0x40
bcf STATUS,C
subwf Dato_recibido,w
movwf ID
movf PORTA,w
andlw b'00111100'
movwf rest
bcf STATUS,C
rrf rest
rrf rest,w
bcf STATUS,Z
subwf ID,w
btfss STATUS,Z
goto volver
call CarryRet_USART
call NextLine_USART
clrf puntero
call mensaje_serial
call CarryRet_USART
call NextLine_USART
call tomar_set_point
goto volver
tomar_set_point:
movlw 0x20
movwf FSR
bcf PIE1,RCIE
bcf INTCON,T0IE
ciclo_set:
btfss PIR1,RCIF
goto ciclo_set
bcf PIR1,RCIF
bcf STATUS,C
movf Dato_recibido,w
sublw 0x40
btfss STATUS,C
goto ciclo_set
bcf STATUS,Z
movf Dato_recibido,w
xorlw 0x0D
btfsc STATUS,Z
goto limpiar_flag
bcf STATUS,Z
movf Dato_recibido,w
xorlw 0x2E
btfss STATUS,Z
goto sigue_set1
movf Dato_recibido,w
call DatoUSART_Tx
goto ciclo_set
sigue_set1:
movf Dato_recibido,w
call DatoUSART_Tx
movlw 0x30
bcf STATUS,C
subwf Dato_recibido,w
movwf INDF
incf FSR
movf FSR,w
bcf STATUS,Z
xorlw 0x23
btfsc STATUS,Z
goto limpiar_flag
goto ciclo_set
limpiar_flag:
bcf flagset,0
call CarryRet_USART
call NextLine_USART
bsf PIE1,RCIE
bsf INTCON,T0IE
return
volver: return
Enviar_temp
bsf Control_pin
call Retardo
movlw 0x30
addwf ID,f
movlw 'T'
call DatoUSART_Tx
movlw '#'
call DatoUSART_Tx
movf ID,w
call DatoUSART_Tx
movlw ':'
call DatoUSART_Tx
movlw ' '
call DatoUSART_Tx
movf DIGIT5,w
addlw 0x30
call DatoUSART_Tx
movf DIGIT4,w
addlw 0x30
call DatoUSART_Tx
movlw '.'
call DatoUSART_Tx
movf DIGIT3,w
addlw 0x30
call DatoUSART_Tx
Movlw ' '
call DatoUSART_Tx
Movlw 'C'
call DatoUSART_Tx
bcf Control_pin
return
mensaje_serial:
movlw LOW(Tablaset_point)
movwf Offset_L
movlw HIGH(Tablaset_point)
movwf Offset_H
movf puntero,w
addwf Offset_L,f
btfss STATUS,Z
goto $+3
movlw .1
addwf Offset_H,f
movf Offset_H,w
movwf PCLATH
movf puntero,w
Lcall Tablaset_point
movwf var
movlw 0x00
addwf var
btfsc STATUS,Z
goto salir_mensaje
movf var,w
call DatoUSART_Tx
incf puntero
goto mensaje_serial
salir_mensaje:
return
Tablaset_point:
addwf PCL,f
tablaset: EQU $
DT " Introduzca el set point entre 40 y 90 ",0x00