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;
}