Ошибка при воспроизведении музыкальных файлов Sparkfun MP3 Shield и Arduino Due.

Код работал на моем Arduino Uno. Я подключил его точно так же и теперь получаю ошибку.

Вот ошибка, которую я получаю при попытке загрузить свой код на сайт:

Arduino: 1.8.5 (Windows 10), Board: "Arduino Due (Programming Port)"

C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp: In static member function 'static void SFEMP3Shield::refill()':

C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp:1984:7: error: 'sei' was not declared in this scope

   sei();

       ^

C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp:2006:9: error: 'cli' was not declared in this scope

     cli(); // allow transfer to occur with out interruption.

         ^

C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp: In member function 'void SFEMP3Shield::SendSingleMIDInote()':

C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp:2053:7: error: 'cli' was not declared in this scope

   cli(); // allow transfer to occur with out interruption.

       ^

C:\Program Files (x86)\Arduino\libraries\SFEMP3Shield\SFEMP3Shield.cpp:2067:7: error: 'sei' was not declared in this scope

   sei();  // renable interrupts for other processes

       ^

exit status 1
Error compiling for board Arduino Due (Programming Port).

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Вот мой код:

#include <SPI.h>
#include <SdFat.h>
#include <SdFatUtil.h>
#include <SFEMP3Shield.h>


SdFat sd;
SFEMP3Shield MP3player;

const uint8_t volume = 10; // Громкость MP3-плеера 0=макс., 255=самая низкая (выкл.)
//10 для нормального, 50 для тестирования

const uint16_t monoMode = 1;

void setup() {
  initSD();
  initMP3Player();
}

void loop() {
  if(!MP3player.isPlaying()){
    MP3player.playTrack(1);
  }
}

void initSD() {
  if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) 
    sd.initErrorHalt();
  if(!sd.chdir("/")) 
    sd.errorHalt("sd.chdir");
}

void initMP3Player() {
  uint8_t result = MP3player.begin();
  MP3player.setVolume(volume, volume);
  MP3player.setMonoMode(monoMode);
}

, 👍1


1 ответ


1

Библиотека написана для Uno, а не для Due. Он основан на двух инструкциях, доступных только в компиляторе AVR.

Новые версии ядра предоставляют пару макросов: interrupts() и noInterrupts(), которые следует использовать вместо sei() и cli() соответственно, которые также должны предоставляться ядром Due, чтобы сделать его кроссплатформенным. Однако эта библиотека никогда не обновлялась для работы с этими макросами.

Вы можете заменить вызовы sei() и cli() в библиотеке на interrupts() и noInterrupts(), однако это может не заставить его работать, поскольку он был написан с учетом Uno и других чипов на базе AVR.

,

У меня нет разрешения на изменение этого файла библиотеки. Знаешь, как мне это получить?, @Wes Summers

У вас должно быть разрешение на его редактирование, иначе вы не сможете его установить. Или вы находитесь в какой-то странной системе, контролируемой некой всеобъемлющей всезнающей силой?, @Majenko

Я просто изменил разрешения в свойствах. Код загружается, но плата ничего не делает. Он даже не мигает, когда я нажимаю сброс., @Wes Summers

Я боялся этого. Библиотеке, вероятно, нужно много работать, чтобы работать в срок., @Majenko

есть ли у вас предложения, как мне воспроизводить mp3-файлы на каком-либо устройстве, может быть, на другом щите или что-то в этом роде?, @Wes Summers

Вам просто нужна либо библиотека для этого щита, которая работает с должным, либо нужно узнать, как работает щит и написать для него новую библиотеку., @Majenko

Мега использует те же библиотеки, что и уно, верно?, @Wes Summers