Spela ljud-ljudfiler (wav) med en Arduino (9 / 9 steg)
Steg 9: Avbrott och dubbel buffring
Vid 22 Khz är en byte av ljuddata utdata varje 0.045 ms
512 byte (buffertstorleken) läses i 2.08 ms.
Så kan bufferten inte läsas från SDCard i en skriva cykel.
Men 512 byte skrivs till hamnen i 23.22ms.
Så allt vi behöver göra är att har installationsprogrammet en ny fil läsa varje gång bufferten töms och vi tillräckligt med tid att få data innan ett nytt datablock krävs... Antar att vi använder två buffertar, tömma en som fyller vi en annan.
Detta är dubbel buffring.
Den filen läsa fördröjs av det upprepade avbrottet, men det kommer att få gjort.
.
Jag har setup två 512 byte buffertar kallas bufa och bufb.
Om flaggan aready stämmer vi läser från porta annars vi läsa från portb
När bufferten läge (bufcount) når storleken på bufferten (BUF_SIZE 512) ange vi en flagga kallas readit till true.
Ogiltig loop rutin ser ut för denna flagga och börjar ett block läsa:
IF(readit) {
om (! aready) {
initiera SDCard block läsa till bufa
tempfile.Read (bufa, BUF_SIZE);
} annat {
initiera SDCard block läsa till bufb
tempfile.Read (bufb, BUF_SIZE);
}
readit = false;
}
När det är färdigt den rutinmässiga flaggor readit = false.
Inom den avbryta rutinen måste vi kontrollera att void slingan är klar genom att kontrollera om readit == false.
Dessa förhållanden vi signalerar att en annan läsa krävs och växla aready flaggan för att växla buffertar.
Om SDcard fortfarande läser vi tillbaka spåra en behandling (counter--; bufcount--;) och avsluta avbrottet till försök igen senare. (Klick i ljudet signalen innebära att detta har inträffat.)
När alla data läses avbrottet avbryts, stängt porten åter-ställa till mitten av spänning värdet av 128 och ljudfilen.
.
Innan du kör skriptet dac2.ino för första gången, ställa in volymen till 50%. Detta kommer att vara för högt, men det är bättre än 100%!
Om din volymkontroll fungerar i omvänd swap leads på motsatta sidor av potentiometer 10K.
Låt mig veta hur det låter.