Autor Tema: Leer tensiones de una pata de un PIC  (Leído 3982 veces)

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

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Leer tensiones de una pata de un PIC
« en: 08 de Febrero de 2011, 17:55:53 »
Hola!!
Soy nuevo en todo esto, y estoy haciendo un proyecto: construir un juego de 3 en raya (tic tac toe) electronico

Para ello voy a usar un PIC con 18 LED's que serian el tablero (9 pa cada jugador)
y 9 interruptores conectados al PIC.

Ya tengo todo el juego programado en C, para consola, y ahora quiero adaptarlo al PIC.
No é muy bien como funciona.
Con el CCS he añadido un header de u PIC, y uso OUTPUT_HIGH(PIN_XX) ou OUTPUT_LOW para encender o apagar, pero como hago para ver si el jugador a pulsado un interruptor??

muchas gracias

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Leer tensiones de una pata de un PIC
« Respuesta #1 en: 08 de Febrero de 2011, 21:05:16 »
pues con un if... te pondre los dos casos, si tiene que detectar in 1 o un 0 el boton...


if(input(PIN_A1)) {             //si esta pulsado el boton con una resistencia pull-down, si PIN_A1=1 hace la condicion
   ...aqui la orden....
}

o...

if(!input(PIN_A1)){             //si esta pulsado el boton con una resistencia pull-up,si PIN_A1=0 hace la condicion
   ....aqui la orden....
}
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Re: Leer tensiones de una pata de un PIC
« Respuesta #2 en: 09 de Febrero de 2011, 15:27:39 »
pues con un if... te pondre los dos casos, si tiene que detectar in 1 o un 0 el boton...


if(input(PIN_A1)) {             //si esta pulsado el boton con una resistencia pull-down, si PIN_A1=1 hace la condicion
   ...aqui la orden....
}

o...

if(!input(PIN_A1)){             //si esta pulsado el boton con una resistencia pull-up,si PIN_A1=0 hace la condicion
   ....aqui la orden....
}

muchisimas gracias :):):)

Espero no ser pesado, pero ahora tengo otro problema (a causa del cual no he probado todavia lo que me dices)
y esque tengo el puerto a, el b y el c como salidas (para encender las leds (18 leds: todo el puerto B, todo el puerto C y los pines 1 y 2 del puerto A)
(uso un pic16f877a, por cierto)
y resulta que me enciende las led's que le da la gana al principio, asi que me veo obligado a hacer un buchle que las apague.

he probado que parte del codigo causaba esto, y es la siguiente:
Código: [Seleccionar]
#include <16F877A.h>
#use delay(clock=1000000)
void main ()
{  
set_tris_a(0b00000);  
set_tris_b(0b00000000);
}

(normalemnte hay mas codigo, pero tiene que ver con el juego y no con el harware, he comentado todo menos esas lineas y esas son las que lo causan)
Habia entendido que haciendo esto solamente ponia los puertos a y b en salida, nada más.

me podriais decir poruqe me enciende led's el solito??
graciass ;)

adjunto mi circuito:
http://img404.imageshack.us/img404/3475/3enraya.png
« Última modificación: 09 de Febrero de 2011, 15:32:35 por excalibur1491 »

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
Re: Leer tensiones de una pata de un PIC
« Respuesta #3 en: 10 de Febrero de 2011, 05:43:58 »
Es parecido a cuando conectas un biestable a la alimentación. La salida puede que sea 0, pero también puede que sea 1, puede coger cualquier valor. Si lo que deseamos es asegurar que al conectar la alimentación la salida sea 0, debemos hacer un reset asíncrono con algun condensador conectado al Clear del biestable.

Con las salidas del PIC ocurre lo mismo, debes hacer un reset con output_B(0x00) en tus LEDs.

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Re: Leer tensiones de una pata de un PIC
« Respuesta #4 en: 10 de Febrero de 2011, 18:23:04 »
Es parecido a cuando conectas un biestable a la alimentación. La salida puede que sea 0, pero también puede que sea 1, puede coger cualquier valor. Si lo que deseamos es asegurar que al conectar la alimentación la salida sea 0, debemos hacer un reset asíncrono con algun condensador conectado al Clear del biestable.

Con las salidas del PIC ocurre lo mismo, debes hacer un reset con output_B(0x00) en tus LEDs.

perfecto!! muchas gracias :):)

pero ahora (intento no ser pesado, pero ...) tengo 2 problemas:
el primero: una menudencia comparao al otro,  el problema es:
tnego una funcion relativamente larga (por ello no la postearé completa) que es la main:
si comento todas las lineas menos estas 2 que pongo a continuacion me salta un error (el problema esta forzosamente ahi visto que comentando el resto el error persiste)
Código: [Seleccionar]

int main()
{
int Movimiento=0;                            //una variable que contaria los movimientos
int* M = &Movimiento;                    // un puntero que apunta sobre Movimiento.
}

y el error que me da: Expecting an identifier y me selecciona la palabra Movimiento de la segunda linea
es asi como se declara un puntero, no me equivoco, no?? que le pasa al compilador?


#### He resuelto mi segundo problema !! por si a alguien le ayuda, he eliminado una llamada a la funcion main que estaba por ahi suelto en el default de un switch, y ya está!!
y mi segundo problema, este creo que bastante mas grave esq compilo todo (he comentado esas 2 lineas, y probado a compilar a ver si habia otro error, y efectivamente lo hay) y me suelta al final:
Recursion not permited [main] en la linea 634 (el codigo tiene 631 lineas)
He pensado que a lo mejor esq mi codigo es demasiado recursivo (demasiadas llamadas dentro de las funciones), he contado y la recursividad que mas lejos va es asi:
main -> ME -> MEe -> MEee -> Systema -> completar
(por si importa algo: corresponden a "main" "maquina empieza" "maquina empieza y el jugador se pone en una esquina" "maquina empieza y el jugador se pone en una esquina, y luego en otra esquina" "ejecuto un systema para ganar, que llama a 'completa' para alinear 3 X" "completar, que alinea 3 X")
osea 6 niveles de recursividad y nunca una funcion se llama a si misma
es esto demasiado recursividad, o el porblema es otro?
####
gracias :):)
de verda que me sois de ayuda :)
« Última modificación: 10 de Febrero de 2011, 18:26:22 por excalibur1491 »

Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Leer tensiones de una pata de un PIC
« Respuesta #5 en: 10 de Febrero de 2011, 19:41:52 »
mejor cuelga todo el codigo no en el post si no adjuntando el archivo .c
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Re: Leer tensiones de una pata de un PIC
« Respuesta #6 en: 11 de Febrero de 2011, 14:40:49 »
bueno ya lo he solucionado delcarando el puntero en uan linea, y afectandolo en otra...
me decepciona un poco el ccs, si vuelve a falalrme tontamente, bascaré otro....
« Última modificación: 12 de Febrero de 2011, 16:51:15 por excalibur1491 »

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
Re: Leer tensiones de una pata de un PIC
« Respuesta #7 en: 11 de Febrero de 2011, 16:44:38 »
El output_d(0x00) es solo para salidas, pero tu segun veo tienes el portd como estradas. Entonces no es necesario.

Para saber que tecla se ha pulsado usas esto:
Código: [Seleccionar]
     while (i<9)
      {
         if (!(input(S)))
         {
            mouv=i;  //guarda el numero de casilla completada
            j=1;  ((avisa de que el jugador ha jugado
            break;
         }
         i++;
      }

¿ no tendria que ser
Código: [Seleccionar]
S [i] ?
« Última modificación: 11 de Febrero de 2011, 16:49:31 por pocher »

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Re: Leer tensiones de una pata de un PIC
« Respuesta #8 en: 11 de Febrero de 2011, 17:09:05 »
si jaja, es en relaidad esta el S, pero como [ i ] para el foro es "poner en cursiva" pues no lo ves, xD, lo siento.

ahora estoy probando con:
Código: [Seleccionar]
void scan(char* T, int* mouvsO,int* M)      //Saisie du mouvment de l'utilisateur:
{
   output_high(PIN_A0);
    int mouv;
   int i=0;
   int joue=0;
   while (joue==0)
   {
      output_high(PIN_A0);
      if (!(input(PIN_D0)))
      {mouv=0;
      joue=1;}
      else if (!(input(PIN_D1)))
      {mouv=1;
      joue=1;}
      else if (!(input(PIN_D2)))
      {mouv=2;
      joue=1;}
      else if (!(input(PIN_D3)))
      {mouv=3;
      joue=1;}
      else if (!(input(PIN_D4)))
      {mouv=4;
      joue=1;}
      else if (!(input(PIN_D5)))
      {mouv=5;
      joue=1;}
      else if (!(input(PIN_D6)))
      {mouv=6;
      joue=1;}
      else if (!(input(PIN_D7)))
      {mouv=7;
      joue=1;}
      else if (!(input(PIN_A3)))
      {mouv=8;
      joue=1;}
   }
    //scanf("%d", &mouv);                     //Mouv enregistre son mouvement
    output_low(PIN_A0);
    mouvsO[*M]=mouv;                        //Dans la case correspondante de mousvO (grace au compteur Mouvement) on enregistre mouv.
    T[mouv]='O';
    *M=*M + 1;                              //On avance le compteur Mouvement.

}

funciona mejor, porq al pulsar reacciona como es debido, pero luego hace lo que le da la gana...


« Última modificación: 12 de Febrero de 2011, 14:00:10 por excalibur1491 »

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Re: Leer tensiones de una pata de un PIC
« Respuesta #9 en: 11 de Febrero de 2011, 19:46:59 »
Sinceramente, llevo mas de 5 horas delante de la pantalla sin conseguir hacerlo funcionar...
si me podeis ayudar con el CCS os lo agradezco mucho, seria lo mejor

pero empiezo a pensar que si el codigo funcionaba al 100% en consola, y que si lo unco que he cmabaido para pasarlo al pic han sido las funciones print y scan (aparte de 2 lineas que funcionan a priori bien en la main) y estan bien escritas, a lo mejor esq el CCs es una porqueria, y seria mejor usar otro compilador... Alguna sujerencia de uno asi agradable ??  gracias de nuevo :9

Desconectado excalibur1491

  • PIC10
  • *
  • Mensajes: 44
Re: Leer tensiones de una pata de un PIC
« Respuesta #10 en: 12 de Febrero de 2011, 06:12:54 »
FUNCIONA!!!!!!!

madre del amor hermoso!!

el problema era que la pulsar un boton, la funcion scan lo leia, y ya sta; y le siguiente vez que llamaba a la funcion scan el mismo interruptor lo elia como pulsado, asi que jugaba una y otra vez en el mismo sitio!!
asiq ue en  mi funcion scan he puesto un S[i ]=PIN_A0;  q es el pin d eun boton que esta sin apretar desde el principio, y problema resuelto!!

muchisimas gracias por todo, soy los mejores :):):):):)