Stap 9: Interrupts en dubbele Buffering
Op 22 Khz is een byte van audiogegevens elke 0.045 ms output
512 bytes (de buffergrootte) wordt ingelezen 2,08 ms.
De buffer kan dus niet worden gelezen vanaf de SDCard in één schrijven cyclus.
512 bytes zijn echter geschreven op de poort van 23.22ms.
Dus alles wat we moeten doen is hebben setup een nieuw bestand lezen elke keer dat de buffer wordt leeggemaakt en we genoeg tijd om de gegevens voordat een nieuw gegevensblok met nodig is... Ervan uitgaande dat we gebruiken twee buffers, een leegmaken als we vullen een ander.
Dit is dubbele buffering.
Het bestand lezen zal worden vertraagd door de herhaalde interrupt, maar men zal krijgen.
.
Ik heb setup twee 512 byte buffers bufa en bufb genoemd.
Als de vlag aready klopt dat we lezen van porta anders wij van portb
Als de positie van de buffer (bufcount) de buffergrootte (BUF_SIZE 512) bereikt instellen wij een vlag met de naam readit op true.
De routine nietig lus zoekt deze vlag en begint een blok lezen:
if(Readit) {}
Als (! aready) {}
starten SDCard blok voorlezen bufa
tempfile.Read (bufa, BUF_SIZE);
} else {}
starten SDCard blok te bufb lezen
tempfile.Read (bufb, BUF_SIZE);
}
Readit = false;
}
Wanneer het klaar is met de routine vlaggen readit = false.
Binnen de interrupt routine moeten we controleren dat de leegte lus door het controleren is voltooid als readit == false.
Dit is het geval we het signaal dat andere Lees is vereist en de vlag aready om over te schakelen van buffers in-/ uitschakelen.
Als de SDcard is nog steeds het lezen dat we hebben terug één lezing (teller--; bufcount--;) bijhouden en verlaten van de interrupt probeer het later opnieuw. (Klikken in het audio output signaal impliceren dat dit heeft plaatsgevonden.)
Wanneer alle gegevens wordt gelezen de interrupt wordt geannuleerd, wordt de poort opnieuw ingesteld op de mid spanning waarde van 128 en het audiobestand gesloten.
.
Voordat u het dac2.ino script uitvoert voor de eerste keer, het volume op 50% instelt. Dit is te luid, maar het is beter dan 100%!
Als uw volumecontrole in omgekeerde werkt ruilen de leads op tegenovergestelde uiteinden van de potentiometer van 10K.
Laat me weten hoe het klinkt.