Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

07/01/2013 #1

Avatar de nitehack

No consigo controlar el tiempo de un sonido con el PIC
Hola!
Tengo un problema a la hora de generar un sonido con el PIC16F88. Los sonidos he conseguido que se reproduzcan perfectamente pero no consigo que esten el tiempo que se le indique.
He visto que no calcula bien una division pongas el numero que le pongas.
Estoy programando en C con CCS.
No se que estoy haciendo mal, esta es la funcion para generar sonidos:

Código:
void play(int8 nota, int8 octava, int16 tiempo){ /*Tiempo en "ms"*/
   int16 i;
   int16 espera; /*En "us"*/
   int16 vueltas;
   
   espera=FreqNota[nota];
   espera>>=(octava); /*Desplazamiento a la derecha (lo mismo que  1/2)*/
   vueltas=tiempo*1000; /*Para pasar el tiempo a microsegundos*/

   vueltas=vueltas/(espera*2); /*(esta cuenta no la hace bien )Para ver cuantas vueltas tiene que dar*/
   
   for(i=0; i< vueltas; i++){

      output_high(Altavoz);
      delay_us(espera);
      output_low(Altavoz);
      delay_us(espera);
   }

}
07/01/2013 #2

Avatar de LaElectronicaMeOdia

He visto que no calcula bien una division pongas el numero que le pongas.
depende que numero le pongas y como lo defines.

ya intentaste definirlo como flotante (float) y recuerda que int16 son 16bits y el numero maximo es 65535

si ya lo tomaste en cuenta eso, se necesitaria ver que paramentros estas pasando al subprocedimiento.
07/01/2013 #3

Avatar de nitehack

LaElectronicaMeOdia dijo: Ver Mensaje
depende que numero le pongas y como lo defines.

ya intentaste definirlo como flotante (float) y recuerda que int16 son 16bits y el numero maximo es 65535

si ya lo tomaste en cuenta eso, se necesitaria ver que paramentros estas pasando al subprocedimiento.
Ya habia probado por si acaso enteros de 32 bit por si se pasaba, y hace exactamente lo mismo.
Con float tambien probé y sin resultado.
Hace una cosa extraña segun el numero. Por ejemplo poniendole datos que teoricamente deberia de salir 53 vueltas sale mucho menos y en casos en el que deberia de salir un numero mas pequeño se acerca mas.
Estoy haciendo las simulaciones en proteus, no lo he probado todavia en el pic, pero en teoria deberia de funcionar perfectamente en el simulador : /

No tengo ni idea de lo que puede estar pasando ya que como maximo los datos que se pasan por valor a la funcion son menores que 1000
07/01/2013 #4

Avatar de LaElectronicaMeOdia

si utilizas proteus puedes , en lugar de cargar el archivo .hex, cargar el archivo .cof e ir viendo como se va ejecutando el programa y el valor de las variables, quizas te sea mas facil identificar el problema.
07/01/2013 #5


Hola nitehack, En la carpeta de Examples del compilador, hay un ejemplo que se llama EX_TONES.C Este utiliza una librería para generar notas que se llama TONES.C y que se encuentra el la carpeta Drivers del compilador. Allí puedes ver como hacen el manejo de lo que necesitas.

Saludos!
07/01/2013 #6

Avatar de nitehack

LaElectronicaMeOdia dijo: Ver Mensaje
si utilizas proteus puedes , en lugar de cargar el archivo .hex, cargar el archivo .cof e ir viendo como se va ejecutando el programa y el valor de las variables, quizas te sea mas facil identificar el problema.
Gracias ya lo he solucionado!
Usando el debug como me dijiste vi que una variable la ponia a 0. Puse todas las variables a 32 bits por si a acaso y funcionó perfectamente. He ido poniendo poco a poco las variables a 16 bits hasta encontrar la que necesariamente tenia que ser de 32 bits.

Un Saludo!
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.