Autor Tema: Cuando transmito mi dato a la computadora solo recibo "nul" con rs232  (Leído 2033 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Hola a todos estimados foristas. Denuevo espero que puedan ayudarme con un nuevo problema que he tenido en el proyecto que estoy realizando.
En esta ocacion estoy tratando de realizar la comunicacion entre el pic  16f88 y una pc con el protocolo RS232 con un chip MAX232 como intermediario.

Para empezar solo estoy tratando de transmitir un solo dato "A" desde el pic hacia la pc. Para esto he seguido los pasos recomendados en la hoja de datos del pic 16f88 pagina 103 exepto en que no configuro la interrupcion TXIE . Y uso una interrupcion por RB0 para disparar el encendido del modulo , la transmision de datos y la desactivacion del mismo modulo a la hora de apretar un boton.

Segun a mi entender todo va bien pero a la hora de tratar de ver la A en hyperterminal no aparece, y mediante el uso de un programa llamado Realterm que analiza el puerto de serie puedo ver que solo mando muchos caracteres nul uno tras otro hasta que apago el pic. y no tienen nada que ver con presionar o no el boton , solo se transmiten esos caracteres desde que enciendo el pic , hasta que lo apago. Tambien he notado una alerta en rojo en el programa que me inica
BREAK

Una cosa mas. ¿Cren que sea normal que al conectarle 0v y 5v  a la entrada del MAX232 este entregue -8v y 8v a la salida enlugar de +12v -12v?

Bueno en un momento mas subire el codigo que tengo . Ojala alguien pueda orientarme de algun modo. De antemano muchas gracias.


« Última modificación: 19 de Junio de 2008, 04:16:58 por pakuak »

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cuando transmito mi dato a la computadora solo recibo "nul" con rs232
« Respuesta #1 en: 19 de Junio de 2008, 10:03:26 »
Me parece que -8 y 8 están en el rango 232 y son valores aceptables.
Esperemos entonces que subas el código a ver en qué se te puede ayudar...
Por cierto, estás seguro que está funcionando correctamente la subrutina de interrupción en RB0?
Por ejemplo,podrías colocar que encienda un led al comienzo de la rutina de transmisión serial, así sabes si el pic está entrando en esa parte del programa o no.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Cuando transmito mi dato a la computadora solo recibo "nul" con rs232
« Respuesta #2 en: 19 de Junio de 2008, 17:10:04 »
Hola

Por lo que comentas de los envios, pareceria mas error del codigo, ya que si no no recibiriras nada en el terminal. Porque no posteas tu codigo completo para ver de que se trata ah?

Saludos
El papel lo aguanta todo

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Re: Cuando transmito mi dato a la computadora solo recibo "nul" con rs232
« Respuesta #3 en: 21 de Junio de 2008, 00:47:05 »
Hola a todos . Les pido una disculpa por el retraso. Por alguna razon muchas veces me ha salido un letrero de "Service Unavailable" cada vez que quiero entrar al foro y por eso no habia podido publicar mas.
Gracias por sus respuestas y en especial a Firepic , por que tenias toda la razon con la interrupcion. Parte del  problema fue que comente el timer 1 y por eso no se refrescaba el perro guardian. :mrgreen: Ya arregle eso ,ahora estoy seguro que se generan interrupciones por que puedo ver que cuando presiono el boton se agregan nuevos datos de "Nul" a los datos que recibe mi maquina. El problema es que siguen siendo puros datos "Nul" en lugar del dato que mando.


Este es mi codigo:
Primero la parte principal

Código: [Seleccionar]
;PRINCIPAL.ASM

INCLUDE<P16F88.INC>
ERRORLEVEL - 302
ERRORLEVEL - 305

ORG 0X00
GOTO INICIO
ORG 0X04
GOTO INTERRUPCION


INCLUDE<INICIALIZAR.INC>
INCLUDE<CONFIGURACION.INC>
INCLUDE<INTERRUPCION.INC>
INCLUDE<EVENTOS.INC>

CUENTA_T1 EQU 0X20
CUENTA_AR1 EQU 0X21
CUENTA_AR2 EQU 0X22
CUENTA_AR3 EQU 0X23

W_TEMP EQU 0X70
STATUS_TEMP EQU 0X71
PCLATH_TEMP EQU 0X72

INICIO
;{;
CALL INICIALIZAR
CALL CONFIGURAR_IO
CALL CONFIGURAR_WDT
CALL CONFIGURAR_AUSART
CALL CONFIGURAR_RB0
CALL CONFIGURAR_T1
;};

GOTO $
END



Luego la inicializacion de los puertos


Código: [Seleccionar]
;INICIALIZAR.INC
INICIALIZAR
;{;
BSF STATUS,RP0 ;BANCO 1
CLRF ANSEL ;TODAS LOS PINES EN MODO DIGITAL
CLRF TRISA ;TODO EL PUERTO A COMO SALIDA (RA5/MCLR NO PUEDE SER SALIDA)
CLRF TRISB ;TODO EL PUERTO B COMO SALIDA
BCF STATUS,RP0 ;BANCO 0
MOVLW .99 ;VALOR PARA TENER TOGGLE CADA SEGUNDO
MOVWF CUENTA_T1 ;CONFIGURA LA CUENTA DE 1 SEGUNDO
CLRF PORTA ;TODO EL PUERTO A APAGADO
CLRF PORTB ;TODO EL PUERTO B APAGADO
;};
RETURN


Luego la configuracion de los modulos


Código: [Seleccionar]
;CONFIGURACION.INC


CONFIGURAR_IO
;{;
BSF STATUS,RP0 ;BANCO 1
MOVLW B'11111111' ;TODO EL PUERTO A COMO ENTRADA
MOVWF TRISA ;CONFIGURAR IO PUERTO A
MOVLW B'11010111' ;RA3(LED)RA5(TX)COMO SALIDA
MOVWF TRISB ;CONFIGURAR IO PUERTO B
BCF STATUS,RP0
BCF PORTB,5
;};
RETURN


CONFIGURAR_WDT
;{;
BANKSEL WDTCON ;BANCO 2
CLRF WDTCON ;WDT SE DESBORDA CADA 2.62 CS
BCF STATUS,RP1 ;BANCO 0
;};
RETURN

CONFIGURAR_RB0
;{;
BCF STATUS,RP0 ;BANCO 0
;BTFSC PORTB,0 ;PRUEBA CUAL ES EL VALOR ACTUAL DE RB0
GOTO CONFIGURAR_RB0_D ;SI ESTA EN 1 CONFIGURA RB0 DECENDENTE
GOTO CONFIGURAR_RB0_A ;SI ESTA EN 0 CONFIGURA RB0 ASCENDENTE

CONFIGURAR_RB0_D
BSF STATUS,RP0 ;BANCO 1
BCF OPTION_REG,INTEDG ;CONFIGURA LAS INTERRUPCIONES RB0 EN FLANCO DE BAJADA
GOTO TERMINA_CONF_RB0 ;VE A TERMINA_CONF_RB0

CONFIGURAR_RB0_A
BSF STATUS,RP0 ;BANCO 1
BSF OPTION_REG,INTEDG ;CONFIGURA LAS INTERRUPCIONES RB0 EN FLANCO DE SUBIDA

TERMINA_CONF_RB0
BCF STATUS,RP0 ;BANCO 0
BCF INTCON,INTF ;LIMPIA LA BANDERA DE INTERRUPCION RB0
BSF INTCON,INTE ;HABILITA INTERRUPCIONES PUERTO RB0
BSF INTCON,GIE ;HABILITA INTERRUPCIONES GLOBALES
;};
RETURN

CONFIGURAR_AUSART
;{;
BSF STATUS,RP0 ;BANCO 1
MOVLW .25 ;LITERAL A W
MOVWF SPBRG ;CONFIGURA EL BAUDRATE GENERATOR 9600
BSF TXSTA,BRGH ;CONFIGURA EL BAUDRATE ALTO
BCF TXSTA,SYNC ;MODO ASINCRONO
BSF TXSTA,TXEN ;HABILITA LA TRANMISION DE DATOS
BCF STATUS,RP0 ;BANCO 0
;};
RETURN

CONFIGURAR_T1
;{;
BCF STATUS,RP0 ;BANCO 0
BCF PIR1,TMR1IF ;LIMPIA BANDERA DE INTERRUPCION POR TIMER1
;(USAR CRISTAL 4MHZ)
MOVLW B'11011000' ;NUMERO ALTO DE CONFIGURACION T1 PARA TENER DESBORDES DE 1CS
MOVWF TMR1H ;CONFIGURA T1H
;(USAR CRISTAL 4MHZ)
MOVLW B'11110001' ;NUMERO BAJO DE CONFIGURACION T1 PARA TENER DESBORDES DE 1CS
MOVWF TMR1L ;CONFIGURA T1L
MOVLW B'00000101' ;RELOJ FOSC/4
MOVWF T1CON ;CONFIGURA T1
BSF STATUS,RP0 ;BANCO 1
BSF INTCON,GIE ;HABILITA INTERRUPCIONES GLOBALES
BSF INTCON,PEIE ;HABILITA INTERRUPCIONES POR PERIFERICOS 1
BSF PIE1,TMR1IE ;HABILITA INTERRUPCIONES POR TIMER 1
;};
RETURN


Luego lo que hacen las interrupciones


Código: [Seleccionar]
;INTERRUPCION.INC
;---------------------------------------------------------------------------------------------
INTERRUPCION
;{;
INICIA_INT
CALL SALVA_ENTORNO
CALL IDENTIFICA_INT
FINALIZA_INT
CALL RESTAURA_ENTORNO
;};
RETURN
;---------------------------------------------------------------------------------------------
SALVA_ENTORNO
;{;
MOVWF    W_TEMP          ;Copy W to TEMP register
SWAPF    STATUS, W      ;Swap status to be saved into W
CLRF     STATUS          ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
MOVWF    STATUS_TEMP      ;Save status to bank zero STATUS_TEMP register
MOVF     PCLATH, W        ;Only required if using page 1
MOVWF    PCLATH_TEMP      ;Save PCLATH into W
CLRF     PCLATH          ;Page zero, regardless of current page
;};
RETURN

RESTAURA_ENTORNO
;{;

MOVF     PCLATH_TEMP, W ;Restore PCLATH
MOVWF    PCLATH          ;Move W into PCLATH
SWAPF    STATUS_TEMP, W  ;Swap STATUS_TEMP register into W
                            ;(sets bank to original state)
MOVWF    STATUS          ;Move W into STATUS register
SWAPF    W_TEMP, F ;Swap W_TEMP
SWAPF    W_TEMP, W        ;Swap W_TEMP into W
;};
RETURN

IDENTIFICA_INT
;{;
BCF STATUS,RP0 ;BANCO 0
BTFSC PIR1,TMR1IF ;VE SI ESTA EN 1 LA BANDERA DE TIMER 1
GOTO DESBORDE_TIMER_1 ;EJECUTA EL DESBORDE DE TIMER1
BTFSC INTCON,INTF ;REVISA SI ESTA EN 1 LA BANDERA DE RBO
GOTO CAMBIO_RB0 ;EJECUTA EL CAMBIO EN RB0
;};
RETURN
;----------------------------------------------------------------------------------------------
DESBORDE_TIMER_1
;{;
BCF STATUS,RP0 ;BANCO 0
CLRWDT ;LIMPIA EL PERRO GUARDIAN
CALL CONFIGURAR_T1 ;CONFIGURA EL TIMER 1
BCF STATUS,RP0 ;BANCO 0 (EL BANCO CAMBIO EN CONFIGURAR_T1)
DECFSZ CUENTA_T1 ;DECREMENTA CUENTA_T1
GOTO FINALIZA_INT ;FINALIZA LA INTERRUPCION SI LA CUENTA NO HA LLEGADO A 0
COMF PORTA ;COMPLEMENTA PUERTO A
;COMF PORTB ;COMPLEMENTA PUERTO B
MOVLW .99 ;VALOR PARA TENER TOGGLE CADA SEGUNDO
MOVWF CUENTA_T1 ;CONFIGURA LA CUENTA DE 1 SEGUNDO
CALL CONFIGURAR_T1 ;RECONFIGURA LA INTERRUPCION DE T1
;};
GOTO FINALIZA_INT

CAMBIO_RB0
;{;
ANTIRREBOTE
;{;
BCF STATUS,RP0 ;BANCO 0
MOVLW .50 ;LITERAL A W
MOVWF CUENTA_AR3 ;CARGA LA CUENTA DE 50ms
MOVLW .4 ;LITERAL A W
MOVWF CUENTA_AR2 ;CARGA LA CUENTA DE 1ms
CICLO_AR1
MOVLW .250 ;LITERAL A W 250
MOVWF CUENTA_AR1 ;CARGALE 250 A CUENTA AR1
DECFSZ CUENTA_AR1 ;DECREMENTA DE 250 A 0 AR1
GOTO $-1 ;REGRESA AL CICLO
CICLO_AR2
DECFSZ CUENTA_AR2 ;DECREMENTA 1 DE LA CUENTA DE 4 PASADAS DE 250
GOTO CICLO_AR1 ;REGRESA A DAR OTRA PASADA DE 250
CICLO_AR3
MOVLW .4 ;LITERAL A W
MOVWF CUENTA_AR2 ;RECARGA EL 4 DE LA SEGUNDA CUENTA
DECFSZ CUENTA_AR3 ;DECREMENTA LA CUENTA DE 50 PASADAS (DE 4 PASADAS (DE 250))
GOTO CICLO_AR1 ;REGRESA AL CICLO INICIAL
;};
BCF STATUS,RP0 ;BANCO 0
CLRWDT ;LIMPIA EL PERRO GUARDIAN
CALL CONFIGURAR_RB0 ;RECONFIGURA RB0
CALL EVENTO_TRANSMITIR
;};
GOTO FINALIZA_INT

Por ultimo otros eventos

Código: [Seleccionar]
;EVENTOS.INC
EVENTO_TRANSMITIR
;{;
BSF STATUS,RP0
; BSF TXSTA,TXEN ;HABILITA LA TRANMISION DE DATOS
BCF STATUS,RP0
MOVLW .65
MOVWF TXREG
; BSF STATUS,RP0
; BCF TXSTA,TXEN ;HABILITA LA TRANMISION DE DATOS
; BSF PORTB,3
; BCF STATUS,RP0
;};
RETURN

El problema con el watchdog timer ya lo arregle ,con lo que consegui que se quedara estatico en lugar de mandar muchos caracteres "nul" , y cuando genero la interrupcion se sigue mandando ese mismo caracter enlugar de mi dato decimal 65 que segun una tabla que tengo corresponde al caracter ascii A.

Bueno sin mas por el momento , muchas gracias por cualquier sugerencia que puedan darme


« Última modificación: 21 de Junio de 2008, 00:53:13 por pakuak »

Desconectado pakuak

  • PIC10
  • *
  • Mensajes: 31
Re: Cuando transmito mi dato a la computadora solo recibo "nul" con rs232
« Respuesta #4 en: 23 de Junio de 2008, 15:36:21 »
Este programa tal cual como lo puse tenia 2 errores .

1) Faltaba activar el bit SPEN(RCSTA<7>)     
2)Faltaba activar  los bits TRISB <5,2>

Tambien tuve problemas con la idea de tratar de mandar un solo dato ya que hyperterminal no solo despliega los datos enviados , sino que nescesita una especie de formato

al final quedo asi:

Código: [Seleccionar]
;EVENTOS.INC
EVENTO_TRANSMITIR
;{;
CONF_MENSAJE
;{;
BCF STATUS,RP0 ;BANCO 0
MOVLW 'H' ;INICIO DE TEXTO
CALL MANDAR_DATO
MOVLW 'O' ;INICIO DE TEXTO
CALL MANDAR_DATO
MOVLW 'L' ;INICIO DE TEXTO
CALL MANDAR_DATO
MOVLW 'A' ;INICIO DE TEXTO
CALL MANDAR_DATO
MOVLW  0X0D ; CR
        CALL MANDAR_DATO
        MOVLW  0X0A ; LF
        CALL MANDAR_DATO
;};
RETURN

MANDAR_DATO
;{;
MOVWF TXREG             ; SEND DATA IN W
BSF STATUS,RP0          ; PAGINA 1
  BTFSS TXSTA,TRMT        ; (1) TRANSMISSION IS COMPLETE IF HI
        GOTO $-1
  BCF STATUS,RP0          ; RAM PAGE 0
;};
RETURN
;};

Bueno sin mas espero que  esto lsirva para quien tenga algun problema similar al mio.

Muchas gracias  por sus respuestas



Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cuando transmito mi dato a la computadora solo recibo "nul" con rs232
« Respuesta #5 en: 23 de Junio de 2008, 18:14:04 »
Pakuak, excelente que lograste resolver el problema, felicitaciones!  :-/
Y gracias por colocar tu código, así, tal como tú lo mencionas, le puede servir a alguien más.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web