Autor Tema: Ayuda con lectura de puerto pic 16f877  (Leído 5026 veces)

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

Desconectado Jmedina

  • PIC10
  • *
  • Mensajes: 30
Ayuda con lectura de puerto pic 16f877
« en: 20 de Enero de 2010, 14:40:09 »
Un saludo a todos......

Compañeros les escribo para solicitarles una colaboracion con un prog....

Estoy intentando leer bits del puerto c del 877 y deacuerdo al estado de estos activar unos leds en el puerto E, el programa es en PBP
como se los muestro abajo, asi como esta funciona perfecto si lo dejo con el escaneo de un solo bit del puerto c. El problema esta cuando intento leer varios pines de este, si activo uno de estos se enciende la salida correspondinte de acuerdo al programa pero su estado fluctua 1,0,1,0,1,0 etc como si no evaluara la condicion en el IF. ya he intentado de varias formas y nada :5] :5].

Agradezco su colaboracion....


 DEFINE OSC 4


   INICIO:
   
 
   
    IF PORTC.0=0 THEN
    LOW PORTE.1
    ELSE
    GOSUB HIGHRELAY
    ENDIF
   
    IF PORTC.2=0 THEN
    LOW PORTE.2
    ELSE
    GOSUB HIGHLED
    ENDIF
 
    GOTO inicio
   
   
 HIGHRELAY:HIGH PORTE.1
           RETURN     
  HIGHLED: HIGH PORTE.2
                  RETURN
   
    END

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #1 en: 20 de Enero de 2010, 15:43:08 »
Y por que no quitas las llamadas a los gosub.
Quizas tengas que añadir al guna temporizacion pues a la velocidad que va el micro, te puede estar viendo hasta los rebotes de las entradas si nos interruptores, pulsadores, etc..

Prueba con
Código: [Seleccionar]
DEFINE OSC 4


   INICIO:
   
 
   
    IF PORTC.0=0 THEN
    LOW PORTE.1
    Coloca un retardo
    ELSE
    HIGH PORTE.1
    Coloca un retardo
    ENDIF
   
    IF PORTC.2=0 THEN
    LOW PORTE.2
    Coloca un retardo
    ELSE
    HIGH PORTE.2
     Coloca un retardo
    ENDIF
 
    GOTO inicio
       
    END

Fermin
Todos los días se aprende algo nuevo.

Desconectado Jmedina

  • PIC10
  • *
  • Mensajes: 30
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #2 en: 20 de Enero de 2010, 19:21:13 »
Amigo fer, gracias por tu colaboracio....


Te cuento que probe peniendo temporizaciones donde sugeriste (ya habia intentado en otras partes del programa), pero el resultado es el mismo.  lla llevo varios dias intentando hacer esto y nada, he probado de diferentes formas.....lo que no entiendo es por que si escaneo solo una entrada funciona bien.....

Si tienes alguna rutina que hallas utilizado para hacer algo parecido te agradeceria si puedes postearla...haber si salgo de este estancamiento en el cual no crei que caeria con algo que parecia tan sencillo. :5]

Gracias...

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #3 en: 21 de Enero de 2010, 16:00:25 »
Hombre yo tambien casi estoy empezando con basic.

Otra cosa que se me ocurre ¿no hay que definir si el puerto C es entrada y el E salida?
Normalmente esto se suele colocar al inicio del programa, en este caso antes de la etiqueta "inicio", pero PBP no se si será asi ya que no lo utilizo; pero tanto en proton y PSI hay que hacerlo por lo que en PBP me imagino que tambien seria necesario.
Si no sabes muy bien a que me refiero, puedes intentar abrir algun ejemplo que suelen traer los programas, pero en unos compiladores se suele hacer como:
Alldigital
TrisA=%00000000 =====>todo salidas
TRISC=%11111111 ====> todo entradas

Fermin
« Última modificación: 22 de Enero de 2010, 14:05:44 por Fer_TACA »
Todos los días se aprende algo nuevo.

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #4 en: 21 de Enero de 2010, 17:50:45 »
Efectivamente Fer, al principio del programa le falta definir el puerto C como entradas y el puerto E como salidas.

Un saludo!

Desconectado Jmedina

  • PIC10
  • *
  • Mensajes: 30
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #5 en: 22 de Enero de 2010, 00:40:09 »
Las instrucciones de picbasic HIGH y LOW realizan todo ese trabajo, no es necesario hacerlo al principio del programa de igual forma ya he intentado hacerlo sin estas instrucciones y configurando los puertos con sus respectivos TRIS y el resultado es el mismo.

De que otra forma puedo escanear el estado de unas entradas y deacuerdo a este activar o deactivar unas salidas... ya he probado de varias formas y nada,  cuando trabajo con una sola entrada trabaja perfecto, pero cuando trato de scanear dos pasa lo siguiente:

Si Activo Portc.0 , se activa Porte.1 y si desactivo el primero se desactiva el segundo eso deacuerdo al programa y ba bien aunque en la simulacion en proteus alcanzo a ver un cambio muy rapido de estado mientras esta activa.

Si activo portc.2 se activa su respectiva salida deacuerdo al programa, hasta aqui todo bien....

El problema es cuando dos entradas estan activas :5] :5] se despelota todo el programa y ambas salidas empiezan a fluctuar su estado.......como si los if no estuvieran realizando su trabajo o como si las entradas el el portc se activaran y desactivaran constantemente.....

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4069
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #6 en: 22 de Enero de 2010, 08:34:25 »
JMedina,

mira aquí:

http://www.todopic.com.ar/foros/index.php?topic=29008.0

es un caso parecido al tuyo solo que con mas entradas y salidas.

Fermin
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #7 en: 22 de Enero de 2010, 09:01:13 »
Hola, lo he adaptado al Basic del PSI, dejo el archivo .hex para que lo pruebes.

'*******************************
Define CONF_WORD = 0x3d71
'Compilado para el PIC16F877 (no A)
'Define osc 4
Define CLOCK_FREQUENCY = 4
AllDigital
TRISA = 0
TRISB = 0
TRISC = 0
TRISE = 0
TRISC.0 = 1
TRISC.2 = 1
PORTE = 0

inicio:

   If PORTC.0 = 0 Then
      Low PORTE.1
      WaitMs 300
   Else
      Gosub highrelay
   Endif

   If PORTC.2 = 0 Then
      Low PORTE.2
      WaitMs 300
   Else
      Gosub highled
   Endif

Goto inicio
End                                              
highrelay:
   High PORTE.1
Return                                            
highled:
   High PORTE.2
Return
'******************************
« Última modificación: 22 de Enero de 2010, 09:33:23 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #8 en: 22 de Enero de 2010, 09:09:08 »
Tambien dejo este con las pausas en otro lado.

'************************************
Define CONF_WORD = 0x3d71
'Compilado para el PIC16F877 (no A)
'Define osc 4
Define CLOCK_FREQUENCY = 4
AllDigital
TRISA = 0
TRISB = 0
TRISC = 0
TRISE = 0
TRISC.0 = 1
TRISC.2 = 1
PORTE = 0

inicio:

   If PORTC.0 = 0 Then
      Low PORTE.1
   Else
      Gosub highrelay
      WaitMs 300
   Endif

   If PORTC.2 = 0 Then
      Low PORTE.2
   Else
      Gosub highled
      WaitMs 300
   Endif

Goto inicio
End                                              
highrelay:
   High PORTE.1
Return                                            
highled:
   High PORTE.2
Return
'****************************
« Última modificación: 22 de Enero de 2010, 09:33:53 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #9 en: 22 de Enero de 2010, 09:22:55 »
Para el que se pregunte a que equivale "Define CONF_WORD = 0x3d71", le dejo la equivalencia:

Saludos desde Granada, España.

Desconectado Jmedina

  • PIC10
  • *
  • Mensajes: 30
Re: Ayuda con lectura de puerto pic 16f877
« Respuesta #10 en: 24 de Enero de 2010, 04:35:16 »
Compañeros, de verdad quiero agradecerles por el interes en colaborar...

Fer, ya habia leido ese post pero no todo, hoy lo hice con mas cuidado y me di cuenta que alguien sugirio lo que ya habia decidido hacer a diferencia de usar los if y fue hacer un espejo (Porte=Portc) :lol:....Esto para la aplicacion que estoy haciendo es aceptable.

Dog, simule con proteus los dos programas que dejaste y el resultado es el mismo...Yo estoy utilizando el Microcode + Picbasic Pro 2.46 y utilice el .exe que genere con estos....ya descargo el .exe que mandaste y te cuento....

Me preocupa que no funcione el programa con los If, porque si en otra ocacion necesitara hacer otras acciones diferentes a "Porte=Portc" no lo voy a poder hacer......si funciona con el .exe de Dog entonces debe ser un problema del compilador con los if o algo asi..  Ademas en el post que sugiere Fer parece que no tinen problemas con los if sino  con la desicion que intentan tomar con el While y utilizan compiladores diferentes al que yo uso....


 

anything