Autor Tema: AYUDA: PROBLEMAS PORTA PIC16F628A  (Leído 2521 veces)

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

Desconectado gonz147

  • PIC10
  • *
  • Mensajes: 22
AYUDA: PROBLEMAS PORTA PIC16F628A
« en: 04 de Octubre de 2009, 18:52:48 »
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
Código: [Seleccionar]
////////////////////////////////////////////////////////////////////////////////
//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

Firmat - Santa Fe - Argentina

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: AYUDA: PROBLEMAS PORTA PIC16F628A
« Respuesta #1 en: 04 de Octubre de 2009, 19:20:11 »
Hola, sé que no usas RA4 en tu programa pero me pareció similar tu problema con el tratado en este tema:

Pregunta Sobre PIC16F628A...
http://www.todopic.com.ar/foros/index.php?topic=27544.msg226924#msg226924

Desconectado gonz147

  • PIC10
  • *
  • Mensajes: 22
Re: AYUDA: PROBLEMAS PORTA PIC16F628A
« Respuesta #2 en: 04 de Octubre de 2009, 19:41:16 »
muchas gracias por la data, creo que no es lo mismo que me pasa a mi pero esta bueno para saber.

Mi problema puede deberse a que el parlante consuma demasiada corriente para el pic, ya que este esta conectado directamente a la pata RAO, sin ninguna resistencia, al igual que el led en la pata RA1.

Voy a probar desconectarlo.

Saludos

Firmat - Santa Fe - Argentina

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: AYUDA: PROBLEMAS PORTA PIC16F628A
« Respuesta #3 en: 04 de Octubre de 2009, 19:48:50 »
El Led tiene que ir con una resistencia de 330 ohm y el parlante debe ir con un transistor y este dependerá de la potencia que consuma el parlante.


Saludos!
No contesto mensajes privados, las consultas en el foro