Trabajo Final de Electronica - AYUDA

#1
bueno pues tengo que hacer un trabajo final para electronica con el PIC 16F877A..

la idea que tengo es hacer un tipo de juego en el que te dan toques electricos, mas sin embargo creo que voy por mal camino, porque en el simulador (proteus) no ocurrio lo que esperaba... esto es lo que llevo, aun sigo viendo como resolver..
Código:
#include "C:\Users\Admin\Desktop\proyect\main.h"

int a0,p1,p2,p3;
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
   while (1)
  {
    p1=input(pin_d0);
     p2=input(pin_d2);
      p3=input(pin_d4);
     a0=input(pin_a0);
     salto:
      if (a0==0) // Esto enciende el led
  {    
  delay_ms(5000);
  output_bit(pin_b0,1);  // Esperas 5 segundos y se activa el led
      delay_ms(10000);   // por 10 segundos
  }
  
  else
   output_bit(pin_b0,0);
  // JUGADOR 1  
 if ((((output_bit(pin_b0,1)))&&(p1==0))) //no creo que esto se pueda porque me aparecia:
 {                                                   // "A numeric expression must appear here"
 output_bit(pin_b0,0);   // al presionar el boton de el player1, el led se apaga y
 output_bit(pin_b3,1);  // da toques electricos a los otros 2 jugadores         
 output_bit(pin_b2,1);  //por 3 segundos
 delay_ms(3000); 
  output_bit(pin_b3,0);
 output_bit(pin_b2,0);
 }
}
}
Deberia funcionar de esta manera, al presionar un boton despues de ciertos segundos un led se enciende, el primero de los 3 jugadores que presione el boton que hay en uno de los tubos de cobre sera al unico que no le den toques electricos, mientras que a los demas si les daran toques electricos por 3 segundos.

espero me puedan instruir, gracias.
 
#3
El problema era que el led se quedaba parpadeando, y no se detenia aun presionando algun boton de jugadores..

Experimentando me funciono a medias de esta forma pues ahora si se apaga el led cuando algun jugador presiona su boton..
Código:
#include "C:\Users\Ekno0\Desktop\LED\main.h"
int button,p1,p2,p3;

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   // TODO: USER CODE!!
      while(1)
{
    p1=input(pin_d0);
     p2=input(pin_d2);
      p3=input(pin_d4);
   SALTO:
   button=input_A();
      if (button==0)
      {
      tonto:
      DELAY_MS(6300);
      OUTPUT_B(0x01);                   
          while((output_b(1))==1) // cuando el led esta encendido
          {
           if(input(pin_d0)==0)
      {
      output_b(0x0c);
      DELAY_MS(3000);
      goto salto;
      }
           if(input(pin_d2)==0)
      {
      output_b(0x0a);
      DELAY_MS(3000);
      goto salto;
      }
           if(input(pin_d4)==0)
      {
      output_b(0x06);
      DELAY_MS(3000);
      goto salto;
      }
          }
}
      output_b(0x00);
      delay_ms(50);
}
}
Pero aun no encuentro la forma de hacer que, mientras el led no este encendido (output_b(0)==1) y algun jugador presione el boton, le de una descarga a ese jugador (output_b(XxXX)), sin perder el conteo claro
me explico? ;S!

espero me puedan ayudar ;S Graciass
 
#4
Primero vamos estandarizando tu forma de programar.... en C estan ESTRICTAMENTE PROHIBIDOS los saltos a menos que estes usando la sentencia SWITCH y solo usando la sentencia BREAK

Segundo.... los comentarios son para usarse.... si quieres que otra persona entienda tu programa necesitas comentarlo para que ambos puedan pensar de la misma forma...

Aqui te dejo mi solucion muy seguramente tengo errores ya que no puedo simularlo de ninguna manera y lo hice con conocimientos de C general (no para PIC ya que no lo manejo), pero revisala y comentame que te parece

PHP:
#include "C:\Users\Ekno0\Desktop\LED\main.h"
int button,p1,p2,p3;

void main() {
	// Inicializacion de puertos
	setup_adc_ports(NO_ANALOGS);
	setup_adc(ADC_CLOCK_DIV_2);
	setup_psp(PSP_DISABLED);
	setup_spi(SPI_SS_DISABLED);
	setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
	setup_timer_1(T1_DISABLED);
	setup_timer_2(T2_DISABLED,0,1);
	setup_comparator(NC_NC_NC_NC);
	setup_vref(FALSE);

	// Loop Infinito del programa principal
	while(1) {
		// Asignacion de variables
		p1=input(pin_d0);
		p2=input(pin_d2);
		p3=input(pin_d4);

		while (button==0) {				//Espera hasta que se presione el boton de inicio(?)
			button=input_A();
		}

		DELAY_MS(6300);					// Retardo de encendido
		OUTPUT_B(0x01);					// Enciende led

		while(output_b(1)==1) {			// Se mantiene en el ciclo mientras el led se encuentre encendido

			if(input(pin_d0)==0) {		//Boton 1 activo?
				output_b(0x0c);			// electrocuta jugador
				output_b(1)=0;			// apaga led
			}

			if(input(pin_d2)==0) {
				output_b(0x0a);			// electrocuta jugador
				output_b(1)=0;			// apaga led
			}
			if(input(pin_d4)==0) {
				output_b(0x06);			// electrocuta jugador
				output_b(1)=0;			// apaga led
			}
		}

		DELAY_MS(3000);					// Espera 3 segundos mientras electrocuta al jugador
		output_b(0x00);					// Perdona a los jugadores
		delay_ms(50);					// Retardo final
	}
}
 
Arriba