Autor Tema: Jugador de audio WAV Pic18F4550  (Leído 3356 veces)

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

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Jugador de audio WAV Pic18F4550
« en: 05 de Febrero de 2015, 12:04:47 »
Hola a todos los integrantes del foro, hace tiempo (1semana) que me decidi por llevar a cabo un reproductor de audio wav usando PIC18f4550, uso CCS compiler, el audio esta sin comprimir, a un solo canal sample rate 11025, primeramente en un intento, envio audio por puerto serial, suena bastante bien quisiera poder subir un video no fnciona por alguna "razon", la idea es poder almacenar las canciones en una SD lectura de sd fat32 ya realizada,  ((:-)) .  mi codigo es funcional 30% con SD. rs232 bastante bien, el detalle esta, como hacer para que el audio no se entrepause, muestro el codigo realizado para si alguien pudiese ayudarme, le estaria muy agradecido, un saludo...

#include <18F4550.h>
#fuses hspll,nowdt,noprotect,nolvp,nodebug,usbdiv,pll3,cpudiv1,vregen
#use delay(clock = 48mhz)
#use rs232(baud = 115200, xmit = pin_c6, rcv = pin_c7)

#include "FAT32.h"

#int_rda
void isr_rda(void)
{
   set_pwm2_duty(getc());                             //simplemente recibe dato y ajusta pwm
   output_toggle(pin_d6);        //primera prueba despues se tratara SD     :-/
}

void main (void)
{
 setup_ccp2(ccp_pwm);
 setup_timer_1(t1_internal | t1_div_by_8);
 setup_timer_2(t2_div_by_1,255,16);              
 enable_interrupts(int_timer1);
 enable_interrupts(int_rda);           //puerto rs232 configurado en pc 115200 envio file.wav y ajusta pwm filtro --470- speak
                                                                                                                                                                                |
                                                                                                                                                                              104 cap
                                                                                                                                                                                |
 enable_interrupts(global);
 set_pwm1_duty(50);
 output_d(0);
 delay_ms(500);
 sd_init();
 fat32_inf();
 CHAR FILE[30];
 INT8 ROOTDIR = 2;
 FILE = "FILE0007.WAV";      //Sample rate 12000 Win HEX
 LEER_ARCHIVO(FILE,rootDIR);
 WHILE(TRUE);
}


//En el archivo Fat

VOID INIT_TIMER1()
{
 TIMER1 = 65536 - (12000000/SAMPLE_RATE.VALOR);
 SETUP_TIMER_1(T1_INTERNAL | T1_DIV_BY_1);
 ENABLE_INTERRUPTS(INT_TIMER1);
 ENABLE_INTERRUPTS(GLOBAL);
 SET_TIMER1(TIMER1);
 CLEAR_INTERRUPT(INT_TIMER1);
}


#IFDEF PWMS                          //ESTO ES FUNCIONAL TIENE PROBLEMAS CON AUDIO CON SAMPLE MUY ALTO
VOID INIT_PWM()
{
 SETUP_TIMER_2(T2_DIV_BY_1,255,16);
 SETUP_CCP1(CCP_PWM);
 SET_PWM1_DUTY(0);
 LCD_LINEA_POSICION(0,1);
 PRINTF(lcd_print,"WAV ENCONTRADO");          // \F LIMPIA LA PANTALLA
 IF(CANALES == 2)
 {
  LCD_LINEA_POSICION(0,1);
  PRINTF(lcd_print,"WAV ESTEREO");          // \F LIMPIA LA PANTALLA
 }
}

#INT_TIMER1 HIGH
VOID TIMER1_ISR()
{
 SET_TIMER1(TIMER1);
 SET_PWM1_DUTY(ROLA[INDICE++]);
IF(CANALES == 2)
  OUTPUT_D(ROLA[INDICE++]);
IF(INDICE == 1024)
  INDICE = 0;
 CLEAR_INTERRUPT(INT_TIMER1);
}
#ENDIF

#IFDEF DAC                                                //ESTO DEBERIA HACER MUCHO MAS FLUIDO EL AUDIO ALIJERA CARGA EN PIC
#define  BCK   PIN_E0   //RELOJ
#define  WS    PIN_E1   //CANAL RIGHT(0) LEFT(1)
#define  DIN   PIN_E2   //DATOS DE ENTRADA SERIAL 16 BITS

VOID INIT_PT8211(VOID)
{
   OUTPUT_LOW(BCK);
   OUTPUT_LOW(WS);
   OUTPUT_LOW(DIN);
   SETUP_TIMER_2(T2_DIV_BY_16,255,16);          //TIMER 2 MAYOR PRESISION
   ENABLE_INTERRUPTS(INT_TIMER2);
   ENABLE_INTERRUPTS(GLOBAL);
}

#INT_TIMER2
VOID WRITE(INT8 WR_DAT8211)
{
  INT8 I = 8;
   DO
    {
    OUTPUT_LOW(BCK);
    OUTPUT_BIT(DIN,WR_DAT8211 & 0x80);          //0x8000 TALVES DESPUES 16BIT
    OUTPUT_HIGH(BCK);
    WR_DAT8211 <<= 1;      //(8211 PARA TRANFERIR DATA ASIA ALTA)
    DELAY_CYCLES(10);      //AQUI RETARDO PARA ENVIO PERO SERA MEJOR TIMER2
    }WHILE(--I);
}
 
VOID DUAL_CHANNEL(VOID)
{
    OUTPUT_LOW(WS);                 //SELEC CANAL
    WRITE(ROLA[INDICE++]);
    OUTPUT_HIGH(WS);                //SELEC CANAL
    WRITE(ROLA[INDICE++]);
}

#INT_TIMER1 HIGH
VOID TIMER1_ISR()
{
 SET_TIMER1(TIMER1);
 DUAL_CHANNEL();
IF(CANALES == 2)
  OUTPUT_D(ROLA[INDICE++]);
IF(INDICE == 1024)
  INDICE = 0;
 CLEAR_INTERRUPT(INT_TIMER1);
}
#ENDIF

VOID ENABLE_AUDIO(VOID)
{
   ENABLE_INTERRUPTS(INT_TIMER1);  
   INDICE = 0;
}

VOID DISABLE_AUDIO(VOID)
{
   DISABLE_INTERRUPTS(INT_TIMER1);
   INDICE = 0;
}
« Última modificación: 22 de Marzo de 2015, 10:09:02 por Byakuya »

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Re: Jugador de audio WAV Pic18F4550
« Respuesta #1 en: 20 de Marzo de 2015, 00:07:02 »
La primera pregunta que nadie pediría ver en este proyecto es la razón por que hacer que un microcontrolador de 8 bits realice la tarea o la reproducción de audio cuando procesadores de 16 y 32 bits cuentan con la interfaz I2S para usar codec IC ?. La pregunta tiene tres respuestas:

*1.-Es una más desafiante y una mejor experiencia educativa para usar un controlador de 8 bits para una cosa así, cualquiera puede conectar un codec IC en I2S o usar un chip VLSI para jugar archivos de audio :) facil cierto.

*2.-Porque es impresionante  ver la suma de jujadores de archivos en procesadores de 8 bits. Porque podemos! :)

*3.-La viabilidad de este integrado en un producto final no es realmente factible. Aunque pude ver su uso en algunos procesos de    robótica de gama baja y dispositivos de consumo de gama baja, por ejemplo, un dispositivo que  puede "decirle" al usuario cuando algo anda mal.

En fin dejo link de video V1.0 FTA Tlaxcala Edo.

spfreload=10
« Última modificación: 13 de Junio de 2015, 22:26:05 por Byakuya »

Desconectado BEXTIXTOX

  • PIC16
  • ***
  • Mensajes: 108
Re:Jugador de audio WAV Pic18F4550
« Respuesta #2 en: 02 de Julio de 2017, 23:10:52 »
woouuu muy bueno felicidades
ahora mismo entro en este ambiente
tienes el codigo ejemplo?

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 110
Re:Jugador de audio WAV Pic18F4550
« Respuesta #3 en: 03 de Julio de 2017, 02:48:47 »
3 Consejos para que NO se te pause:

1.- WAV requiere bastante velocidad, así que al menos deberás usar tarjetas SDCH clase 10.  Flac por ejemplo, llega a 900 KB/Seg y en una tarjeta class IV nomas se pausa también...

2.- Usa un PIC de 8 bits tipo K pero a 64 Mhz para aumentar la velocidad del programa, te recomiendo el PIC18F46K22, 18F67K22 o 18F7K22, verás la diferencia: Dos UARTS, 2 SPI, 4 KB de RAM etc...

El PIC18F4550 tiene muy poca memoria en realidad...

Tambien, si usas un PIC a alta velocidad, prueba a usar el SPI a la tarjeta SD por hardware y a máxima velocidad...

Te puedo asegurar que al menos debes lograr transferencias de 1.3 Megabytes x segundo...

3.- Usa el UART a 921600, Yo lo he probado hasta 1.8 kilobits x segundo pero en la PC solo aguanta los 921600

Saludos y felicidades por tu trabajo, por cierto, Yo soy de Puebla, pero mi madre vive en Tlaxcala también...

Desconectado Byakuya

  • PIC10
  • *
  • Mensajes: 38
Re:Jugador de audio WAV Pic18F4550
« Respuesta #4 en: 29 de Noviembre de 2017, 22:10:36 »
Si Gracias mi estimado.. Vixctor, no...si el pause no era problema. de hecho se implemento la rutina que hace la función pause track y siguiente track, ha eso me refería :) , pero buen proyecto realizado hace tiempo las librerías SDHC las fui implementando con toda la documentación que el foro brindaba, pero poco a poco esa información se fue ocultando y borrando, Suky desarrollaba un excelente trabajo y con toda esa documentación fui creando mis propias librerías (por eso perdí velocidad, y muchos aspectos importantes a la hora de traducir a mi compilador... toda una historia por allí) , pero por una extraña razón quitaron gran parte de proyectos importantes e impresionantes, ahora me he cambiado a microcontroladores de gamas mas altas y mucho mas económicas. Con ese Gadget acostumbro escuchar música :) jeje... Saludos a todos los que integramos este gran foro.....