desktop

Curso de programación de PIC en PICBasic Pro

Una consulta como seria para sacar el valor promedio de una lectura adc, por ejemplo tomando algunas 50 muestras del adc..
Agradeceria sugerencia como guia para guiarme gracias..
Haz un lazo o bucle for next, mas o menos asi:

promedio=0 'al inicio promedio es cero
for cnt=1 to 10 step 1 '10 es el numero de muestras
gosub muestrear 'va a tomar muestra de un pin ADC y guarda en "valor_ADC"
promedio=valor_ADC+promedio 'sumas y sumas
next cnt

promedio=promedio/10 'promedias
 
Alguien sabe si esto es posible? Desde hace tiempo he querido saber como se puede grabar sonidos en un pic, segun me encontre este video y veo que si, pero como se hace esto?


Otra pagina encontré un programa llamado BTCSound transforma un archivo wav en bits, lo saca en lenguaje Assambler, pero lo hace demasiado extenso que ni se puede guardar en el pic dicho lenguaje generado.

http://www.romanblack.com/picsound.htm
 
¿Alguien sabe si esto es posible? Desde hace tiempo he querido saber como se puede grabar sonidos en un pic, según me encontré este video y veo que si, pero como se hace esto?
No creo que sea cierto lo que está haciendo ese PIC.
Dice que le está metiendo música en formato MP3 y aunque el MP3 sea un formato comprimido, se necesita mucha memoria para almacenar tantas canciones o fragmentos de ellas en la poca memoria de un PIC.
(Suficiente para lo que realmente puede hacer un PIC)

Aparte hay que tomar en cuenta el algoritmo de decodificación y eso en un PIC resultaría muy complicado, si no es que imposible.
Tal vez se pueda controlar un reproductor de MP3, pero que el PIC lo haga todo, no lo creo.
Para eso están los dsPIC pero no es nada sencillo. dsPIC MP3 Decoder [PIC24]
Otra pagina encontré un programa llamado BTCSound transforma un archivo wav en bits, lo saca en lenguaje Assambler, pero lo hace demasiado extenso que ni se puede guardar en el pic dicho lenguaje generado.
Ese programa si funciona pero utiliza bancos externos de memoria para almacenar hasta 1MBit.
Necesitas estudiarlo muy bien o comprar el TalkBotBrain para reproducir los sonidos.
Como quiera no se me hace nada fácil llevar a cabo un proyecto similar y se requieren muchos conocimientos sobre archivos wav y algoritmos de codificación y decodificación.

Saludos.
 
Última edición:
El programa si funciona, pero la calidad del audio, que sale del PIC es muy mala, el código que genera el
BTSC es asembler, pero muy extenso para poder grabar toda una canción en el micro.
Creo que en el mismo programa hay un ejemplo de filtro para usarlo en el PIC.
Personalmente pienso que es mejor usar un Dspic para este tipo de trabajo.:unsure:
 
No creo que sea cierto lo que está haciendo ese PIC.
Dice que le está metiendo música en formato MP3 y aunque el MP3 sea un formato comprimido, se necesita mucha memoria para almacenar tantas canciones o fragmentos de ellas en la poca memoria de un PIC.
(Suficiente para lo que realmente puede hacer un PIC)

Aparte hay que tomar en cuenta el algoritmo de decodificación y eso en un PIC resultaría muy complicado, si no es que imposible.
Tal vez se pueda controlar un reproductor de MP3, pero que el PIC lo haga todo, no lo creo.
Para eso están los dsPIC pero no es nada sencillo. dsPIC MP3 Decoder [PIC24]

Ese programa si funciona pero utiliza bancos externos de memoria para almacenar hasta 1MBit.
Necesitas estudiarlo muy bien o comprar el TalkBotBrain para reproducir los sonidos.
Como quiera no se me hace nada fácil llevar a cabo un proyecto similar y se requieren muchos conocimientos sobre archivos wav y algoritmos de codificación y decodificación.

Saludos.

En pocas palabras seria muy dificil hacer un proyecto asi entonces, gracias por la respuesta amigo, bueno por aca te dejo este video segun el autor dice que genera con PWM los sonidos, la verdad le quedo excelente.

 
En pocas palabras seria muy dificil hacer un proyecto asi entonces, gracias por la respuesta amigo, bueno por aca te dejo este video segun el autor dice que genera con PWM los sonidos, la verdad le quedo excelente.
Así es, más que nada la limitación es por la memoria.
Ese video ya lo había visto por alguno de los post del Foro dónde se ha tratado esto. Está bien ese proyecto. :)

Si te interesa, aquí hay un proyecto más sencillo porque usa dos programas como herramientas, pero es en C (Hi-Tech for PIC18)
PIC sound player (PCM to PWM converter)
Lo he probado personalmente y si funciona, se pueden generar sonidos cortos a partir de archivos wav.
Previamente hay que convertir los archivos *.WAV a *.PCM con el programa MPlayer
El autor del proyecto adjunta un programa para convertir los archivos PCM a archivos *.H
Éstos archivos son los que se agregan al programa para generar los sonidos por medio de PWM.

El proyecto tiene sus limitaciones en cuanto al tamaño de archivos *.h generados (Unos 50Kb. Aprox.) o tal vez menos, no he realizado muchas pruebas por lo tedioso de estar grabando, convirtiendo y compilando, pero con las pruebas que hice me entretuve buen rato. :LOL:

Suerte.
 
Yo creo que seria mas facil y barato con uno de estos:
modulo-reproductor-de-audio-mp3-wtv020-sd-arduino-picavr-16337-MLM20119108487_062014-O.jpg

Buscar en Mercadolibre: MLM-453310698-modulo-reproductor-de-audio-mp3-wtv020-sd-arduino-picavr-_JM
cuestan algo asi como 10USD.
 
Módulo Sintetizador de voz, es una buena idea, pero costoso.
Los sonidos generados en el video arriba, son algo como tipo Midi, eso si lo genera muy fácil el pic, existen librerias para notas musicales en Ccs, Pic Basic, Proton, Mikrobasic; Mikroc entre otros, que hacen más facil el trabajo.
 
A fin de cuentas veo que seria mejor usar el modulo y así no complicarme tanto la vida entonces, se ve muy complicado con los otros programas también :rolleyes:

Módulo Sintetizador de voz, es una buena idea, pero costoso.
Los sonidos generados en el video arriba, son algo como tipo Midi, eso si lo genera muy fácil el pic, existen librerias para notas musicales en Ccs, Pic Basic, Proton, Mikrobasic; Mikroc entre otros, que hacen más facil el trabajo.

Las librerias para Picbasic como cuales serian?
 
saludo expertos, estoy realizando una maqueta de una linea de montaje la cual tiene 5 estaciones con sensores fin de carrera y 5 pulsadores de llamada, la idea es que mediante los pulsadores de llamada, pueda hacer que el carrito se desplaze hasta una de las 5 estaciones a las que se envio y se detenga hasta que reciba otra orden para desplazarse, usare un motor dc con un puenteH para invertir el giro, por lo que tengo señal de avance y retroceso simuladas por 2 leds, no necesito que atienda los llamados con prioridad, simplemente tome el ultimo dato y se desplaze hasta alli, realize todas las combinaciones posibles, exceptuando las que si se encuentra el fin de carrera en la estacion 1, y se pulsa el llamado 1 no atienda ese llamado , si esta en la 2 y se pulsa el llamado 2 no atienda y asi con todas las 5 estaciones, serian 25 combinaciones menos 5 referentes al mismo piso que el llamado. quedan 20, bueno, emplee el condicional if-then, el problema es que no se me ocurre como efectuar la parada en la estacion, ya que si empleo el dato proporcionado por el fin de carrera para parar, lo hace, pero como el fin de carrera queda enclavado hasta recibir una orden para que se desplace, al dar la nueva orden el sistema permanece parado, ya que el fin de carrera dicta que por estar enclavado, el dato es leido como parada y no arranca hasta la siguiente posicion, espero que entiendan la explicacion y me puedan sugerir como hacer que pueda recibir la nueva orden y ejecutarla, osea se desplace, talvez no sea la manera precisa de encarar este programa y me refiero a usar combinaciones, o tal vez deba usar algun otro operador matematico para lograrlo, ojala me puedan ayudar sugiriendome como hacerlo, muchas gracias por su tiempo
 

Adjuntos

  • linea.rar
    14.7 KB · Visitas: 56
Nano, buscale la manera de guardarlo en la eeprom externa, y despues vemos como reproducirlo en la frecuencia correspondiente...

Código:
DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50

Adc VAR WORD

D0 VAR Adc.0
D1 VAR Adc.1
D2 VAR Adc.2
D3 VAR Adc.3
D4 VAR Adc.4
D5 VAR Adc.5
D6 VAR Adc.6
D7 VAR Adc.7
D8 VAR Adc.8
D9 VAR Adc.9

TRISA = %11111111
TRISB = %00000000
TRISD = %00000000

ADCON1.7 = 1

Inicio:
 
 ADCIN 0,Adc
 
 PORTD.0 = D0
 PORTD.1 = D1
 PORTD.2 = D2
 PORTD.3 = D3
 PORTD.4 = D4
 PORTD.5 = D5
 PORTD.6 = D6
 PORTD.7 = D7
 PORTB.0 = D8
 PORTB.1 = D9
 
GoTo Inicio

Basicamente lo que hace es reproducir en tiempo real el sonido que entra por el puerto analogico en un formato de 10 bits (algo similar al musiquita del mario bros en las antiguas family games jajaja); A la salida de este ejemplo, se implementa un dac, pero si lo guardas en una eeprom, te doy una mano para sacarlo con un sencillo filtro (resistencia + capacitor). Voy a ver si encuentro una idea que me habia compartido reimy en su momento para guardar y reflotar los valores en la eeprom
 
Última edición:
Nano, buscale la manera de guardarlo en la eeprom externa, y despues vemos como reproducirlo en la frecuencia correspondiente...

Código:
DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3 
DEFINE ADC_SAMPLEUS 50

Adc VAR WORD

D0 VAR Adc.0
D1 VAR Adc.1
D2 VAR Adc.2
D3 VAR Adc.3
D4 VAR Adc.4
D5 VAR Adc.5
D6 VAR Adc.6
D7 VAR Adc.7
D8 VAR Adc.8
D9 VAR Adc.9

TRISA = %11111111
TRISB = %00000000
TRISD = %00000000

ADCON1.7 = 1

Inicio:
 
 ADCIN 0,Adc
 
 PORTD.0 = D0
 PORTD.1 = D1
 PORTD.2 = D2
 PORTD.3 = D3
 PORTD.4 = D4
 PORTD.5 = D5
 PORTD.6 = D6
 PORTD.7 = D7
 PORTB.0 = D8
 PORTB.1 = D9
 
GoTo Inicio

Basicamente lo que hace es reproducir en tiempo real el sonido que entra por el puerto analogico en un formato de 10 bits (algo similar al musiquita del mario bros en las antiguas family games jajaja); A la salida de este ejemplo, se implementa un dac, pero si lo guardas en una eeprom, te doy una mano para sacarlo con un sencillo filtro (resistencia + capacitor). Voy a ver si encuentro una idea que me habia compartido reimy en su momento para guardar y reflotar los valores en la eeprom


Se ve sencillo la manera en que lo has colocado, lo simule en el proteus con una señal de audio y funciona (y)

Hasta ahí llegan mis conocimientos, hasta ahora no he manejado memorias eeprom, necesitaría un programador de este tipo de memorias también.

inspector gadget, basicamente lo que necesitas es la logica del ascensor... hay algo acá:
https://www.forosdeelectronica.com/f24/curso-programacion-pic-picbasic-pro-20658/index118.html
solo te va servir para guiarte en la logica por que no esta terminado


Aquí te adjunto el programa simulado en proteus, le elimine unas lineas de programación.
 

Adjuntos

  • SONIDO.rar
    28.6 KB · Visitas: 84
Última edición:
Hola NANO, no necesitarias un grabador de eeprom, ya que es una ,memoria serial que la grabas y lees con el mismo PIC... Ahora, vi tu circuito, pero tenemos dos problemas...
Una, te falto acondicionar la entrada con un Amp Op... mas uqe nada para no perder picos del espectro del habla Humana o musica o lo que sea... O sea, acondicionamos la señal entrante para que trabaje en tensiones que esten entre 0 y 5 Vcc...
Dos, la salida para pdoer implementarla de esa manera, tendrias que cambiar todo el programa, ya que te faltaria un filtro y despues, tendrias que generar una tabla para poder reproducir el PWM que virtualizaria tu sonido... Tene en cuenta que cada fonema tiene su frecuencia, y si no lo reproducimos escalarmente, seria como escuchar ruidos entrecortados o como leer un libro mencionando cada letra por separado... "HOLA... Hache-O,ELE,A"; Se entiende hasta acá?
Bueno, para reducir el programa, lo que se hace, es implementar un DAC de 10bits conectado a esos 10 puertos de salida... cuando me refiero a DAC, me refiero a un CI similar a este:
DAC10_pcl.png

(Fuente: http://www.analog.com/en/digital-to-analog-converters/da-converters/dac10/products/product.html )
Al implementar un Ci similar a este, lo que obtendriamos a la salida del DAC, seria algo similar a esto:

simple-arduino-dac-on-the-scope.jpg


Fijate que se ve bien enmarcada la salida escalar (no necesariamente la señal de salida tiene forma triangular... busque en google una imagen escalar para mostrarte como quedaria, pero en si, es semisinuidal en realidad la señal de salida)...
Ahora, la salida del DAC te va a generar una tension muy pobre, asi que para amplificarla, con la implementacion de un Amp Op mas, tendrias todo practicamente resuelto... Hoy me pongo en campaña y te comparto la idea que me habia comentado en su momento el maestro Reimy...
 
Última edición:
Hola amigos necesito que alguien me oriente en que estoy fallando en la programacion de este ejercicio que es de una secuencia de luces como la del auto fantastico, utilizando el puerto Ay B del pic 16f628a en basic, ya que las salidas RA6 y RA7 no quieren activarse.
les adjunto programa, la simulacion y el .hex
Saludos.....
 

Adjuntos

  • foro secuencia.rar
    14 KB · Visitas: 43
Hola amigos necesito que alguien me oriente en que estoy fallando en la programación de este ejercicio que es de una secuencia de luces como la del auto fantástico, utilizando el puerto A y B del pic16f628a en basic, ya que las salidas RA6 y RA7 no quieren activarse.
Es porque te falta agregar la palabra de configuración, si no la pones el compilador establece una por defecto con oscilador a cristal.

Es por eso que los pines RA6 y RA7 al estar configurados para usar oscilador a cristal, no funcionan.
Si no declaras los bits de configuración en tu programa, también lo puedes hacer en tu programador de PIC's, pero es muy importante que siempre uses una palabra de configuración.

Usa esta palabra de configuración y colócala en la cabecera del programa (Hasta arriba del código)

Código:
[COLOR=Green][B]@ Device [/B][/COLOR][B]INTRC_OSC_NOCLKOUT, WDT_OFF, MCLR_OFF, PWRT_ON, BOD_OFF, LVP_OFF[/B]
También es importante que declares la frecuencia de trabajo.
Define OSC 4
Aunque en este caso al usar el oscilador interno que en el PIC16F628A es de 4MHz, el compilador también por defecto establece esta frecuencia.

Suerte.
 
Última edición:
Nano, mirá...aca te subo la simu completa con todos los archivos... En la simulacion, tenes 3 capturas del osciloscopio... fijate que la señal o canal amarillo, es la señal analogica entrante... la del medio convertida y la ultima, la salida del DAC...
sound_pbp.png
En un rato vuelvo con lo que me comento reymi alguna ves para complementar el mensaje y el tema

edit: acá subo parte de lo que alguna ves hablamos con Reimy sobre este proyecto

Reimy dijo:
bueno es una idea.imagina que creamos dos variables para la señal uno esas dos variables son para dividir el dato en dos
y poder grabarlo quedando algo asi

señaluno1.0 = adc.0
señaluno1.1 = adc.1
señaluno1.2 = adc.2
señaluno1.3 = adc.3
señaluno1.4 = adc.4
write 00,señaluno1


señaluno2.0 = adc.5
señaluno2.1 = adc.6
señaluno2.2 = adc.7
señaluno2.3 = adc.8
señaluno2.4 = adc.9
write 00,señaluno2
write 01,señaluno2


y para leerlo casi lo mismo fijate
READ 00,señaluno1
VAL.0 = señaluno1.0
VAL.1 = señaluno1.1
VAL.2 = señaluno1.2
VAL.3 = señaluno1.3
VAL.4 = señaluno1.4


READ 01,señaluno2
VAL.5 = señaluno2.0
VAL.6 = señaluno2.1
VAL.7 = señaluno2.2
VAL.8 = señaluno2.3
VAL.9 = señaluno2.4

y ya alli tendrias todo listo recordando si usas el for next que debes incrementar la variable de direccion de 8 en 8
 

Adjuntos

  • voz_PBP.rar
    165.3 KB · Visitas: 83
Última edición:
Atrás
Arriba