TODOPIC

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

Título: Como leo un pin de un puerto?
Publicado por: gabotronic en 26 de Agosto de 2004, 07:39:00
Amigos:
Como leo en asm el estado de un pin del puerto B (por ejemplo) para enviarlo por la usart.
Esto es con un 16F877A a 20Mhz.
 
Saludos

Título: RE: Como leo un pin de un puerto?
Publicado por: MGLSOFT en 26 de Agosto de 2004, 08:43:00
Asi:

   btfsc portA.0
**aqui instruccion de salto si el bit es 1
**aqui continua el programa, porque el bit estaba en cero

Título: RE: Como leo un pin de un puerto?
Publicado por: gabotronic en 26 de Agosto de 2004, 08:55:00
De acuerdo:
Pero para enviar el estado por la uart?.
O sea si es 0 o si es 1 quiero enviarlo igual. como cargo el estado del bit en la uart?.

Saludos
Título: RE: Como leo un pin de un puerto?
Publicado por: MGLSOFT en 26 de Agosto de 2004, 13:35:00
La UART transmite un Byte completo, yo diria que tomes el estado del port completo y lo transmitas, del otro lado solo estudias el bit necesario....
Título: RE: Como leo un pin de un puerto?
Publicado por: gabotronic en 26 de Agosto de 2004, 13:46:00
MGL:
Ahi justamente es donde comienza mi problema.
Capturo el dato del puerto y lo envio al programa, en VB, del PC .
El dato que envía lo puedo ver con terminal. Y es una carita feliz , un corazon, un rombo y ese tipo de caracteres que el VB no reconoce.
Y hasta ahi no mas llegue. Porque no se como traducirlo, pues ni el mismo VB lo considera.
Título: RE: Como leo un pin de un puerto?
Publicado por: MGLSOFT en 26 de Agosto de 2004, 13:51:00
Mucho no te puedo ayudar con VB, pero se que tiene funciones de conversion muy buenas, que te permiten interpretar bien un dato venido por el serial y ademas aislar un bit de los demas...
Título: RE: Como leo un pin de un puerto?
Publicado por: gabotronic en 26 de Agosto de 2004, 14:00:00

Pero, en el pic  ¿se puede tomar la lectura del puerto y enviarlo directamente como decimal?
Título: RE: Como leo un pin de un puerto?
Publicado por: ma-tec en 26 de Agosto de 2004, 14:16:00
hola te sugiro
que leas el pin de la puerta
si es cero envies un caracter que vb lo identifique
ejemplo

   btfss porta,0
    b      cero
    b      uno


cero   movlw  "0"
         call        sale 232
         b    xxx

cero   movlw  "1"
         call        sale 232
         b   xxx

y tu programa espera el 1 o 0

lo puedes mandar con (0D)  (0A)

Título: RE: Como leo un pin de un puerto?
Publicado por: manex_1987 en 26 de Agosto de 2004, 15:00:00
Hola

En VB , cuando te llegue los datos, usa esta funcion con cada uno:

y=asc(dato)

ahi tienes el valor del caracter ASCII , luego implementa una rutina de decimal a binario, y punto.

salu2

PD:
------------ ENTRADA = Y(dec)   SALIDA= X[7...0] (bin)
dim x(0 to 7) as integer

for g=7 to 1 step -1
x(g)=y mod 2
y=y/2
next g
x(0)=y
-------------



Título: RE: Como leo un pin de un puerto?
Publicado por: gabotronic en 26 de Agosto de 2004, 15:10:00
ma-tec: Muy ingenioso, gracias.

Manex: Es lo que necesito, gracias. El pero radica en que

dato = Asc(dato_in_232)

pero el programa se termina diciendo:

Error 5 "llamada a procedimiento o argumentos no validos"

pues el caracter de rombo, trebol, etc. de ascii, el VB no lo reconoce y se termina.

Título: RE: Como leo un pin de un puerto?
Publicado por: manex_1987 en 26 de Agosto de 2004, 15:16:00
Lo siento pero a mi me funcionan perfectamente esos procedimientos... tal vez sea un problema de diseño... por cierto coges los datos directamente de mscomm? Prueba a poner una variable intermedia.
He probado

Private Sub Form_Load()
For x = 1 To 255
g = Chr$(x)
h = Asc(g)
list2.AddItem g
List1.AddItem h
Next x

Y funciona perfectamente, en list2 no aparecen muchos caracteres, pero en List1 aparecen todos los numeros del 1 al 255, osea que no ha habido ningun error en la conversion.

salu2
Título: RE: Como leo un pin de un puerto?
Publicado por: gabotronic en 26 de Agosto de 2004, 15:27:00
Si, los tomo directamente del comm. ¿Como uso una variable intermedia?

Título: RE: Como leo un pin de un puerto?
Publicado por: manex_1987 en 26 de Agosto de 2004, 17:49:00
La fuente de tu error es, seguramente, que cuando lees mscomm1.input, coges mas de un caracter, y la funcion ASC vale solo para un caracter. Podrias cambiar la propiedad inputlen a 1 , o sino, cortar los datos recibidos en unidades, y tratarlas uno a uno.
Título: RE: Como leo un pin de un puerto?
Publicado por: gabotronic en 26 de Agosto de 2004, 19:39:00
Manex:
Parece que estas en lo correcto.
Efectivamente se caia cuando leia mas de un caracter. O cuando no leia nada tambien (parece)

Consulta:
El pic envia cada 1 seg. aprox. un dato. ¿Como le digo al programa de VB que vaya a buscar ese dato solamente?
Título: RE: Como leo un pin de un puerto?
Publicado por: manex_1987 en 27 de Agosto de 2004, 04:40:00
No, el error es muy evidente. ASC( ) te dará error , y ASC(abc) tambien.

Respecto a la consulta, podrias hacer polling mediante un timer, o de lo contrario, mediante interrupcion, de modo que cuando llegue algun dato, salte a una subrutina.

salu2
Título: RE: Como leo un pin de un puerto?
Publicado por: gabotronic en 27 de Agosto de 2004, 10:40:00
La interrupcion como la genero?.
 aunque no me funciona, te envio lo que tengo:

Private Sub Form_Load()
Dim CommPort As String, Handshaking As String, Settings As String
Dim primerdato As String
Dim datofinal As Integer
Dim dato As Integer

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

MSComm1.InputLen = 1
MSComm1.RThreshold = 1




If MSComm1.OutBufferCount = 0 Then
If MSComm1.CommEvent = comEvReceive Then
primerdato = MSComm1.Input
dato = Asc(MSComm1.Input)

Text1.Text = dato

End If
End If
Título: RE: Como leo un pin de un puerto?
Publicado por: Nocturno en 27 de Agosto de 2004, 11:12:00
(Me entrometo)

Pega un objeto Timer en tu form (el que tiene forma de reloj), haz doble click sobre él y te generará un evento On Interval. Pega este trozo de código dentro:

Codigo:
If MSComm1.OutBufferCount = 0 Then
If MSComm1.CommEvent = comEvReceive Then
primerdato = MSComm1.Input
dato = Asc(MSComm1.Input)

Text1.Text = dato

End If
End If


Luego al objeto Timer modifícale la propiedad Interval y le pones 1000 milisegundos, para que se ejecute cada segundo.

Ya ta.
Título: RE: Como leo un pin de un puerto?
Publicado por: gabotronic en 27 de Agosto de 2004, 13:24:00
Gracias a todos:
Manex, Matec, Mglsoft y Nocturno.
Por sus valiosas respuestas.

Título: RE: Como leo un pin de un puerto?
Publicado por: gabotronic en 27 de Agosto de 2004, 16:51:00
Ah, se me olvidaba, finalmente para enviar datos en 1 y 0, del puerto b en este caso, como matec dijo, se puede hacer lo siguiente:

BTFSS   PORTB,0
      MOVLW   D"48"
      BTFSC   PORTB,0
      MOVLW   D"49"
      CALL    Tx_Dato
      BTFSS   PORTB,1
      MOVLW   D"48"
      BTFSC   PORTB,1
      MOVLW   D"49"
      CALL    Tx_Dato
      BTFSS   PORTB,2
      MOVLW   D"48"
      BTFSC   PORTB,2
      MOVLW   D"49"
      CALL    Tx_Dato
      BTFSS   PORTB,3
      MOVLW   D"48"
      BTFSC   PORTB,3
      MOVLW   D"49"
      CALL    Tx_Dato
      BTFSS   PORTB,4
      MOVLW   D"48"
      BTFSC   PORTB,4
      MOVLW   D"49"
      CALL    Tx_Dato
      BTFSS   PORTB,5
      MOVLW   D"48"
      BTFSC   PORTB,5
      MOVLW   D"49"
      CALL    Tx_Dato
      BTFSS   PORTB,6
      MOVLW   D"48"
      BTFSC   PORTB,6
      MOVLW   D"49"
      CALL    Tx_Dato
      BTFSS   PORTB,7
      MOVLW   D"48"
      BTFSC   PORTB,7
      MOVLW   D"49"
      CALL    Tx_Dato


Aunque esto no soluciona lo que quiero hacer pero agradecimientos a Matec por la sugerencia.