FAQ FAQ  •  Buscar Buscar  •  Registrarse Registrarse  •  Entre para ver sus mensajes privados Entre para ver sus mensajes privados
Login Login

proyecto grabadora de sonido 8khz con pic16f xxx a 16mhz
Índice de los Foros Electronica Facil » FOROS ELECTRONICA » Electronica Digital
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
AutorMensaje
rina
Asunto: proyecto grabadora de sonido 8khz con pic16f xxx a 16mhz MensajePublicado: 14 Jun, 2016 - 05:45
Fanatico de la Electronica
Fanatico de la Electronica


Registrado: 14 Ago, 2005
Mensajes: 1894

hace unos dias estuve leyendo en foros externos cobre que si no se podia procesar audio o sonido con un pic y menos a 16mhz y bueno yo que soy un poco asi comente que tendria que dar justo pero valdria o se podria no a gran calidad pero se podria.

mi replanto fue el siguiente. un micro conectado en una entrada a/d (el micro con su ganancia y previo sin aislar de la continua) lo que tengo pensado no es almacenar el voltage a una frecuencia sino la diferencia en la modulacion del sonido a una frecuencia.

no creoque sea muy preciso y seguro que sumamente mejorable, eso sin cotar que esta por acabar, aver si alguien me ayuda o tiene ganas de provar acer alo asi (sinceramente no es algo que me preocupe acer pero si prestaba ver echo (sin ser un tonvo video montage)


espongo parte de la configuracion del pic (en mi caso si lo pruevo algna vez estaria pensado para un 16f72, pero pracicamente cualquier modelo con etradas a/d y puerto usar valdria)
el programa en base consta en tmr0 que se encarga de activar la comparacion A/D.

option_reg=%00001001 ' configuracion tmr0 prescaler 2:1 WDT (7.812,5hz)

trm0 esta en WDT para que se ponga el solo a cero tansolo me interesa el banderin de interruccion para solicitar una comparacion A/D GO, la configuracion A/D esta a su macima velocidad de chequeo, lor lo cual ad_resultado estara en poco mas de 4 procesos + o -.

para la reproduccion. el pre escales casi que tanto que lo mismo.
t2con=%00000011 ' configuracion tmr2 prescales 16:1 poscales 1:1(7.812,5hz) y posescaler en 1:1 sirve para cargar el largo de cada ciclo PWM

el control de..
ccp1con=%00000000 ' configuracion del registro de control ccp1
qued parado al igual que las interrucciones asta no pulsar el boton de grabacion o reproduccion.

pero si dejo preparadas las AND de las interruciones perineales.
pie1=%01000010 ' configuracion de interruciobes perineales
aunque en intcon no active las interrucines hasta que no sean necesarias.


pongamos que en si pulso el boton de grabacion pone el registro de la eepron 24c al inicio en modo grabacion y deja activo ACK ala espera (nunca prove acer algo asi pero deveria funcionar perfectamente)
automaticamente entramos en la rutina de conversion A/D asi que se activa la interrucion tmr0 para empezar las capturas.
en este caso no guardo la bariable de 8bit a esa frecuencia si no que comparo la señal anterior con la nueva refrescada las resto y me quedo con la diferencia entre una y otra (eso seria la modulacion)
metiendola en una bariable de 4bit (podria ser menos de 4).
en mi caso el bit 4 determina el 50% del PWM hay es donde se crearia la bariacion de la modulacion (tendria que suvir el circuito para demodilar esa portadora en audio).

realmente lo unico que tengo echo seria la parte donde comprimo la modulacion (una es algo chapuza, pero una primera idea)


Código:
'
' grabadora de voz de 7.812,5hz con ristal de 16Mhz 
' 8 segundos de grabacion en una eepron 24c256
'
'define osc (16)
contador var word ' cuenta cadenas de 4bit
contar var contador.byte0 ' para reducir y manejar el byte bajo
bit_contar var contar.bit0 ' para marcar un byte completado
estado Var byte ' bit de marcas (son bariadas.. para lo que me duedan servir)
m1 var estado.bit0
m2 var estado.bit1
m3 var estado.bit2
tiempos var estado.bit3
parada var byte
retraso var byte
temp1 var byte
temp2 var byte
temp3 var byte
temp4 var byte
temp5 var byte
indica var byte
pulso var byte
ad_byteeepron var byte ' byte donde pasa la informacion de la eepron
AD_in var byte ' para almacenar adres y compararlo con el siguiente adres
AD_modula var byte ' procesa la diferencia entre chequeos A/D (la modulacion)
AD_modulabit var ad_modula.bit4 ' bit de marca que indica + o - de los 4bit
DA_out var ccpr1l ' para la reproduccion modulando PWM
'
' alias de pin's
'
port_eepronclk var portb.6 ' bit conectado al led, indicaciones
port_eeprondata2 var portb.7 ' bit conectado al led, indicaciones
port_piloto1 var portb.5 ' bit conectado al led, indicaciones
port_piloto2 var portb.4 ' bit conectado al led, indicaciones
port_pulsar1 var portb.1 ' bit usado para el pulsador independiente
port_pulsar2 var portb.2 ' bit usado para el pulsador independiente
'
status=%00000000
option_reg=%00001001 ' configuracion tmr0 prescaler 2:1 WDT (7.812,5hz)
intcon=%00000000 ' configuracion de estatado de interrucciones primarias
pie1=%01000010 ' configuracion de interruciobes perineales
pir1=%00000000 ' estado de las interrucciones perineales
pcon=%00000000 ' configuracion del encendido
t1con=%00000000 ' conpiguracion temporizador 1, TMR1
t2con=%00000011 ' configuracion tmr2 prescales 16:1 poscales 1:1(7.812,5hz)
pmcon1=%00000000
ccp1con=%00000000 ' configuracion del registro de control ccp1
sspstat=%00000000
sspcon=%00000000
adcon0=%10000001 ' configuracion de las entradas analogicas
adcon1=%00000101 ' ajuste de las entradas analogicas
'
' configuracion inicial de puertos
'
trisa=%000000
porta=%000000
'
trisb=%00000110 ' pulsadores como entradas (incorporar pull-up)
portb=%00010000 ' piloto1 encendido piloto2 apagado
'
trisc=%00000000
portc=%00000000
'
' variables iniciales
'
pr2=32 ' para un periodo a 7.812,5hz


' ON INTERRUPT GOTO interrucciones



programa:
if port_pulsar1=0 then gosub grabacion ' pulsar para la grabacion
if port_pulsar2=0 then gosub reproduccion ' pulsar para la reproduccion

goto programa
'
'
'
' rutina de almacenado sonido por modulacion +-16 estados a 7.812,5hz
'
grabacion:
port_piloto2=0 ' el piloto de grabacion se activa
gosub abriregeepronwrite ' prepara el registro de la eepron como grabacion
AD_in=adres ' pasa el primer registro adres (no es muy necesario)
temp1=0 ' bariable temporal a cero la aprovecho para eviar rebotes
intcon=%10100000 ' arrancamos la interruccion tmr0
repeat
    regresograbacion: ' por ser mas rapido que un gosub
    temp1=temp1+1
    if pir1.6=1 then compresion ' una conversion A/D a concluido
    '
    if port_pulsar1=0 then temp1=0 ' siempe que se antenga pulsado grabar
until temp1>100 ' retraso al soltar pulsador grabar evita rebotes
intcon=%00000000
gosub cierraregeepron ' cierra procesos de la epron ACK alto
port_piloto2=1
return
'
' para reducir el dato de la converion AD 7,812Khz en 4bit modulacion
'
compresion:
if ad_in=>adres then ' se compara la diferncia de las comparaciones
    AD_modula=AD_in-adres ' la modulacion es positiva + del 50%
    if ad_modula>%00001110 then ad_modula=%00011110 ' por si escede coseno
    ad_modula=ad_modula>>1 ' divido entre dos para la señal menos significatva
else
    AD_modula=adres-AD_in ' la modulacon negativa
    if ad_modula>%00001110 then ad_modula=%00001110
    ad_modula=ad_modula>>1
    ad_modula=ad_modula ^ %00000111 ' invierto el valor para - del 50%         
endif  ' fallo si son iguales pwm se mantiene al 50%
ad_byteeepron=ad_byteeepron<<4 ' como la modulacion se almacena de 4 en 4 bit
ad_byteeepron=ad_byteeepron+ad_modula ' completar un byte para almacenar
contar=contar+1
if bit_contar=0 then almacenaeep ' marca un bit completado(es algo improvisado)
goto regresograbacion
'
' almacena byte en la eepron esterna
'
almacenaeep:


goto regresograbacion
'
'
'
' para abrir y preparar el registro de la eepron como grabacion
'
abriregeepronwrite:


return
'
' cierra el registro de la epron
'
cierraregeepron:


return
'
' reproduccion del fochero almacenado en la eepron
'
reproduccion:



return
'
' para abrir y preparar el registro de la eepron como lectura
'
abriregeepronread:


return
'
'
' control de interrucciones
'
'
DISABLE
interrucciones:
if pir1.1=1 then
    DA_out=ad_modula ' pasa los 4bit de modulacion a PWM
    CONTAR=CONTAR+1 ' incrementa 1 el contador
    pir1=0 ' borra banderas de interrucciones perineales
endif
if intcon.2=1 then ' tmr0 determina la frecuencia de capturas
    AD_in=adres ' trastada registro A/D capa comparar la modulacon
    adcon0.2=1 ' activamos una comparacion A/D
    intcon.2=0 ' borra bandera tmr0
endif
resume
enable



segure posteando. pero que como tengo puesto no tengo ni prisa ni me da mas. prestaba opiniones. pero como tengo puestos en otros foros mucho fanfarron y 0 resultados solo cosas copiadas mal funcionando. pero la esperanza no se puede perder.

despues posteare el esquema vasico de ganancia y previo de micro.
y para la salida el filtro para desmodular la portadora PWM con condensadores y filtro basico para mas de 9khz (para poder quitar el ruido de los pulsos digitales) como digo es algo cutrecillo y tampoco calcule los Valores rc para mantener bien la frecuencia sin saturar por arriba o por abajo eso ya se ira tanteando.

bueno y que conste que se podria duplicar la velocidad de captura a 16khz, ero mejor provar a menos

un saludo
 
 Ver perfil de usuario Enviar mensaje privado  
Responder citando Volver arriba
Mostrar mensajes anteriores:     
Cambiar a:  
Todas las horas son GMT + 1 Hora
Publicar nuevo tema   Responder al tema
Ver tema anteriorEntre para ver sus mensajes privadosVer tema siguiente
 Índice de los Foros Electronica Facil » FOROS ELECTRONICA »  Electronica Digital
powered by phppowered by MySQLPOWERED BY APACHEPOWERED BY CentOS© 2004 - 2017Información LegalPrensa