Autor Tema: Como leer la entrada de dato de un pic  (Leído 7326 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado celsopuma

  • PIC10
  • *
  • Mensajes: 25
Como leer la entrada de dato de un pic
« en: 04 de Agosto de 2011, 02:31:34 »
Buenas noches...aqui nuevamente tratando de aprender a utilizar los pic, les cuento estoy haciendo un code el cual debe ser un contador binario y los resultados mostrar encendiendo 8 leds, ya tengo todo el codigo q al parecer esta bien pero cuando lo simulo en proteus ho funcioa bien...funciona asi...tengo un pulsante el cual al presionar el pic resive esa señal y le indica a mi codigo q se ha presionado el pulsante y entonces se suma 1 a una variable es decir arranca la variable en 0(cero) y si se presiona el pulsante se suma uno y queradia entonces mi variable en 1(uno) y otro codio lo que hace es converir eso a binario y de acuerdo al numero saca el dato por el puerto B digamos 10000000 o quiza 01100000 (es solo un ejemplo)...pero cuando lo simulo no funciona como deberia este mi codigo espero me puedan ayudar q esta mal...

 dim con as integer
 dim num as byte


cmcon = 7            'convierte todo el puerto A en Digital
Trisb=0    ' hace todos los pines del puerto B como salidas
trisa=1
num= 0

contar:
           if porta.1=1 then 'Pregunto si se ha presionado el pulsante
           delay_ms(200)  ' Un pequeño retardo
           num=num+1   ' Si se presiono aumento la variable para seguir sumadno
           end if
GOTO contar

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Como leer la entrada de dato de un pic
« Respuesta #1 en: 04 de Agosto de 2011, 03:50:06 »
Buenas,
Sin saber mucho de basic quizá me equivoque, pero al hacer TRISA=1, estás dando sentido de entradaa la patilla 0 del PORTA y salida al resto. Después tu estás escaneando la pata 1 (if porta.1=1), asique prueba con la patita 0 en vez de la 1 y engancha el pulsador a la patita 0 del PORTA por supuesto, y deberías usar, si no lo estás haciendo ya, un pull-down en este caso en la patita del pulsador.

Desconectado celsopuma

  • PIC10
  • *
  • Mensajes: 25
Re: Como leer la entrada de dato de un pic
« Respuesta #2 en: 04 de Agosto de 2011, 07:11:08 »
Si ya probe en el port 0 pero ahi corre sin q le haga nada...es decir no espera a q presione el pulsante....y q es eso de un pull-down, como lo pongo en proteus...??

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Como leer la entrada de dato de un pic
« Respuesta #3 en: 04 de Agosto de 2011, 07:16:53 »
Lo del pull-down se hace mediante una resistencia (10k) desde el pin de entrada a gnd. Un pull-up sería lo mismo pero a vcc.

Por otro lado estas comentando que tienes otro codigo que te saca la variable por el puertoB. Me imagino que ese codigo lo pondrás entre el "end if" y el "GOTO contar", ya que aquí estás metido en un bucle infinito y no podrás ejecutar mas codigo a no ser por interrupción.

Pd. esto ultimo podría equivocarme pq no se nada de basic, por lo que se me podría estar escapando algo.

 Saludos.
« Última modificación: 04 de Agosto de 2011, 07:21:00 por tannke »

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Como leer la entrada de dato de un pic
« Respuesta #4 en: 04 de Agosto de 2011, 07:29:49 »
para el pull down (es que se te puede quedar un valor al aire) lo que tienes que poner es una R de 10 k a la salida del switch (que también es la entrada de la patilla del PIC) o boton que uses como pulsador y que vaya a masa.
Si no te va con el 0 cuando asignas un uno, quizá sea que le bit MSB es el 0 y el LSB el 7, asique puedes intentar leer de la pata 7. Por probar.

Desconectado celsopuma

  • PIC10
  • *
  • Mensajes: 25
Re: Como leer la entrada de dato de un pic
« Respuesta #5 en: 04 de Agosto de 2011, 18:43:05 »
Ya hice todo lo q m sugirieron pero nada es nada...sigo con el mismo problema y este es el codigo q tengo..

 dim con as integer
  dim num as byte

main:
cmcon = 7            'convierte todo el puerto A en Digital
Trisb=0    ' hace todos los pines del puerto B como salidas
TRISA=1
num= 0    'carga el valor inicial de 0 a la variable num

pulsar:
portb=num   'indica sacar el valor de num a través del puerto B

IF porta.1=0  then
goto contar
end if
           contar:
           if porta.1=1 then
           delay_ms(200)
           num=num+1
           end if
GOTO pulsar   ' volver al principio del programa
END.


No se donde puede estar mal...pero creo q es al momento de leer el puerto de entrada supongo q me hace falta algo por ahi x eso parace q nunca entrada nada por el porta1, ya que todo siempre esta en cero, y si cambie en ultimo if q seria este

 if porta.1=1 then
           delay_ms(200)
           num=num+1
           end if

por este...

 if porta.1=0 then
           delay_ms(200)
           num=num+1
           end if

es cuando empieza a contar solo sin tocar el pulsante(claro logico porq el puerto esta en cero...) espero me puedan ayudar a darle solucion...

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Como leer la entrada de dato de un pic
« Respuesta #6 en: 05 de Agosto de 2011, 04:23:13 »
Sigo pensando que no has puesto o has puesto mal el pull-up/pull-down, te pongo una imagen para que te quede mas claro:



El primero "U1" tiene un pull-up, esta linea siempre está a vcc hasta que pulsas el boton, entonces pasa a gnd. Para el pull-up tienes que usar este if:
 
if porta.1=0 then
           delay_ms(200)
           num=num+1
           end if

En caso de querer usar la 2ª configuración "U2" estarás usando pull-down (linea siempre a gnd hasta que presiones el botón que esta sube a vcc) en este caso tendras que usar el otro if

if porta.1=1 then
           delay_ms(200)
           num=num+1
           end if

Por otra parte:
En el codigo tienes tu primer IF:

IF porta.1=0  then
goto contar
end if

Este realmente no esta haciendo nada ya que si Porta1 es CERO saltará a contar, pero si es UNO no saltará y ejecutara contar igualmente. Lo unico que estás consiguiento es un pequeño retardo.


Bueno, espero asi te funcione. Un saludo
« Última modificación: 05 de Agosto de 2011, 04:25:37 por tannke »

Desconectado celsopuma

  • PIC10
  • *
  • Mensajes: 25
Re: Como leer la entrada de dato de un pic
« Respuesta #7 en: 05 de Agosto de 2011, 23:25:43 »
Ya hice un nuevo diseño y nada sigue igual..tambien lo coloque el pull-up como me sugiere pero nada, pero hay algo raro q acabo de notar, estoy usando este codigo

if porta.1=0 then
           delay_ms(200)
           num=num+1
           end if
y este diseño el q adjunto....pero lo raro es q en codigo dice si el porta.1=0 ejecute la sumatoria, pero en mi diseño lo estoy colocando q empiece en 1 osea no deberia hacer nada cuando lo ejecuto pero lo raro esq lo simulo y empieza a hacer lo q esta dentro del IF...y no entiendo xq pasa esto...donde estoy haciendo mal...

Desconectado tannke

  • PIC16
  • ***
  • Mensajes: 176
Re: Como leer la entrada de dato de un pic
« Respuesta #8 en: 06 de Agosto de 2011, 11:22:07 »
Muy buenas, bien, acabo de ver un detalle que no habia visto antes(supongo que fue pq es algo que ya te dijo "NoSepComo" y ya ni me fijé si lo habias corregido), en el codigo estas asignando TRISA=1, aquí estas aciendo entrada el bit 0 del pueroA y luego estas utilizando el bit 1

En este casi, si lo que quieres es el bit1 del puerto A como entrada, tendras que poner TRISA=2

                       RA7.......RA0
1 en binario es (00000001)
2 en binario es (00000010)

Por cierto, aumenta la resistencia de pull-up, 10ohms es muy bajo.

Saludos

« Última modificación: 06 de Agosto de 2011, 11:33:55 por tannke »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como leer la entrada de dato de un pic
« Respuesta #9 en: 06 de Agosto de 2011, 14:19:45 »
Primero como dice tanque, para el ultimo diseño esta mal el TRISA, ponele 0xFF y listo, lo tenes todos como entradas al puerto A. Te aconsejo q te manejes con binarios o hexadecimales, el numero decimal no es muy practico en esto :S

Ya hice todo lo q m sugirieron pero nada es nada...sigo con el mismo problema y este es el codigo q tengo..

 dim con as integer
  dim num as byte

main:
cmcon = 7            'convierte todo el puerto A en Digital
Trisb=0    ' hace todos los pines del puerto B como salidas
TRISA=1
num= 0    'carga el valor inicial de 0 a la variable num

pulsar:
portb=num   'indica sacar el valor de num a través del puerto B

IF porta.1=0  then
goto contar
end if
           contar:
           if porta.1=1 then
           delay_ms(200)
           num=num+1
           end if
GOTO pulsar   ' volver al principio del programa
END.


No se donde puede estar mal...pero creo q es al momento de leer el puerto de entrada supongo q me hace falta algo por ahi x eso parace q nunca entrada nada por el porta1, ya que todo siempre esta en cero, y si cambie en ultimo if q seria este

 if porta.1=1 then
           delay_ms(200)
           num=num+1
           end if

por este...

 if porta.1=0 then
           delay_ms(200)
           num=num+1
           end if

es cuando empieza a contar solo sin tocar el pulsante(claro logico porq el puerto esta en cero...) espero me puedan ayudar a darle solucion...

Primero que nada:

Código: [Seleccionar]
IF porta.1=0  then
goto contar
end if
Eso esta de mas, por que si esta en cero o en uno va entrar igual a contar.

Otro tema es el siguiente y no se como lo maneja el Basic pero:
CMCON , TRISB y TRISA se encuentran en el banco 1
Mientras que PORTA y PORTB en el banco 0
Deberias cambiar de banco imagino. Al principio para elegir el banco 1, y antes de declarar num, ponerlo en el banco 0 nuevamente.

Otra, el registro CMCON es para el comparador. No entiendo por q lo estas usando.
El registro ANSEL ubicado en el banco1, es para seleccionar si son digitales o analogicos:

Citar
Bits select input function on corresponding AN<6:0> pins.
1 = Analog I/O (see notes below)
0 = Digital I/O

Citar
On a Power-on Reset, the pins
PORTA<4:0> are configured as analog
inputs and read as ‘0’.

En resumen tenes que poner a 0 el registro ANSEL.

Y para cambiar los bancos podrias setear o pone a cero los siguientes bits del registro STATUS:

Código: [Seleccionar]
bit 6-5 RP<1:0>: Register Bank Select bits (used for direct addressing)
11 = Bank 3 (180h - 1FFh)
10 = Bank 2 (100h - 17Fh)
01 = Bank 1 (80h - FFh)
00 = Bank 0 (00h - 7Fh)

Con respecto a las resistencias de pull-up creo que no hacen falta, por que no pude encontrar nada que dijera que son OPEN COLECTOR, pero le haria un antirebote en hardaware, aunque mucho sentido no tiene para este programa, ya que tiene un delay de 200ms.

Pero de todas formas te aconsejo poner una resistencia aunque sea de 1k en serie con el pin... por esto:

Citar
Maximum current sunk by PORTA...100 mA


« Última modificación: 06 de Agosto de 2011, 14:26:36 por KILLERJC »

Desconectado celsopuma

  • PIC10
  • *
  • Mensajes: 25
Re: Como leer la entrada de dato de un pic
« Respuesta #10 en: 10 de Agosto de 2011, 01:27:06 »
gracias a todos por responder...pero ya encontre la solucion... en realidad lo  que estaba mal era da configuracion del puerto A como entrada..por eso no hacia nada....les cuento que fue lo que paso, como estoy usando el  pic 16f877a y paraconvertir el puerto a como entrada digital estaba usando "cmcon = 7" pero eso es para otro ditpo de pic y para mi 16f877a se usa "adcon=7" y eso era todo el problema....si a alguien les esta pasando igual ya saben la solucion....gracias a todos...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Como leer la entrada de dato de un pic
« Respuesta #11 en: 10 de Agosto de 2011, 03:24:05 »
Pero lo simulabas con un 16F88 ... el cual era ANSEL como dije mas arriba xD


 

anything