TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: excalibur1491 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
-
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....
}
-
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:
#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
-
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.
-
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)
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 :)
-
mejor cuelga todo el codigo no en el post si no adjuntando el archivo .c
-
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....
-
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:
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 S [i] ?
-
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:
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...
-
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
-
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 :):):):):)