Hola gente del foro. Estoy haciendo un programita para hacer un juego tipo SIMON, en el que hay que seguir la secuencia de luces de colores.
Si bien ya esta casi listo, tengo un problema con los puertos entrada salida que no puedo solucionar.
Mi diseño tiene también el parlante que emite los tonos correspondientes a los colores, y un led llamado error, que se enciende en caso de que el jugador de equivoque o gane el juego al mismo tiempo que suena un tono en el parlante. El problema es que, en vez de que el led este encendido durante todo el tiempo en que el parlante emite el tono, solo se enciende por un instante y luego se apaga, y el parlante sigue sonando solo.
Este es un código (CCS) que hice para hacer pruebas en relación al problema, solo es un bucle que enciende los 4 led del juego en forma secuencial y al ultimo debería encender el led error al tiempo que genera un tono en el parlante. Uso tambien la librería de tonos de CCS
////////////////////////////////////////////////////////////////////////////////
//SIMON by Gonzalo Della Rosa //
//RB7 - RB4 : led rojo, verde, amarillo y azul respectivamente //
//RB3 - RB0 : pulsador rojo, verde, amarillo y azul respectivamente //
//RA0 : altavoz //
//RA1 : led_error //
//RA2 : pulsador_start //
////////////////////////////////////////////////////////////////////////////////
#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
#use fixed_io (a_outputs=pin_A0,pin_A1,pin_A3,pin_A4,pin_A5,pin_A6,pin_A7)
#use fixed_io (b_outputs=pin_B4,pin_B5,pin_B6,pin_B7)
#use fast_io(A)
#use fast_io(B)
////////////////////////////////////////////////////////////////////////////////
#define TONE_PIN PIN_A0
void do_delay(int ms_delay, int num_ms, int us_delay, int num_us) {
int i;
for(i=0;i<num_ms;i++)
delay_ms(250);
delay_ms(ms_delay);
for(i=0;i<num_us;i++)
delay_us(250);
delay_us(us_delay);
}
void generate_tone(long frequency, long duration)
{
int32 total_delay_time; // in microseconds
long total_ms_delay_time, total_us_delay_time;
int num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
long num_periods;
total_delay_time = (1000000/frequency)/2-10; // calculate total delay time (10 for error)
total_ms_delay_time = total_delay_time/1000; // total delay time of ms
num_ms_delays = total_ms_delay_time/250; // number of 250ms delays needed
ms_delay_time = total_ms_delay_time%250; // left over ms delay time needed
total_us_delay_time = total_delay_time%1000; // total delay time of us (ms already acounted for)
num_us_delays = total_us_delay_time/250; // number of 250us delays needed
us_delay_time = total_us_delay_time%250; // left over us delay time needed
num_periods = ((int32)duration*1000)/(1000000/frequency);
while((num_periods--) != 0)
{
do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
output_high(TONE_PIN);
do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
output_low(TONE_PIN);
}
return;
}
////////////////////////////////////////////////////////////////////////////////
void main()
{
SET_TRIS_A( 0x04 );
SET_TRIS_B( 0x0F );
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab
while(true){
output_B(0x00);
delay_ms(300); // check panel
output_B(0x10);
delay_ms(300);
output_B(0x20);
delay_ms(300);
output_B(0x40);
delay_ms(300);
output_B(0x80);
delay_ms(300);
output_B(0x00);
output_high(PIN_A1);
generate_tone(440,300);
output_low(PIN_A1);
}
}
el parlante esta en el pin RA0 y el led en el pin RA1.
Se agradece cualquier ayuda
saludos