TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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.
-
¿Puedes pegar aquí el código para ver si podemos ayudar?
-
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
-
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
-
Ponle también un condensador electrolítico de 1 microfaradio entre MCLR y masa y prueba a ver
-
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?
-
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....
-
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.
-
Parece estar bien.
Comprueba bien el conexionado a ver si encuentras algo
-
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
-
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.
-
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
-
agrega esta linea en tu codigo... podria ser cuando cargas el formulario....
MSComm1.InputMode = 1 " (0):texto, (1):binario
-
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.
-
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.
-
podes postear el codigo de vb? quisiera ver como estas procesando los datos al recibirlos....
-
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
-
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.
-
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