Comunicacion con rs232 assembler

Buenas, quiero hacerles una consulta, estoy intentando hacer una comunacion entre dos pics, uno tiene un dipsw que su informacion es llevada a otro pic para mostarlo en leds, es decir que la combinacion que se haga en el dipsw de un pic debe ser observada en los leds que estan en el otro pic. tengo agregados unos comandos para un lcd porq lo proximo que debo hacer es que un pic tendra un teclado matricial y el numero debo verlo en el lcd del otro pic. pero eso ya es otra cosa.
este es el codigo para el pic que envia la información al pic receptor:
PHP:
list P=16F877
#include <p16f877.inc>

;**********************ETIQUETAS***************************
#DEFINE HABILITA_LCD 		BSF PORTC,6
#DEFINE DESHABILITA_LCD 	BCF PORTC,6
#DEFINE LEE_LCD 			BSF PORTC,5
#DEFINE ESCRIBE_LCD			BCF PORTC,5
#DEFINE MODO_COMANDO		BCF PORTC,4
#DEFINE MODO_DATOS			BSF PORTC,4 
TEMP1 EQU 0X26
TEMP2 EQU 0X27
ORG 0X0000
	GOTO INICIO
ORG 0X0200
INICIO

BANKSEL TRISC
MOVLW 0X8F
MOVWF TRISC ;Se habilita los puertos 4,5 y 6 de C
CLRF TRISD  ;Todo el puerto D como salida para el LCD
MOVLW 0XFF
MOVWF TRISB ;Todo el puerto D como entrada para el Dipsw
BANKSEL RCSTA
MOVLW 0X90	; Habilito el RX para datos continuos
MOVWF RCSTA
BANKSEL TXSTA
MOVLW 0X20	;Velocidad Alta, en modo asíncrono y habilito TX
MOVWF TXSTA







;******************INICIALIZACION DEL LCD********************
	CALL TEMP_15MS
	MOVLW 0X38
	CALL COMANDO_LCD
	CALL TEMP_5MS
	MOVLW 0X38
	CALL COMANDO_LCD
	CALL TEMP_5MS
	MOVLW 0X38	
	CALL COMANDO_LCD
	CALL TEMP_5MS
	MOVLW 0X38   ; Function Set:8 bits, 2 lineas, 5x8 puntos 	
	CALL COMANDO_LCD
	CALL TEMP_5MS
	MOVLW 0X0C; Display off, cursor on, sin parpadeo
	CALL COMANDO_LCD
	MOVLW 0X01; Clear display
	CALL COMANDO_LCD
	MOVLW 0X06; Entry mode set:desplazamiento del cursor a la derecha, pantalla fija
	CALL COMANDO_LCD
	
	;******************TEMPORIZADOR 15MS*************************
TEMP_15MS
	BANKSEL TEMP1
	MOVLW 0X16
	MOVWF TEMP1
TEM1	
	DECFSZ TEMP1,F
	GOTO TEM2
	RETURN
TEM2
	MOVLW 0XFF
	MOVWF TEMP2
	DECFSZ TEMP2,F
	GOTO $-1
	GOTO TEM1
;*******************TEMPORIZADOR 5MS************************
TEMP_5MS
	BANKSEL TEMP1
	MOVLW 0X08
	MOVWF TEMP1
DELAY1	
	DECFSZ TEMP1,F
	GOTO DELAY2
	RETURN
DELAY2
	MOVLW 0XFF
	MOVWF TEMP2
	DECFSZ TEMP2,F
	GOTO $-1
	GOTO DELAY1
	
	;************************RUTINAS LCD************************
COMANDO_LCD
BANKSEL PORTD
	ESCRIBE_LCD
	MODO_COMANDO
	HABILITA_LCD
	MOVWF PORTD
	DESHABILITA_LCD
	CALL TEMP_256us
	RETURN
;
;*********************TEMPORIZADOR 256us********************
TEMP_256us
BANKSEL TEMP1
	MOVLW 0XFF
	MOVWF TEMP1
	DECFSZ TEMP1,F
	GOTO $-1
	RETURN

DATOS_LCD
BANKSEL PORTD
	ESCRIBE_LCD
	MODO_DATOS
	HABILITA_LCD
	MOVWF PORTD	
	DESHABILITA_LCD
	CALL TEMP_256us
	RETURN






INTER   
	BANKSEL PIR1
;	btfss   PIR1,RCIF   ;¿recepcion?
  ;    goto   $+ 3     ;No. Falsa interrupcion
 ;     bcf      PIR1,RCIF      ;Si. Reponer Flag
;      movf   RCREG,W      ;Lectura dato recibido
      ; movwf   PORTB      ;Visualiza dato recibido CALL RECIBIR
INT	BTFSS PIR1,TXIF
	GOTO INT
	BCF PIR1,TXIF
	MOVF PORTB,W
	CALL ENVIAR
	GOTO INTER

ENVIAR
	   	
		movwf    TXREG           ; envío el dato en acunulador w
   		bsf    STATUS,   RP0   ; Pág 1 RAM
		Espere    btfss    TXSTA,   TRMT    ; transmision completa si es alto
        goto    Espere
      
        return

end

y este es el codigo para el pic receptor
PHP:
list P=16F877
INCLUDE <P16F877.INC>

org 0x00
GOTO INICIO
GOTO 0X05

INICIO

BANKSEL TRISB
CLRF TRISB ;Todo el puerto B como SALIDA para LOS LEDS
BANKSEL RCSTA
MOVLW 0X90	; Habilito el RX para datos continuos
MOVWF RCSTA
BANKSEL TXSTA
MOVLW 0X20	;Velocidad Alta, en modo asíncrono y habilito TX
MOVWF TXSTA



INTER   
	BANKSEL PIR1
	btfss   PIR1,RCIF   ;¿recepcion?
      goto   $+ 3     ;No. Falsa interrupcion
      bcf      PIR1,RCIF      ;Si. Reponer Flag
     movf   RCREG,W      ;Lectura dato recibido
       movwf   PORTB      ;Visualiza dato recibido CALL RECIBIR
;INT	BTFSS PIR1,TXIF
;	GOTO INT
;	BCF PIR1,TXIF
;	MOVF PORTB,W
;	CALL ENVIAR
	GOTO INTER

ENVIAR
	   	
		movwf    TXREG           ; envío el dato en ACUMULADOR w
   		bsf    STATUS,   RP0   ; Pág 1 RAM
		Espere    btfss    TXSTA,   TRMT    ; transmision completa si es alto
        goto    Espere
      
        return

end
Cuando lo simulo en proteus no funciona, sera que no estoy usando bien el protocolo rs232?

otra pregunta, cuando conecto los pics debe ser directo los tx con los rc del puerto C? o debo colocar alguna compuerta lógica antes?
 
Última edición:
Atrás
Arriba