TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Murphist en 10 de Febrero de 2010, 12:07:45
-
Bueno, hola a todos. La verdad he estado revisando en extenso el foro en busca de "inspiración" para resolver el problema. Sucede que tengo un equipo que envía en forma serial 119 bytes en forma consecutiva a 9600 bps. Lo que necesito hacer es tomar esos 119 bytes y enviarlos en forma serial por Tx.
Estoy utilizando un PIC 18F452 con un max232 mediante USART.
Mi idea es almacenar los 119bytes antes de mandar a Tx, esto para no interrumpir el proceso de transmisión con el proceso de recepción. El código para recibir que uso es el siguiente (está basado en material que encontré en este foro):
******************************************************
CBLOCK 0x100 ;Variables en el banco 1
BuffRx:.256 ;Buffer para recepción
ENDC
CBLOCK 0x200 ;Variables en el banco 2
BuffTx:.256 ;Buffer para transmisión
ENDC
******************** Rx **********************************
RXLOOP:
BTFSS PIR1,RCIF ;Espera por byte
GOTO RXLOOP
MOVF RCREG,W,.0
MOVWF POSTINC1
BTFSC RCREG,OERR
CALL UCLEAR ;Error de Sobreescritura
BTFSC RCREG,FERR
CALL UCLEAR ;Error de Trama
INCF RXCOUNT
MOVLW .118
CPFSGT RXCOUNT
GOTO RXLOOP
CLRF RXCOUNT
RETURN
UCLEAR:
BCF RCSTA,CREN
MOVF RCREG,w
MOVF RCREG,w
MOVF RCREG,w ;Vacío buffers de usart
BSF RCSTA,CREN
RETURN
******************** Tx **********************************
TXLOOP:
MOVLW HIGH BuffRx
MOVWF FSR1H,.0
MOVLW LOW BuffRx
MOVWF FSR1L,.0
MOVLW HIGH BuffTx
MOVWF FSR2H,.0
MOVLW LOW BuffTx
MOVWF FSR2L,.0
TXCOPIA:
MOVF POSTINC1,W
MOVWF POSTINC2
INCF TXCOUNT
MOVLW .118
CPFSGT TXCOUNT
GOTO TXCOPIA
MOVLW HIGH BuffTx
MOVWF FSR2H,.0
MOVLW LOW BuffTx
MOVWF FSR2L,.0
RETURN
TXPRINTER:
DECFSZ TXCOUNT,f
CALL TXCARGA
RETURN
TXCARGA:
MOVF POSTINC2,W
MOVWF TXREG
GOTO TXPRINTER
******************************************************
No he podido validar bien si efectivamente recibo los bytes bien, pero si en vez de almacenar los bytes, los envío a Tx inmediatamente, envía la información pero con muchos errores.
El caso es que con este código no se envía nada por Tx.
Bueno, agradecería cualquier ayuda.
-
Hola Murphist, la mejor forma de hacer eso es con un buffer para cada proceso de tx y rx, creo que con uno de 64 bytes mas que suficiente.
Me explico mejor, creas un buffer para la rx de 64 bytes (osea una variable de 64 bytes), y lo trabajas con 3 variables màs, un contador, y 2 vectores que te indiquen la posición del buffer, uno cuenta el numero de bytes que se almacenan incrementando el contador y la dirección del buffer para almacenar el sgte dato, y el otro decrementa el contador con el numero de variables que saca del buffer, incrementado tambien la dirección del buffer para poder sacar el sgte. dato guardado. lo mismo haces para el buffer de tx. ambos, tx y rx lo trabajas a interrrup. espero haberte ayudado, suerte.
-
Ok, gracias JBQ por la ayuda...intentaré de esa manera, si sigo con problemas, lo posteo. De todas maneras como avance, ahora me imprime sin inconvenientes si envío directamente a Tx, el problema es que tengo que agregar algunos datos antes de enviar a imprimir.
Bueno, cualquier cosa, lo aviso