TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: gabotronic en 26 de Agosto de 2004, 06:29:00

Título: Problema con TX de Pic a PC
Publicado por: gabotronic en 26 de Agosto de 2004, 06:29:00
Amigos:
Tengo un problema que me las trae y no se como resolverlo .
Al leer el puerto B del pic16F877 obtiene un dato binario de 3 (00000011) pero como lo envia es ascii me manda un corazon (el 3 en ascii es un caracter de corazon) que VB lo toma como basura.
Pregunta:¿Hay alguna forma de que el pic trabaje con numeros decimales (intente con d"3", .3, b"00000011", pero nada), para que el VB pueda leer algun dato razonable y no caritas riendose, rombos o corazones?

Otra pregunta:
Cuando hago reset, el micro se cae y no funciona mas . Tengo que cortar la alimentacion y volver a conectarla para que vuelva a funcionar. ¿Alguna idea de porque?

El pic es 16F877 a 20Mhz el micro esta programado en asm y elPC en VB6.

Saludos.


                                   
Título: RE: Problema con TX de Pic a PC
Publicado por: Nocturno en 26 de Agosto de 2004, 06:56:00
¿Puedes pegar aquí el código para ver si podemos ayudar?
Título: RE: Problema con TX de Pic a PC
Publicado por: T0ni0 en 26 de Agosto de 2004, 06:59:00
hola gabotronic, supongo que lo que quieres es mandar caracteres por la UART, bueno eso lo puedes hacer así:

MOVLW   A"1"

y envías el dato del acumulador, en el Hyperterminal saltrá escrito el 1, esa es la manera de cargar directamente los caracteres ASCII, pero en realidad en el acumulador lo que hay es un decimal 49 o hexadecimal 0x31 ok ?  

Espero que te sirva, en cuanto al reset...  como tienes conectada la linia MCLR* ?   directa a Vcc? o con una Resisténcia bueno ya explicarás algún detalle
Título: RE: Problema con TX de Pic a PC
Publicado por: gabotronic en 26 de Agosto de 2004, 07:32:00
Amigos:
Gracias por su pronta respuesta. Envio resumen del asm, porque todo seria una lata. A no ser que sea necesario y que tengan algo de tiempo para leerlo. Si es asi me dicen y lo envio.

Como se ve lo que quiero hacer es enviar un dato por la usart en decimal. O sea ingresar un 3 decimal y que en el PC (Visual basic) me reciba y lea un 3 decimal.
Lo que pasa es que estoy leyendo la puerta B del pic y esa informacion debo enviarla al PC, pero me envia corazones, caritas riendose, etc.

Con respecto al reset esta conectado Vcc R10K - R120 Pin1. En el signo - lo llevo a tierra para resetearlo. ¿Esta bien, no?



   List    p=16F877A      ;Tipo de procesador
      
      include   "P16F877A.INC"   ;Definiciones de registros internos
      radix   dec

PDel0    equ 20H
PDel1   equ 21H
PDel2    equ 22H

      org   0x00            ;Vector de Reset
      goto   Inicio

      org   0x04            ;Vector de interrupción
      goto   Inter

;********************************************************************************************
;Tx_Dato: Transmite vía serie el dato presente en el reg. W

Tx_Dato      
      bcf      PIR1,TXIF   ;Restaura el flag del transmisor
      movwf   TXREG      ;Almacena el byte a transmitir
      bsf      STATUS,RP0   ;Banco 1
Tx_Dato_Wait   
      btfss   TXSTA,TRMT   ;Byte transmitido ??
      goto   Tx_Dato_Wait;No, esperar
      bcf      STATUS,RP0   ;Banco 0
      return            ;Si

;******************************************************************************************
;Tratamiento de la interrupción

Inter   
      radix   dec
      btfss   PIR1,RCIF   ;Ha sido interrupción en la recepción ??
      retfie            ;No, falsa interrupción
      bcf      PIR1,RCIF   ;Si, restaurar el flag de interrupción
      movf   RCREG,W      ;Lee el dato recibido
      call   Tx_Dato      ;Lo retransmite a modo de eco
                 MOVWF   PORTB      ;Mueve inf. puerto B a W
      call           Tx_Dato
      movlw   3
      call    Tx_Dato
      movlw   .3
      call    Tx_Dato
      movlw   b"00000011"
      call    Tx_Dato
      movlw   D"3"
      call    Tx_Dato
      movlw   0x03
      call    Tx_Dato
      movlw   H"3"
      call    Tx_Dato
      
   ;   movlw   ."3"
   ;   call    Tx_Dato

      retfie

;*******************************************************************************************
;Programa principal

Inicio       
      clrwdt
      clrf   PORTC      
      clrf   PORTB
      bsf      STATUS,RP0   ;Selecciona banco 1
      movlw   b"10111111"
      movwf   TRISC      ;RC7/Rx entrada, RC6/Tx salida
                 movlw   b"11111111"   
      movwf   TRISB      ;Configura puerto B como entrada
      movlw   b"11001111"
      movwf   OPTION_REG   ;Preescaler de 128 asociado al WDT

      movlw   b"00100100"   
      movwf   TXSTA      ;TX en On, modo asíncrono con 8 bits y alta velocidad
      movlw   .130
      movwf   SPBRG      ;9600 baudios con Fosc=20MHz
      bsf      PIE1,RCIE   ;Habilita interrupción en la recepción
      bcf      STATUS,RP0   ;Selecciona banco 0

      movlw   b"10010000"
      movwf   RCSTA      ;USART en On, recepción contínua
      bsf      INTCON,PEIE   ;Activa interrupción de periféricos
      bsf      INTCON,GIE   ;Activa interrupciones

Loop      clrwdt
      goto   Loop

end

Título: RE: Problema con TX de Pic a PC
Publicado por: Modulay en 26 de Agosto de 2004, 08:02:00
Ponle también un condensador electrolítico de 1 microfaradio entre MCLR y masa y prueba a ver
Título: RE: Problema con TX de Pic a PC
Publicado por: gabotronic en 26 de Agosto de 2004, 08:19:00
Hice la prueba con el condensador, y lo mismo. El Pic no anda. A mi me parece que fuera algo del programa.
¿A que direccion se va cuando se resetea?


Título: RE: Problema con TX de Pic a PC
Publicado por: Modulay en 26 de Agosto de 2004, 08:28:00
A la dirección 0.
En tu programa deberías tener algo asi:

org      0x00           ;Vector de reset
goto    INICIO
org      0x04           ;Salva el vector de interrupción
goto    INICIO

INICIO
Código....
Título: RE: Problema con TX de Pic a PC
Publicado por: gabotronic en 26 de Agosto de 2004, 08:48:00
   org   0x00            ;Vector de Reset
      goto   Inicio

      org   0x04            ;Vector de interrupción
      goto   serv_int
;********************************************************************************************
;Tx_Dato: Transmite vía serie el dato presente en el reg. W

Tx_Dato      
      bcf      PIR1,TXIF   ;Restaura el flag del transmisor
      movwf   TXREG      ;Almacena el byte a transmitir
bla, bla, bla

Asi esta, bueno antes del org 0x00 estan las definiciones.
Título: RE: Problema con TX de Pic a PC
Publicado por: Modulay en 26 de Agosto de 2004, 09:01:00
Parece estar bien.
Comprueba bien el conexionado a ver si encuentras algo
Título: RE: Problema con TX de Pic a PC
Publicado por: T0ni0 en 26 de Agosto de 2004, 10:15:00
Haber, sobre la manera de enviar, como te comenté antes prueba con:
 movlw A"3"
call Tx_Dato

haber si te llega un 3 ok?

si lo que quieres es enviar el numero que vale el portb :

movvf potb,0
addlw d"48"
call Tx_Dato

con esto si el portb es b"00000011" enviará un 3 que podrás leer.

Por otra parte no he visto la rutina Tx_Dato pero supongo que no envias por interrupción si no por escaneo, bien pues antaño yo me encontre con el problema de enviar y recibir al mismo tiempo y de vez encuando se quedaba clabado, podría ser tu problema, pruba una cosa desabilita las interrupciones cuando envias quizás también dentro de la rutina de interrupción sería bueno, venga compañero haber si lo sacamos
Título: RE: Problema con TX de Pic a PC
Publicado por: Golden_Eagle en 26 de Agosto de 2004, 11:30:00
nmnmn.
Q pasa por el lado del pc??
Supongo q estaras usando el mscomm
recorda q hay una propiedad llamada "InputMode" q te permite seleccionar si vas a estar leyendo texto o binarios al usar "input" para leer el buffer de entrada.
Título: RE: Problema con TX de Pic a PC
Publicado por: gabotronic en 26 de Agosto de 2004, 11:38:00
Golden:
Si, estoy usando Mscomm y me recibe los datos en caracteres ascii y yo lo quiero en decimal o en binario, lo que sea menos ascii!!!
Input mode? parece que por ahi va el cuento. No he configurado ningún input mode. Como se hace?

Tonio:
Para enviar utilizo una rutina TX_Dato (la primera rutina del programa). La verdad es que nose si es por interrupcion o por escaneo, al parecer seria por escaneo, nose.
Si me envia el numero 3 de las dos formas, pero si el puerto B cambia de estado lo enviado ya no sirve. En el puerto B entraran datos variables de 0 a 50.

Saludos y gracias
Título: RE: Problema con TX de Pic a PC
Publicado por: Golden_Eagle en 26 de Agosto de 2004, 11:47:00
agrega esta linea en tu codigo... podria ser cuando cargas el formulario....
MSComm1.InputMode = 1   " (0):texto, (1):binario
Título: RE: Problema con TX de Pic a PC
Publicado por: T0ni0 en 26 de Agosto de 2004, 12:09:00
Bueno pues, cuando hayas probado la comunicación por el PC , cambias la rutina de envio por la siguiente:


;********************************************************************************************
;Tx_Dato: Transmite vía serie el dato presente en el reg. W

Tx_Dato
bcf INTCON,GIE   ;DESABILITA INTERRUPCIONES

bcf PIR1,TXIF ;Restaura el flag del transmisor

Tx_Dato_Wait
btfss TXSTA,TRMT ;Byte transmitido ??
goto Tx_Dato_Wait;No, esperar

movwf TXREG ;Almacena el byte a transmitir
bsf STATUS,RP0 ;Banco 1
bcf STATUS,RP0 ;Banco 0

bsf INTCON,GIE   ;HABILITA INTERRUPCIONES
return ;Si

;******************************************************************************************

Haber si con esto no se queda pillado.


Aunque en VB te lleguen caras o corazones eso no quiere decir que no tengas el valor en el bufer, por lo que SI puedes saber que numero ha llegado, si te envia un 0x03 lo puedes comparar con  Chr(3)   por ejemplo, una cosa es el valor que tenga otra su interpretación.
 
Título: RE: Problema con TX de Pic a PC
Publicado por: gabotronic en 26 de Agosto de 2004, 13:39:00
Gracias Tonio!!
El cuento del reset se arreglo con la habilitacion-deshabilitacion.

Pero sigo con el problema de los datos

El problema es que el corazon o la carita el Visual Basic no los toma como dato (al parecer).

¿Como podria leer o traducir a decimal una carita que se rie?, siendo que ni el mismo VB lee esa cara (que me tiene hasta aca )

¿No es posible que el pic envie el dato leido en la puerta directamente en decimal?

Golden:
Estoy tratando de configurar el programa con la opcion input que me mencionaste. La primera prueba que hice me arrojaba siempre un signo de interrogacion (?) para cualquier dato que llegaba. Aunque sigo intentando, no voy a colgar los guantes por un dato.
Título: RE: Problema con TX de Pic a PC
Publicado por: Golden_Eagle en 26 de Agosto de 2004, 13:51:00
podes postear el codigo de vb? quisiera ver como estas procesando los datos al recibirlos....
Título: RE: Problema con TX de Pic a PC
Publicado por: gabotronic en 26 de Agosto de 2004, 14:05:00
Private Sub Botenter_Click()

Txtran.Text = 2
MSComm1.Output = Txtran.Text    "se transmite 2 correspondiente a led boton enter

End Sub

Private Sub Botfrio_Click()

Txtran.Text = 1
MSComm1.Output = Txtran.Text    " se transmite 1 correspondiente a led boton frio

End Sub

Private Sub Bothist_Click()
                                "Abrir ventana con informacion y menues para ver historicos
End Sub

Private Sub Botprog_Click()
Dim MiVar
MiVar = MsgBox("Va a entrar en modo programación, si acepta deberá esperar 8 segundos aproximadamente", 65, "Aviso de Sistema"
If MiVar = 1 Then
Txtran.Text = 6
MSComm1.Output = Txtran.Text    " se transmite 6 correspondiente a comando programacion

End If
End Sub

Private Sub Botreset_Click()

Dim MiVar
MiVar = MsgBox("Va a resetear termostato, si acepta deberá esperar 11 segundos aproximadamente", 65, "Aviso de Sistema"
If MiVar = 1 Then
Txtran.Text = 7
MSComm1.Output = Txtran.Text    " se transmite 7 correspondiente a comando reset

End If
End Sub

Private Sub Botsalir_Click()
MSComm1.PortOpen = False
End
End Sub

Private Sub Botset_Click()
Dim MiVar
MiVar = MsgBox("Va a cambiar Set Point de Termostato, si acepta deberá esperar 5 segundos aproximadamente", 65, "Aviso de Sistema"
If MiVar = 1 Then
Txtran.Text = 5
MSComm1.Output = Txtran.Text    " se transmite 5 correspondiente a comando setpoint

End If
End Sub

Private Sub Form_Load()
Dim CommPort As String, Handshaking As String, Settings As String

Dim buferentrada    As String
MSComm1.CommPort = 1        "puerto com1
MSComm1.PortOpen = True     "se abre el puerto para que funcione

End Sub

Private Sub MSComm1_OnComm()
MSComm1.Settings = "9600,n,8,1" "configuracion del puerto serie
"MSComm1.InputMode = 0 " (0):texto, (1):binario
"InputMode = comInputModeBinary
End Sub




Private Sub Timer1_Timer()
Dim primerdato As String
Dim segundodato As String

MSComm1.InputMode = 1 " (0):texto, (1):binario
primerdato = MSComm1.Input    

Text1.Text = primerdato        "el puerto serie

"Text1.Refresh
End Sub
Título: RE: Problema con TX de Pic a PC
Publicado por: Colores en 26 de Agosto de 2004, 22:33:00
Aclaración...
Tu Pc y VB reciben en la entrada del puerto serie 00000011.
Esto quiere decir que lo podés enviar como decimal, como binario o como ASCII... el resultado va a ser el mismo.
Ahora bien, vos recibís una carita o corazón? Probá con la función que te devuelve el número ASCII del caracter correspondiente (en VB).
Esto en caso de que sólo sean números lo que querés enviar.
Ahora, si querés enviar cualquier alfanumérico ahí si tenés que convertirlo a ASCII en el pic antes de enviarlo.
O sea:
Si vos enviás un 3 decimal la UART la a enviar 00000011 y VB la a creer que es el valor ASCII de un caracter. Resultado: un corazón.

Si vos convertís en el pic el 3 a ASCII este lo va a convertir en el número 51, este a su vez en la UART va a ser el 00110011 en binario. Cuando lo recibe VB el mscomm hace el proceso inverso y tenés un "3".

Probá.... lo mío son solo teorías.

Probá sinó de enviar un 51 desde el pic con el código que tenés ahora, tendrías que recibir un 3 en VB.
Título: RE: Problema con TX de Pic a PC
Publicado por: gabotronic en 27 de Agosto de 2004, 13:22:00
Gracias a todos por las respuestas (Colores, modulay, Tonio, Nocturno, Golden).

El tema del reset lo resolvi con las interrupciones segun me indico tonio.
El tema de la recepcion de datos fue un poco de todo, pero definiendo una variable como

 Dim Variable as String * 1    

Ya no tuve problemas para leer el dato de entrada.

Bueno ahora a seguir con el tema pues este fue un problemilla, ojala que no se vuelvan a presentar.

Saludos