View previous topic :: View next topic |
Author |
Message |
ThanhDan
Joined: 07 Jun 2022 Posts: 19
|
Music Player using PIC16F887 |
Posted: Tue Jun 07, 2022 9:14 am |
|
|
I'm currently working on a project that uses PIC16F887 to play music. The wav file is stored in a MicroSD card (FAT32 or FAT16 formatted), there will be a SD card reader. The code I'm using keep giving me this error: A numeric expression must appear here (at line 47) and a warning: String truncated (line 17)
Error
ok |= fat_open_file(wav);
Warning
const int8 *wav = "mywav.wav";
Code: |
/*
WAV Audio Player using PIC16F887 microcontroller and SD card CCS C code.
FAT Library for CCS C compiler must be installed
*/
// SD Card module connections
#define SDCARD_SPI_HW
#define SDCARD_PIN_SELECT PIN_D3
// End SD card module connections
#include <16F887.h>
#fuses NOMCLR, HS, NOBROWNOUT, NOLVP
#use delay(clock = 20MHz)
#use fast_io(D)
#include <FAT_Lib.c>
const int8 *wav = "mywav.wav";
int1 ok = 0;
int8 i, j, data[16], channel_count;
void play(){
sdcard_read_byte(address_pointer + 22, &channel_count); // Read number of channels
while(fat_read_data(16, data) == 0){
for(i = 0; i < 16; i++){
set_timer1(0);
j = data[i];
set_pwm1_duty((int16)j); // Update PWM1 duty cycle
if(channel_count == 2){ // If 2-channel wave file (stereo)
i++; // increment i
j = data[i];
set_pwm2_duty((int16)j); // Update PWM2 duty cycle
}
while(get_timer1() < 500); // Wait some time (about 125us) to update the duty cycles
}
}
}
void main(){
delay_ms(2000);
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_ccp2(CCP_PWM); // Configure CCP2 as a PWM
set_pwm1_duty(0); // set PWM1 duty cycle to 0
set_pwm2_duty(0); // set PWM2 duty cycle to 0
setup_timer_2(T2_DIV_BY_1, 63, 1); // Set PWM frequency to maximum with 8-bit resolution
setup_timer_1( T1_INTERNAL | T1_DIV_BY_1 ); // Timer1 configuration
ok |= sdcard_init(); // Initialize the SD card module
ok |= fat_init(); // Initialize FAT library
ok |= fat_open_file(wav); // Open the wave file
if(ok == 0){
play();
}
set_pwm1_duty(0); // set PWM1 duty cycle to 0
set_pwm2_duty(0); // set PWM2 duty cycle to 0
} // End
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Jun 07, 2022 11:25 am |
|
|
Quote: | const int8 *wav = "mywav.wav";
|
Change that line to look like this:
Code: | int8 wav[] = "mywav.wav"; |
Then it compiled with no errors or warnings. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19358
|
|
Posted: Wed Jun 08, 2022 3:05 am |
|
|
I'm astounded that he is likely to have enough RAM with that chip.
Efficient handling of FAT requires a 512byte buffer. Without this the
speed will be terrible. Probably not good enough for audio.
He might be able to use:
const int8 wav[] = "mywav.wav";
With #DEVICE PASS_STRINGS=IN_RAM
There is also the issue of voltage. The 887, only supports 3.3v
operation up to 10MHz. He is trying to clock at 20MHz. If he is
running the PIC above 3.3v, then he is going to need voltage
level translators to work with the SD card.
Seriously 'look again' at the chip choice. Much better to use a chip that
is rated to work at 3.3v... |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19358
|
|
Posted: Wed Jun 08, 2022 11:47 am |
|
|
Which won't work....
SDI on a 877, is an ST input. At 5v, it requires 4v for Vih. The SD card
only produces just under 3.3v.
Duh.
If the poster had it working, he was running off less than 5v and getting
some overshoot when the signals switched. Or had an example of the
chip that had particularly low Vih. |
|
|
|