TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: johenrod en 01 de Agosto de 2020, 19:12:26

Título: Como implementar un buzzer pasivo con un for?
Publicado por: johenrod en 01 de Agosto de 2020, 19:12:26
cordial saludo, tan amables requiero usar un buzzer pasivo en un proyecto pero sin librerías ni timers, en post utilizan un for para melodías pero lo único que requiero es usar un bip cada que lo necesite, cacharreando implemente algo ( de pura coincidencia) y me da un sonido  pero cuando aumento la variable en el for que me trabaja bien en 200 y la coloco en 300 el buzzer sigue sonando y no sale del for.
que debería hacer, dejo ambos códigos, de antemano gracias.
lo estoy haciendo en "CCS"

este trabaja bien

Código: C++
  1.       //
  2.        while(true)
  3.       {
  4.    
  5. for (i=0;i<200;i++)
  6.    {
  7.    
  8.  
  9.    output_high(LED3);
  10.    delay_Us(300);
  11.      output_low(LED3);
  12.    
  13.    delay_us(100);
  14.    }
  15.    i=0;  
  16.    
  17.    output_high(LED);
  18.    delay_ms(1000);
  19.    
  20.    output_low(LED);
  21. delay_ms(1000);
  22.    
  23.       }
  24.      
  25.      
  26.    }

este trabaja mal no sale del for
Código: C++
  1.        while(true)
  2.       {
  3.    
  4. for (i=0;i<300;i++)//
  5.    {
  6.    
  7.  
  8.    output_high(LED3);
  9.    delay_Us(300);
  10.      output_low(LED3);
  11.    
  12.    delay_us(100);
  13.    }
  14.    i=0;  
  15.    
  16.    output_high(LED);
  17.    delay_ms(1000);
  18.    
  19.    output_low(LED);
  20. delay_ms(1000);
  21.    
  22.       }
  23.      
  24.      
  25.    }
Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: johenrod en 01 de Agosto de 2020, 19:19:52
... por aquí revisando vi que int i; es de 8 la cambie a 16 y ya no da error,, de todas formas aun resolviendo esto , como se implementan los tiempos para hacer sonar adecuadamente el buzzer?
Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: Sispic en 02 de Agosto de 2020, 02:07:48
hola  johenrod

hay varias maneras .
con ccs tienes ejemplos EX_TONES.c  , EX_DTMF.C


Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: johenrod en 02 de Agosto de 2020, 11:40:52
hola  johenrod

hay varias maneras .
con ccs tienes ejemplos EX_TONES.c  , EX_DTMF.C
gracias por tu respuesta, desafortunadamente aun no entiendo mucho de estos arreglos, pero por ahora me bastaría comprender la frecuencia que me esta generando este código que a continuación dejo al medirlo con el frecuencimetro me da 2.457 khz, con los tiempos de for no logro llegar a sacarla. (cristal de 4 Mhz)

Código: C++
  1.     // prototipos funciones
  2.       void sonido ();
  3.        
  4.        void sonido()
  5.        {
  6.  
  7.       for (i=0;i<250;i++)
  8.    {
  9.    
  10.  
  11.    output_high(buzzer);
  12.    delay_us(280);
  13.    
  14.      output_low(buzzer);  
  15.    delay_us(110);
  16.    }
  17.    i=0;  
  18.  
  19.        
  20.        
  21.        }
Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: remi04 en 02 de Agosto de 2020, 14:28:08
Supongo que te refieres a 2457 HZ, no Khz.

Ahora lo que no entiendo es qué es lo que preguntas:

 ¿Te da 2457 Hz?, o ¿quieres que te de 2457 Hz??.

    2457 Hz tiene un periodo de 407 us.

   Si a ti y te está dando eso con los tiempos que has puesto en el bucle for que son:

  280 uS de nivel alto y 110uS de nivel bajo, total 390 uS  eso es debido a que el pic demora un tiempo (ciclo de instrucción) en cumplir cada instrucción y el doble en cada iteracción del for.  Tu ciclo de instrucción a 4 Mhz es de 1 uS.

  Entre el cambio de estado, los delay_us() y las reentradas al for se te generan esos 17 uS de más.

   Por eso te da una frecuencia de salida un poco inferior a lo que esperas recibir.
   

 
Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: KILLERJC en 02 de Agosto de 2020, 14:30:22
Lo publico igual, fue al mismo tiempo con la respuesta de remi.
Citar
pero por ahora me bastaría comprender la frecuencia que me esta generando este código que a continuación dejo al medirlo con el frecuencimetro me da 2.457 khz, con los tiempos de for no logro llegar a sacarla. (cristal de 4 Mhz)


En todo el ciclo, (señal en 1, y luego señal en 0) tenes un delay de 390us

Ademas a 4Mhz, cada instruccion es de 1us, vos tenes el for mas algunos mas de poner las salidas en 1. Por lo que minimo deberias tener 5 ciclos a mas perdidos en el esas intrucciones.

A 390us el periodo, 1/390us = Frecuencia = 2564Hz

Para que te de los 2457 Hz, parece que el for y el tema de las salidas se estan llevando un tiempo de 1/2457 = 407us , es decir unos 17us extras a los delays que tenes.
Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: johenrod en 02 de Agosto de 2020, 15:22:39
ufff, super gracias por sus respuestas, lo que pasa es que tome el multimetro y en frecuencia  me mostraba 2457hz lo que es lo mismo 2,457 khz. y en datasheet del buzzer dice que trabaja en unos 2300 hz lo cual esta muy cercano, pero no encontraba dar con ella y con sus formulas me ha quedado claro.
Siempre quise activar un buzzer pasivo por código para algunos proyectos(bips), se que no es mucho pero dejare el código completo para algún aprendiz como yo que lo necesite.
Como siempre ustedes prestos a sacarnos de apuros,,, mil gracias.


Código en "CCS"
Código: C
  1.    #include <12F508.h>
  2.    #FUSES NOWDT,NOMCLR                          //No Watch Dog Timer
  3.    #FUSES NOPROTECT                     // codigo protegido
  4.    //#use delay(crystal=4000000)       // oscilador con cristal
  5.    #use delay(internal=4000000)       // oscilador interno
  6.    
  7.    #DEFINE SW pin_B4               // le doy un nombre al pin
  8.    #define buzzer PIN_B2
  9.    #ORG 0x50, 0X01FF            // proteger el codigo a  partir de la linea 50
  10.    #BYTE PORTB=0X06            // lugar de memoria del puerto A ( muy importante )
  11.    #USE FAST_IO (B)           // Optimizamos E/S del PORTB ( muy importante para ahorrar memoria )
  12.       int16 i;
  13.        
  14.        
  15.        // prototipos funciones
  16.       void sonido ();
  17.       //xxxxxxxxxxxxxxxxxxxxxxxxx
  18.        // funciones
  19.        void sonido()
  20.      
  21.        {      
  22.      
  23.        for (i=0;i<250;i++)  // 2,457 khz
  24.        {
  25.        output_high(buzzer);
  26.        delay_us(280);  
  27.        output_low(buzzer);  
  28.        delay_us(110);
  29.        }
  30.        i=0;    
  31.        delay_ms(1000);  //1 bip x segundo apx
  32.            
  33.        }
  34.     // fin funciones
  35.     //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  36.        
  37.        
  38.                              
  39.    void main()
  40.    {
  41.    
  42.    //////// configura  Gp2 como i/s digital y desabilita el tocki (ocs bit-5)
  43.    #asm
  44.    movlw (0B11000000); GPWU = 1, GPPU = 1, T0CS, T0SE, PSA, PS2, PS1, PS0 = 0
  45.    option
  46.    #endasm
  47.   /////////////////////////////////////////////////////////////////////////////
  48.  
  49.    SET_TRIS_B(0B011010);    //set_options (0B000000);
  50.    PORTB=0;                // limpio el puerto
  51.    
  52.    
  53.    
  54.        //Example buzzer
  55.        while(true)
  56.       {
  57.  
  58.      while  (input(SW))// si es uno llamo función sonido
  59.     {
  60.    
  61.     sonido();  
  62.    
  63.     }  
  64.    
  65.     }      
  66.      
  67.     }
Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: remi04 en 02 de Agosto de 2020, 15:39:58
El multimetro muestra el “.” como si fuese una “,”.  La verdad es que me recuerda en el instituto con el profesor de electrónica analógica la de suspensos que cascaba por escribir cifras así. 

  En foros técnicos y demás siempre se recomienda poner las cifras que llevan decimales con una “,” y no un punto. Eso lleva a error de interpretación.

  Lo de la frecuencia del buzzer se referirá que es la frecuencia donde el buzzer entra en resonancia y por tanto donde más fuerte suena.  Pero puedes ponerle cualquier tono, va a sonar, más bajito cuanto más te alejes de esa freq.
Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: johenrod en 02 de Agosto de 2020, 15:46:06
El multimetro muestra el “.” como si fuese una “,”.  La verdad es que me recuerda en el instituto con el profesor de electrónica analógica la de suspensos que cascaba por escribir cifras así. 

  En foros técnicos y demás siempre se recomienda poner las cifras que llevan decimales con una “,” y no un punto. Eso lleva a error de interpretación.

  Lo de la frecuencia del buzzer se referirá que es la frecuencia donde el buzzer entra en resonancia y por tanto donde más fuerte suena.  Pero puedes ponerle cualquier tono, va a sonar, más bajito cuanto más te alejes de esa freq.

perfecto, llamada de atención aceptada :mrgreen: lo voy a corregir.
Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: KILLERJC en 02 de Agosto de 2020, 16:03:35
Citar
  En foros técnicos y demás siempre se recomienda poner las cifras que llevan decimales con una “,” y no un punto. Eso lleva a error de interpretación.

Estoy acostumbrado debido a los dos sistemas que se usan

1,000,000.12 y 1.000.000,12

Es mas, lo ultimo que leí es que se sugiere que los digitos se separen y no se usen comas o puntos para eso, es decir 1 000 000.12 o 1 000 000,12

Y ya no existen mas confusiones. Sea cual sea el sistema, ademas el punto es mucho mas simple por donde esta ubicado.
Título: Re:Como implementar un buzzer pasivo con un for?
Publicado por: Geo en 02 de Agosto de 2020, 20:25:43
El multimetro muestra el “.” como si fuese una “,”.  La verdad es que me recuerda en el instituto con el profesor de electrónica analógica la de suspensos que cascaba por escribir cifras así. 

  En foros técnicos y demás siempre se recomienda poner las cifras que llevan decimales con una “,” y no un punto. Eso lleva a error de interpretación.
La mayoría de instrumentos de medición en la actualidad tienen interfaz en inglés, eso o que son hechos en China son la razón de que usen el punto como separador de decimales: https://es.wikipedia.org/wiki/Separador_decimal