TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Leon Pic en 16 de Agosto de 2009, 14:01:00

Título: Problema con el usart.
Publicado por: Leon Pic en 16 de Agosto de 2009, 14:01:00
Estoy atorado en una problema y no puedo encontrar la solución. Por eso recurro a ustedes.
Como sabrán, estoy haciendo una estación automática (http://www.meteorologiafacil.com.ar/foros/index.php?topic=25.0) que me enviará los datos por rf al receptor que estará dentro de mi casa.

Estoy tratando de comunicar a dos pic 16F877 entre sí, por medio de la USART y no logro nada. Para saber si transmiten y reciben, he colocado un led a cada micro para que me encienda cuando transmite o recibe un dato respectivamente. El led del transmisor, prende y apaga como debe ser, pero el led que se activa en la interrupción, no se enciende y además, no se actualiza los datos en el LCD.

Les muestro una parte del código en la cual, está la parte de la comunicación, la otra parte es trabajo adicional del pic.

Tx

Código: [Seleccionar]
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
;
;---------------------------------------------------------------
;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
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR 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ón
BSF STATUS,RP0 ;BANCO 1
MOVLW B'00000001'
MOVWF TRISB ;RBO/INT ENTRADA, DEMÁS SALIDAS
MOVLW B'11000000'
MOVWF OPTION_REG
MOVLW B'10010000' ;HABILITO RB0/INT E INTERRUPCIONES GENERALES.
MOVWF INTCON
CLRF TRISC ;PUERTO C 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.
;************************************************************************************************
; BCF TXSTA,SYNC
; BCF STATUS,RP0 ;BANCO 0
; BSF RCSTA,SPEN
; BSF STATUS,RP0 ;BANCO 1
; BCF TXSTA,BRGH ;BAJA VELOCIDAD.
; BCF PIE1,TXIE
; BCF TXSTA,TX9 ;8 BIT DE DATOS.
; MOVLW D'25'
; MOVWF SPBRG ;AJUSTAMOS PARA 2400 BAUDIOS.
BANK0
movlw   b'10010000'      ;Configuracion de la usart
            movwf   RCSTA            ;para recepcion continua y habilitacion de la usart
  BANK1   
         movlw   .25            ;valor para seleccionar 2400 baudios
         movwf   SPBRG
         movlw   b'00100100'      ;Configuracion USART modo alta velocidad 2400 baud y activacion de transmision
         movwf   TXSTA            ;carga valor anterior en registro asociado al generador del baud rate
;************************************************************************************************

;**************************************************************************************************
;TRANSMITIMOS LOS DATOS VÍA RF.
;------------------------------
;TX A 2400 BAUDIOS SIN PARIDAD CON BIT DE START Y DE STOP. COMUNICACIÓN SERIE ASINCRÓNICA SIN INTERRUPCIÓN
;
;PASOS A SEGUIR PARA UNA TRANSISIÓN EXITOSA:
;1- RC6 COMO SALIDA
;2- CARGAR CON D'25' A SPBRG PARA UTILIZAR 2400 BAUDIOS. (EN NUESTRO CASO)
;3- COLOCAMOS EN 0 AL BIT BRGH PARA CONFIGURARLO A BAJA VELOCIDAD.
;4- ASIGNAR SYNC=0 y SPEN=1 PARA CONFIGURAR USART COMO ASINCRONO.
;5- SI DESEAMOS INTERREPCIÓN PONEMOS A 1 EL BIT TXIE
;6- ASIGNAR TX9=0 PARA ELEGIR TRANSMISIÓN A 8 BIT (EN NUESTRO CASO).
;7- ACTIVAMOS LA TRANSMISIÓN COLOCANDO TXEN = 1. EL BIT TXIF TENDRÁ VALOR 1.
;8- CARGAMOS EL DATO A TRANSMITIR A TXREG PARA EMPEZAR A TRANSMITIR.
;9- PARA UNA NUEVA TRANSMISIÓN CHEQUEAR EL BIT TXIF DEL REGISTRO PIR1. SI ES 0 YA SE COMPLETÓ LA TRANSMISIÓN SI ES 1 NO TERMINÓ LA TRANSMISIÓN.
;----------------------------------------------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;REGISTROS PROPIOS:
;sincronización:
;---------------
;10101010 = primer dato a enviar, terminado de enviar este dato, enviamos el segundo dato
;01010101 = segundo dato a enviar, una vez enviado este dato, empezamos a trasmitir los datos sensados
;************************************************************************************************************
;PASOS QUE SEGUIREMOS NOSOTROS PARA COMPLETAR TODOS LOS DATOS A TRANSMITIR. AHORA VEREMOS COMO ES EL PROTOCOLO A UTULIZAR.
;-------------------------------------------------------------------------------------------------------------------------
;01- BANCO 1
;02- ASIGNAMOS 1 A TXEN DEL REGISTRO TXSTA (HABILITAMOS LA TRANSMISIÓN)
;03- SELECCIONAMOS EL BANCO 0
;04- CARGAMOS 10101010 A TXREG (SINCRONIZACIÓN)
;05- ¿ES 1 TXIF DEL REGISTRO PIR1?
;06- NO, VOLVEMOS AL PASO 05
;07- SI, CARGAMOS 01010101 A TXREG (SEGUNDA SINCRONIZACIÓN)
;08- ¿ES 1 TXIF DEL REGISTRO PIR1?
;09- NO, VOLVEMOS AL PASO 08
;10- VOLCAMOS temperaturaAL A TXREG
;11- ¿ES 1 TXIF DEL REGISTRO PIR1?
;12- NO, ESPERAMOS
;13- SI, VOLCAMOS temperaturaBA A TXREG
;14- ¿ES 1 TXIF DEL REGISTRO PIR1?
;15- NO, ESPERAMOS
;16- SI, VOLCAMOS humedad A TXREG
;17- ¿ES 1 TXIF DEL REGISTRO PIR1?
;18- NO, ESPERAMOS
;19- SI, VOLCAMOS v_direcciónAL A TXREG
;20- ¿ES 1 TXIF DEL REGISTRO PIR1?
;21- NO, ESPERAMOS
;22- SI, VOLCAMOS v_direcciónBA A TXREG
;23- ¿ES 1 TXIF DEL REGISTRO PIR1?
;24- NO, ESPERAMOS
;25- SI, VOLCAMOS v_velocidad A TXREG
;26- ¿ES 1 TXIF DEL REGISTRO PIR1?
;27- NO, ESPERAMOS
;28- SI, VOLCAMOS precipitaciónAL A TXREG
;29- ¿ES 1 TXIF DEL REGISTRO PIR1?
;30- NO, ESPERAMOS
;31- SI, VOLCAMOS precipitaciónBA A TXREG
;32- ¿ES 1 TXIF DEL REGISTRO PIR1?
;33- NO, ESPERAMOS
;34- SI, VOLCAMOS presiónAL A TXREG
;35- ¿ES 1 TXIF DEL REGISTRO PIR1?
;36- NO, ESPERAMOS
;37- SI, VOLCAMOS presiónBA A TXREG
;38- ¿ES 1 TXIF DEL REGISTRO PIR1?
;39- NO, ESPERAMOS
;40- BORRAMOS LAS VARIABLES DE PRECIPITACIÓN
;41- BANCO 1
;42- ASIGNAMOS 0 A TXEN DEL REGISTRO TXSTA (DESHABILITAMOS LA TRANSMISIÓN)
;43- BANCO 0
;44- VAMOS A TEMPERATURA
;-------------------------------------------------------------------------------------------------------------------------
;
TX BSF PORTC,0 ;ENCIENDO LED DE TX
BCF STATUS,RP1
BSF STATUS,RP0 ;BANCO 1
BSF TXSTA,TXEN ;HABILITAMOS
BCF STATUS,RP0 ;BANCO 0
MOVLW B'10101010'
MOVWF TXREG ;MANDAMOS LA SINCRONIZACIÓN
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
MOVLW B'01010101' ;SI, MANDAMOS LA SEGUNDA SINCRONIZACIÓN
MOVWF TXREG
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
MOVFW temperaturaAL ;SI, RECUPERAMOS LA PARTE ALTA DE LA TEMPERATURA SENSADA.
MOVWF TXREG ;LO TRANSMITIMOS
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0 ;NO, ESPERAMOS
MOVFW temperaturaBA ;SI, RECUPERAMOS LA PARTE BAJA DE LA TEMPERATURA SENSADA.
MOVWF TXREG ;LO TRANSMITIMOS
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
MOVFW humedad ;SI, RECUPERAMOS LA HUMEDAD SENSADA
MOVWF TXREG ;LO TRANSMITIMOS
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
MOVFW v_direcciónAL ;SI, RECUPERAMOS LA PARTE ALTA DE LA DIRECCIÓN DEL VIENTO
MOVWF TXREG ;LO TRANSMITIMOS
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
MOVFW v_direcciónBA ;SI, RECUPERAMOS LA PARTE BAJA DE LA DIRECCIÓN DEL VIENTO
MOVWF TXREG ;LO TRANSMITIMOS
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
MOVFW v_velocidad ;SI, RECUPERAMOS LA VELOCIDAD DEL VIENTO.
MOVWF TXREG ;LO TRANSMITIMOS
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
MOVFW precipitación ;SI, RECUPERAMOS LA PARTE ALTA DE LA PRECIPITACIÓN
MOVWF TXREG ;LO TRANSMITIMOS
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
MOVFW presiónAL ;SI, RECUPERAMOS LA PARTE ALTA DE LA PRESIÓN
MOVWF TXREG ;LO TRANSMITIMOS
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
MOVFW presiónBA ;SI, RECUPERAMOS LA PARTE BAJA DE LA PRESIÓN
MOVWF TXREG ;LO TRANSMITIMOS
BSF STATUS,RP0 ;BANCO 1
BTFSS TXSTA,TRMT ;¿SE COMPLETÓ LA TRANSMISIÓN?
GOTO $-1 ;NO, ESPERAMOS
BCF STATUS,RP0 ;BANCO 0
CLRF precipitación ;BORRAMOS LA PRECIPITACIÓN
BSF STATUS,RP0 ;BANCO 1
BCF TXSTA,TXEN ;DESABILITAMOS LA TRANSMISIÓN
BCF STATUS,RP0 ;BANCO 0
BCF PORTC,0 ;APAGO LED DE TX
GOTO TEMPERATURA ;VOLVEMOS A SENSAR DESDE EL PRINCIPIO.
;*****************************************************************************************************************************************************
;FIN DEL PROGRAMA
;*****************************************************************************************************************************************************
END

Noten que en la parte de la configuración de la USART hay carias instrucciones con ";" esto es de una configuración fallida.

Fin parte I de II
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 16 de Agosto de 2009, 14:03:03
Rx

Código: [Seleccionar]
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
Título: Re: Problema con el usart.
Publicado por: jhozate en 16 de Agosto de 2009, 14:25:14
pss si sube los archivos de simulacion, y el .asm tambien...a modo de observacion, en el tx no configuraste el pin de RX como entrada.

saludos
Título: Re: Problema con el usart.
Publicado por: alogic.on en 16 de Agosto de 2009, 14:35:53
por si te sirve de algo yo no consegui nada de pic a pic solo con un cable, aunque "los usaba de un metro" al final le puse un optoaclopador 6n138, y por si acaso se te ha pasado, tienes unidas las dos gnd de los pic no??
el programa a simple vista, parece que por lo menos deberia encender el led al recibir un dato, guarda los registros principales, testea el flag, lo pone a cero... parece todo bien... :? a ver si tengo un rato y lo intento con dos placas que tengo por aqui   

un saludo
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 16 de Agosto de 2009, 16:53:24
pss si sube los archivos de simulacion, y el .asm tambien...a modo de observacion, en el tx no configuraste el pin de RX como entrada.

saludos

No lo he configurado como entrada porque la comunicación no es bidireccional, pero haré la prueba poniéndolo como entrada por si acaso.

Alogic.on, tal vez ese es el problema que tengo. Me voy a conseguir un optoaclopador y pruebo o lo hago con un transistor por las dudas. En cuanto a la masa de los PIC comparten la misma fuente.
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 16 de Agosto de 2009, 21:06:41
En Tx le he puesto el pin 7 del puerto C como entrada y nada. Al mismo tiempo probé con un transistor npn el bc327 como driver entre los dos y nada. El cable es de apenas pocos cm.

Lo que hice también, fue desconectar el pic receptor y colocar un led para ver si transmite los dato y al parecer no lo hace. Es raro porque completa la instrucción en la parte de la transmisión, pero al parecer, no envía la trama el registro TXREG.

Seguiré investigando.
Título: Re: Problema con el usart.
Publicado por: alogic.on en 17 de Agosto de 2009, 02:36:03
tienes posibilidad de mirar en un oscilografo?? si no solo el led en Tx deberia encenderse
esta es la rutina que uso para Tx, para enviar tramas lo que hago es llamarla muchas veces, cargala en el programa y cambia los envios del tuyo por llamadas a esta rutina y deberia funcionar,
Código: ASM
  1. ENVIAR_USART                                    ;EL DATO A TRANSMITIR ESTA ALOJADO EN W HASTA QUE TERMINE EL ULTIMO ENVIO
  2.                 BANKSEL TXSTA
  3.                 BTFSS   TXSTA,TRMT              ;SI ESTA A UNO EL REGISTRO ESTA VACIO
  4.                 GOTO    ENVIAR_USART                    ;SI ESTA A CERO, SIGUE LLENO Y A DE ESPERAR
  5.                 BANKSEL TXREG          
  6.                 MOVWF   TXREG                   ;Y CARGA EL DATO A TRANSMITIR EN TXREG
  7.                 BANKSEL TXSTA
  8.                 BSF             TXSTA,TXEN              ;ACTIVA EL ENVIO TXEN=1
  9. ESPERAR
  10.                 BANKSEL PIR1
  11.                 BTFSS   PIR1,TXIF               ;CUANDO TERMINA, SE PONE A UNO TXIF Y SALTA
  12.                 GOTO    ESPERAR                 ;ESTA INSTRUCCION, SI NO VOLVERIA A ESPERAR.
  13.                 BCF             TXSTA,TXEN
  14.                 BCF             STATUS,RP0              ;BANK 0
  15.                 BCF             STATUS,RP1             
  16.                 RETURN

por si acaso, esta es la configuracion de la usart. si no funciona solo cambiando la rutina de envio ponle esta configuracion, y luego la modificas probando a ver donde esta el problema

Código: ASM
  1. BANKSEL TRISC
  2.                 BSF             TRISC,6                 ;PUERTO C3 COMO SALIDA
  3.                 BSF             TRISC,7                 ;PUERTO C7 COMO ENTRADA
  4.                 BANKSEL SPBRG
  5.                 MOVLW   .9  
  6.                 MOVWF   SPBRG                   ;BAUD RATE A 31250
  7.  
  8.                 BANKSEL TXSTA
  9.                 BCF             TXSTA,CSRC              ;SELECCIONA RELOJ (ASINCRONO NO IMPORTA)
  10.                 BCF             TXSTA,TX9               ;DATOS DE 8 BITS
  11.                 BSF             TXSTA,TXEN              ;NO ENVIA DATOS POR AHORA
  12.                 BCF             TXSTA,SYNC              ;MODO ASINCRONO
  13.                 BCF             TXSTA,3                 ;NO IMPLEMENTADO
  14.                 BCF             TXSTA,BRGH              ;BAJA VELOCIDAD DE TRANSMISION
  15.                 BCF             TXSTA,TRMT              ;ESTADO DEL REGISTRO DE DESPLAZAMIENTO (VACIO)
  16.                 BCF             TXSTA,TX9D              ;NOVENO BIT A TRANSMITIR
  17.        
  18.                 BANKSEL RCSTA
  19.                 BSF             RCSTA,SPEN              ;HABILITA PUERTO SERIE
  20.                 BCF             RCSTA,RX9               ;BITS A RECIVIR 8
  21.                 BCF             RCSTA,SREN              ;HABILITA RECEPCION UNICA (ASINCRONO NO IMPORTA)
  22.                 BSF             RCSTA,CREN              ;HABILITA RECEPCION CONTINUA
  23.                 BCF             RCSTA,3
  24.                 BCF             RCSTA,FERR              ;NO HAY ERROR DE EMPAQUETAMIENTO
  25.                 BCF             RCSTA,OERR              ;NO HAY ERROR DE DESBORDAMIENTO
  26.                 BCF             RCSTA,RX9D              ;NOVENO BIT DE RECIVIDO
  27.                
  28.                 BANKSEL PIE1           
  29.                 BCF             PIE1,TXIE               ;DESHABILITA INTERRUPCION DE TRANSMISION
  30.                 BCF             PIE1,RCIE               ;HABILITA INTERRUPCION DE RECEPCION
  31.  
  32.                 BANKSEL PIR1
  33.                 BCF             PIR1,TXIF               ;APAGA BANDERA DE INTERRUPCION POR TRANSMISION
  34.                 BCF             PIR1,RCIF               ;APAGA BANDERA DE INTERRUPCION POR RECEPCION
  35.                                                        
  36.                 BCF             STATUS,RP0              ;CAMBIA AL BANCO 0
  37.                 BCF             STATUS,RP1

Título: Re: Problema con el usart.
Publicado por: Leon Pic en 17 de Agosto de 2009, 10:53:50
Muchas gracias alogic.on mañana lo voy a probar y ver si funciona. Hoy estoy en el trabajo y no lo puedo hacer.
Lamentablemente, no dispongo de un osciloscopio  :8}
Título: Re: Problema con el usart.
Publicado por: sander en 17 de Agosto de 2009, 11:30:58
Solo por verificar , el pin Tx del primer PIC lo conectaste al pin Rx del segundo y la simulacion del proteus te funciona?

Saludos
Título: Re: Problema con el usart.
Publicado por: alogic.on en 17 de Agosto de 2009, 13:29:08
por si no lo habias visto (http://www.todopic.com.ar/foros/index.php?topic=26327.msg215761#msg215761)  no es el mas rapido del mercado pero es muy barato  :mrgreen: como dicen en el post
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 17 de Agosto de 2009, 16:22:30
Solo por verificar , el pin Tx del primer PIC lo conectaste al pin Rx del segundo y la simulacion del proteus te funciona?

Saludos

Si, pero no tengo Proteus, los archivos que me refería eran los .hex y el ASM para que no tengan que copiarlo nuevamente y a mano.

Alogic.on, estoy pensando en eso justamente, porque ahora me vendría al pelo o como anillo al dedo.
Título: Re: Problema con el usart.
Publicado por: sander en 17 de Agosto de 2009, 17:15:55
podrias mandarme los .hex voy a simularlo en el proteus , para ver que tal.

Saludos
Título: Re: Problema con el usart.
Publicado por: alogic.on en 18 de Agosto de 2009, 02:46:49
localice este post (http://www.todopic.com.ar/foros/index.php?topic=20914.msg159972#msg159972), no lo he leido detemidamente. pero a lo mejor te responde alguna cosilla. dicen que se puede conectar la usart de pic a pic directamente
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 18 de Agosto de 2009, 12:01:26
Huy, diste con el calvo Alogic.on. Lo estuve revisando y me parece que viene por ese lado el problema.

Sander, por lo que dice el hilo que pego alogic, anda en proteus y no en el hardware, y cuando anda en el hardware, no anda en el proteus. De todas maneras en un ratito subo los adjuntos ya que tu posteaste antes que alogic y de seguro aún no leiste el hilo.

Ahora me voy a almorzar y luego subo los archivos.
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 18 de Agosto de 2009, 14:26:40
Aquí subo los archivos comprimidos en rar. Ahora estoy probando lo que le sucedió a elmasvital.
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 21 de Agosto de 2009, 11:20:47
Lamento haber tardado en postear los avances pero cuando cayo el foro me olvidé de subirlo.

Debido al problema que sufrió elmasvital, yo hise lo mismo pero para 4Mhz de frecuencia del PIC. La configuración me quedó en 19200 baudios, modo baja velocidad y el generador de baudios cargado con 12 (decimal) (esta configuración es para modo alta velocidad). Al parecer funciona pero no del todo. No me actualiza los datos en el LCD pero debo revisar si no hay otro problema.

El led que coloqué como testigo en el receptor, prende y apaga acusando recibo, pero lo hace a muy poca intensidad pero pienso que es por la alta conmutación. Para sacarme la duda, coloqué en el bit transmisor, en el pin RC6 RTX, un led y aquí viene lo raro, cuando el PIC no está transmitiendo, este led permanece encendido con poca intensidad.



Acabo de experimentar algo raro que me está desorientando bastante.

Modifiqué el programa receptor para que, cuando termine de configurar el LCD quede en un bucle cerrado y no haga más nada. Luego en la interrupción, modifiqué que pase el dato de RCREG a W y luego la envíe a el LCD y quede en un bucle cerrado, para salir hay que resetear el PIC.

Pasaron 2 cosas:

1- En la simulación del MPLAB, me muestra el dato recibido pero el pic montado en el protorboard no.

2- Resetee ambos pic, pero esta vez dejé reseteado el PIC TX y puse a correr el PIC Rx, se enciende el led acusando de recepción en forma muy tenue y permanece encendido. Luego coloqué el pic Tx a andar y obviamente no me mostraba nada.

Reseté a ambos pic y puse a  correr el Tx, luego hice andar el PIC Rx y el led de recepción se permaneció apagado hasta que el Tx envíe datos, luego permanece encendido ya que nunca lo apago por software. El tema es que el led se prende en forma muy tenue. Repasé los cables y todos hacen muy buen contacto.

Estos avances lo he echo hace dos días atrás y desde entonces no he vuelto con el proyecto por falta de tiempo. Hoy trataré de seguirlo.
Título: Re: Problema con el usart.
Publicado por: alogic.on en 22 de Agosto de 2009, 05:52:18
estuve mirando el codigo Rx y lo unico que se me ocurre para comprobar si el dato llega, es que en la interrupcion saques el resultado por el puerto b para verificar si realmente llega algun dato y cual, pasando de la lcd y todo lo demas. a mi mas de una vez me ha funcionado simplificar el prog para localizar los errores
configuracion de perifericos
    -puertas y modulos- se quedaria como esta
interrupcion
    -verifica que int. ha saltado, si es la RX. carga el dato en portb
programa
    -goto programa    ;solo para probar la llegada de la usart. que se quede en un bucle esperando a que salte la interrupcion

doy por echo que cada pic tiene puestos sus condensadores de 100nf, a ver si va a ser por ruidos en la señal. yo los pongo muy pegados a las patillas de alimentacion del pic, uno a cada lado y el cristal tambien muy cerca de las patillas. si esta en una protoboard de esas quita y pon (no se como se llaman) en el mismo agujero de las patillas del pic puedes ponerlos y aseguras que no haya ruido electrico
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 22 de Agosto de 2009, 12:14:10
Cada pic tiene su condensador en la alimentación.

Voy a probar lo que me dices. Hasta el lunes o martes no puedo continuar. En esos días les comento como me está llendo con este dolor de cabeza.
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 08 de Octubre de 2009, 10:58:25
Después de casi 8 semanas que no posteo algo del problema, vuelvo con malas noticias (no le he dedicado todos los día al problema. He estado metido cuando tenía un rato libre), pero no hay mal que por bien no venga.
Desgraciadamente aún no fui capaz de hacer comunicar los dos pic, pero he descubierto algo interesante a la hora de configurar los puertos para trabajar con el USART.

Para poder transmitir los datos no hay que configurar el PIN RC6/TX como entrada, tal como lo dice el datasheet, sino como salida. Lo he comprobado de dos formas, primero, he notado que, cuando habilitaba la transmisión, el bit 6 del registro TRISC no cambiada de estado, permanecía como entrada. Y lo confirmé cuando logré simular la usart en mplab (http://www.todopic.com.ar/foros/index.php?topic=27865.0)

Lo que si tengo problema es como interpretar los datos de la transmisión generada en el archivo de la simulación. Miren como me muestra los datos enviados. Primero envío el siguiente dato:

0x01

Luego:

0x03

y este es el dato generado en el archivo:



Lo adjunto para que lo puedan ver mejor.

He creado un nuevo código en el cual consiste que envíe por la usart el portb y se ve reflejado en el porta del RX (exeptos los dos bit más significativos). Les muestro ambos programas:

Tx

Código: [Seleccionar]
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF & _BODEN_OFF & _LVP_OFF & _WRT_OFF
;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;
CBLOCK H'20'
PDel0
PDel1
PDel2
ENDC
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIÓN
INTERRUP
;
INICIO
;
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BSF STATUS,RP0 ;BANCO 1
CLRF TRISA
MOVLW H'FF'
MOVWF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE
MOVLW 0x06
MOVWF ADCON1
BSF TRISC,7
;
;INICIALIZACIÓN DEL MÓDULO USART
;
BSF TXSTA,BRGH
MOVLW .25
MOVWF SPBRG
BSF TXSTA,SYNC
BCF STATUS,RP0 ;BANCO 0
BSF RCSTA,SPEN
;
;ACTIVACIÓN DEL MÓDULO USART
;
BSF STATUS,RP0 ;BANCO 1
BSF TXSTA,TXEN
;
;ENVÍO DE DATOS AL USART
;
BCF STATUS,RP0 ;BANCO 0
REPETIR MOVFW PORTB
MOVWF TXREG
CALL DEMORA_1S ;RETARDO DE UN SEGUNDO.
GOTO REPETIR
;
DEMORA_1S  movlw     .14       ; 1 set numero de repeticion  (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .72       ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .247      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;
END

Rx

Código: [Seleccionar]
LIST P=16F877A
INCLUDE <P16F877A.INC>
__CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF & _BODEN_OFF & _LVP_OFF & _WRT_OFF
;
;---------------------------------------------------------------
;VARIABLES.
;---------------------------------------------------------------
;
CBLOCK H'20'

ENDC
;
RESET ORG H'00'
GOTO INICIO
ORG H'04' ;VECTOR INTERRUPCIÓN
INTERRUP
;
INICIO
;
BCF STATUS,RP0
BCF STATUS,RP1 ;BANCO 0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BSF STATUS,RP0 ;BANCO 1
CLRF TRISA
CLRF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE
MOVLW 0x06
MOVWF ADCON1
BSF TRISC,6
BSF TRISC,7
;
;INICIALIZACIÓN DEL MÓDULO USART
;
BSF TXSTA,BRGH
MOVLW .25
MOVWF SPBRG
BSF TXSTA,SYNC
BCF STATUS,RP0 ;BANCO 0
BSF RCSTA,SPEN
;
;ACTIVACIÓN DEL MÓDULO USART
;
BSF RCSTA,CREN
;
;RECEPCIÓN DE DATOS DEL USART
;
NO_RECIBIDO BTFSS PIR1,RCIF
GOTO NO_RECIBIDO
MOVFW RCREG
MOVWF PORTA
BCF RCSTA,CREN
NOP
BSF RCSTA,CREN
GOTO NO_RECIBIDO
;
END
Título: Re: Problema con el usart.
Publicado por: groundman en 08 de Octubre de 2009, 17:18:57
leon pic.que crystal estas usando?

has tenido en cuenta usar un crystal que tenga un 0% de errores para la velocidad que estas usando?
y la conexion entre pics lo has hecho con un cable trenzado para evitar interferencias?
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 08 de Octubre de 2009, 17:51:22
mmmmm, el cristal de cuarzo no dice nada del error :( :( Utilizo uno de 4 Mhz.
En cuanto al cable, la comunicación es unidireccional, o sea, del Tx al Rx nada más, por lo que solo es necesario un solo cable.
Título: Re: Problema con el usart.
Publicado por: groundman en 08 de Octubre de 2009, 19:05:32
mira estas tablas que hize hace tiempo: http://www.todopic.com.ar/foros/index.php?topic=27375.msg225260#msg225260

lo mejor es tener el minimo margen de error en las transmisiones de la usart.lo puedes ver en el datasheet del pic que estes usando.
aunque en el datasheet no vienen todos los valores.por eso hize a mano las tablas del enlaze.

y si quieres descartar mas fallos.trenza en cable de masa con el de transmision.como se hace en los pares de los clables RJ45 o TCP.
y tambien se hace en las comunicaciones entre centralitas de los automoviles.para CAN.
Título: Re: Problema con el usart.
Publicado por: sander en 08 de Octubre de 2009, 19:16:38
Leon Pic, en mi experencia la configuracion que indica el datasheet para transmitir  funciona, pero asi te funciona poniendo el pin como salida, puede que el datasheet este equivocado, al revisar tu programa creo que un posible problema en la transmision es que el transmisor esta siempre habilitado, lo que yo hago es tener una subrutina para enviar un caracter por el USART y lo primero que hago es habilitar la transmision  y cuando termino de enviar , volver a enviar la transmision., sobre la simulacion creo que solo puedes enviar caracteres ASCII  al archivo de salida

Saludos
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 08 de Octubre de 2009, 20:37:53
Gracias a ambos.

Groundman, muy buena la tabla. Si que te tomaste un gran trabajo en realizarlo. Muchas gracias por compartirlo.

Sander, hay algo que no te entendí. Lo que tu haces a la hora de transmitir es: habilitas la transmisión, cargas el valor en el registro TXREG, cuando termina de enviar, deshabilitas la transmisión. ¿Es así?
Título: Re: Problema con el usart.
Publicado por: sander en 09 de Octubre de 2009, 13:33:22
Si eso es exactamente lo que quise decir, no se en que estaba pensando cuando escribi lo anterior , ni siquiera yo lo entiendo.

Saludos.
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 09 de Octubre de 2009, 14:29:55
Muchas gracias Sander. Es algo que no se me ocurrió probar.
Ahora estoy en el trabajo así que hasta mañana no podré hacerlo. Intentaré lo que me comentás y lo que me comentó groundman.

Hasta nuevo aviso.  :-/ :-/
Título: Re: Problema con el usart.
Publicado por: groundman en 09 de Octubre de 2009, 17:16:54
veo en tu codigo que estas usando la usart en modo sincrono. BSF   TXSTA,SYNC

yo nunca he usado este modo.seguro que no deberias usar el modo asincrono?
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 09 de Octubre de 2009, 17:23:00
ouch  :oops: :oops: :oops: me equivoqué, si quiero utilizar el modo asincrono.
Otra cosa para chequear mañana. :? :?

Gracias por el detalle groundman  :-/ :-/
Título: Re: Problema con el usart.
Publicado por: groundman en 09 de Octubre de 2009, 18:17:59
te pongo esta configuracon para 19.200 Kbaud
que creo que es la que quieres usar.

BRGH=0
SYNC=0
SPBRG=3
crystal  3.686400 Mhz

de esta forma el % de error es 0.

y si quieres usar 9.600 Kbaud
valor de SPBRG=5


y en modo alta velocidad BRGH=1
para 38400 Baud     valor de SPBRG=5
para 57600 Baud     valor de SPBRG=3

todo esto tiene un porcentage de error tambien a 0.pero tienes que usar este crystal.

realmente no se los problemas que supone tener algun margen de error.supongo que los problemas salen al realizar transmisiones largas.
aunque supongo que si se deshabilita/habilita el modulo usart antes de cada transmision.creo que no habria muchos problemas.
lo malo creo que esta en las recepciones largas.que al ir adelantandose o atrasandose el oscilador principal.se producirian la falta o sobra de un bit que se va adelantando /atrasando.

aunque bien pensado si los dos pic utilizan el mismo ciclo de reloj.y la transmision es solo entre ellos.ya no haria falta tener en cuenta ningun desfase.porque realmente no lo habria.
otra cosa seria comunicarse con un PC.ya que este si que sigue un control exacto de las velocidades de la usart.y un porcentage de error relativo tendria falta de datos.

 :lol: anda ni yo sabia que esto pudiera ser asi.me lo habre creido o sera verdad lo que he expuesto. :D








Título: Re: Problema con el usart.
Publicado por: Leon Pic en 09 de Octubre de 2009, 19:30:35
Una vez más te agradezco la molestia que te has tomado.
Mañana haré las pruebas pero utilizaré un cristal de 4 Mhz.

PD: Cuando me preguntaste por el error de comunicación, pensé que te referías al porcentaje de error del cristal  :roll: De todas maneras la configuración que había elegido, no llegaba al 1% :x :x
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 10 de Octubre de 2009, 16:23:53
Eureka  :-/ :-/ :-/ :-/ Funciona.
Ya logré hacerlo andar y gracias a la ayuda de groundman  Sander y alogic.on

A continuación subo el programa por si otros tienen problemas:

Tx

Código: ASM
  1. BCF                     STATUS,RP0
  2.                         BCF                     STATUS,RP1              ;BANCO 0
  3.                         CLRF            PORTA
  4.                         CLRF            PORTB
  5.                         CLRF            PORTC
  6.                         CLRF            PORTD
  7.                         CLRF            PORTE
  8.                         BSF                     STATUS,RP0              ;BANCO 1
  9.                         CLRF            TRISA
  10.                         MOVLW           H'FF'
  11.                         MOVWF           TRISB
  12.                         CLRF            TRISC
  13.                         CLRF            TRISD
  14.                         CLRF            TRISE
  15.                         MOVLW           0x06
  16.                         MOVWF           ADCON1
  17.                         BSF                     TRISC,7
  18. ;
  19. ;INICIALIZACIÓN DEL MÓDULO USART
  20. ;
  21.                         BSF                     TXSTA,BRGH
  22.                         MOVLW           .25
  23.                         MOVWF           SPBRG
  24.                         BCF                     TXSTA,SYNC
  25.                         BCF                     STATUS,RP0              ;BANCO 0
  26.                         BSF                     RCSTA,SPEN
  27. ;
  28. ;ACTIVACIÓN DEL MÓDULO USART
  29. ;
  30. TRANSMITIR      BSF                     STATUS,RP0              ;BANCO 1
  31.                         BSF                     TXSTA,TXEN
  32. ;
  33. ;ENVÍO DE DATOS AL USART
  34. ;
  35.                         BCF                     STATUS,RP0              ;BANCO 0
  36. REPETIR         MOVFW           PORTB
  37.                         MOVWF           TXREG
  38.                         BSF                     STATUS,RP0              ;BANCO 1
  39. ESPERAR         BTFSS           TXSTA,TRMT              ;¿SE VACIÓ EL REGISTRO TSR?
  40.                         GOTO            ESPERAR                 ;NO, ESPERAMOS PARA ELLO
  41.                         BCF                     TXSTA,TXEN              ;DESHABILITO LA TRANSMISIÓN
  42.                         BCF                     STATUS,RP0              ;BANCO 0
  43.                         GOTO            TRANSMITIR

Rx

Código: ASM
  1. BCF                     STATUS,RP0
  2.                         BCF                     STATUS,RP1              ;BANCO 0
  3.                         CLRF            PORTA
  4.                         CLRF            PORTB
  5.                         CLRF            PORTC
  6.                         CLRF            PORTD
  7.                         CLRF            PORTE
  8.                         BSF                     STATUS,RP0              ;BANCO 1
  9.                         CLRF            TRISA
  10.                         CLRF            TRISB
  11.                         CLRF            TRISC
  12.                         CLRF            TRISD
  13.                         CLRF            TRISE
  14.                         MOVLW           0x06
  15.                         MOVWF           ADCON1
  16.                         BSF                     TRISC,6
  17.                         BSF                     TRISC,7
  18. ;
  19. ;INICIALIZACIÓN DEL MÓDULO USART
  20. ;
  21.                         BSF                     TXSTA,BRGH
  22.                         MOVLW           .25
  23.                         MOVWF           SPBRG
  24.                         BCF                     TXSTA,SYNC              ;ASINCRONO
  25.                         BCF                     STATUS,RP0              ;BANCO 0
  26.                         BSF                     RCSTA,SPEN
  27. ;
  28. ;ACTIVACIÓN DEL MÓDULO USART
  29. ;
  30.                         BSF                     RCSTA,CREN
  31. ;
  32. ;RECEPCIÓN DE DATOS DEL USART
  33. ;
  34. NO_RECIBIDO     BTFSS           PIR1,RCIF
  35.                         GOTO            NO_RECIBIDO
  36.                         MOVFW           RCREG
  37.                         MOVWF           PORTA
  38.                         BCF                     RCSTA,OERR
  39.                         BCF                     RCSTA,CREN              ;DESHABILITO LA RECEPCIÓN
  40.                         NOP                                                     ;PARA ESTABILIZAR.
  41.                         BSF                     RCSTA,CREN              ;HABILITO LA RECEPCIÓN
  42.                         GOTO            NO_RECIBIDO
Título: Re: Problema con el usart.
Publicado por: jhozate en 10 de Octubre de 2009, 16:45:08
en horabuena Leon Pic..este usart te ha sacado canas :D
Título: Re: Problema con el usart.
Publicado por: groundman en 10 de Octubre de 2009, 18:02:14
felizidades.biene muy bien que lo hayas hecho funcionar.ya que a mi me hacia falta comunicar dos pic.y parece que mucha gente en el foro ha tenido problemas con comunicar las usart de dos pic.

cual es es secreto del exito?
habia algo que realizar a parte de poner a cero el bit SYNC del registro TXSTA?
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 10 de Octubre de 2009, 20:13:37
Con tanta emoción me olvidé de comentar el porqué del éxito.
Al parecer el concejo de sander fue el punto del éxito. No se si fue parte, pero sin duda fue de gran ayuda, ya que agregué una línea más en el receptor que borre siempre el bit OERR que se pone a uno si hay un error en la recepción. Al momento no le doy importancia si hay o no error ya que la comunicación es unidireccional y no puedo pedirle al Tx que vuelva a transmitir el dato.

Recuerden que el programa que subí, es para comunicación unidireccional.
Título: Re: Problema con el usart.
Publicado por: alogic.on en 11 de Octubre de 2009, 04:21:10
ole¡¡ me alegro Leon, por fin te has quitado esa espina :-/ :-/

un saludo
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 11 de Octubre de 2009, 10:02:44
Muchas gracias Alogic.on
Ya soñaba con la USART :( :(
Título: Re: Problema con el usart.
Publicado por: groundman en 14 de Octubre de 2009, 16:08:47
yo para los errores de la usart utilizo el siguiente programa:
supongo que por esto nunca he tenido estos problemas.

;<<<<<<<<<<<<<<<<<<<<------SUBPROGRAMA PARA ESPERA DE CARACTER Y CORRECTOR DE ERRORES----->>>>>>>>>>>>>
ERR_USART      btfss   PIR1,RCIF      ;espera al proximo caracter
            goto    ERR_USART 
            btfsc   RCSTA,OERR   
            call   BORR_ERR      ;Error de Sobreescritura
            btfsc   RCSTA,FERR   
            call   BORR_ERR      ;Error de Trama
            bcf     PIR1,RCIF      ;borra el flag de interrupcion por caracter recivido            
            return
            
BORR_ERR      bcf      RCSTA,CREN      ;deshabilita recepcion usart
            movf   RCREG,w         
            movf   RCREG,w   
            movf   RCREG,w            
            bsf      RCSTA,CREN      ;habilita recepcion usart
            return         
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 14 de Octubre de 2009, 17:34:41
Una consulta groundman. ¿por qué insistí en leer el registro RCREG cuando hay un error?
Título: Re: Problema con el usart.
Publicado por: Suky en 14 de Octubre de 2009, 17:36:42
Creo que la idea es una vez desactivado la recepción limpiar el buffer  :?
Título: Re: Problema con el usart.
Publicado por: groundman en 15 de Octubre de 2009, 17:16:27
creo que suky ha dado la respuesta.este codigo no es mio.pero crei entender cuando lo encontre que era para limpiar el buffer.
y desde que lo uso me ha ido muy bien.aunque nunca lo he utilizado para transmisiones de pic a pic.
Título: Re: Problema con el usart.
Publicado por: Leon Pic en 15 de Octubre de 2009, 19:57:58
Muchas gracias a ambos.
Lamentablemente, por falta de tiempo abandoné, por unos días, el proyecto. Mañana espero retomar.
Estoy creando unas rutinas para subir al hilo, rutinas para compartir, pero antes tengo que probarlas.