Stap 3: Hoe het werkt:
Eerst, hier zijn een stelletje omvat. Natuurlijk zijn er degenen die voor de processor evenals sommige standaard bibliotheken. Wat is belangrijk dat hier is de header bestanden die overeenkomen met de monsters. Dit is een manier om een gunstige gegevens vanaf uw computer in de microcontroller geladen tijdens het compileren. Ik schreef een MATLAB-script dat WAV-bestanden leest en verklaart een grote reeks bijvoorbeeld:
int mydata [] = {1, 2, 3 of 4};
Dan is er het gedeelte:
ongeldig __attribute__((__interrupt__)) _T2Interrupt (void)
{
Het gaat hier om de interrupt voor Timer 2, die rijdt van de PWM. Een PWM (pulsbreedte Modulator) genereert een soort-van-analoog golfvorm door de snel veranderende het pulserend sproeien van een pulse golfvorm. Dit is omdat de digitale uitgangen van de microcontroller alleen genereren kunnen een logische 0 (die met de spanning van de grond) of een logische 1 (die is aan de accuspanning). Als we willen zeggen, een spanning die halverwege (bij benadering), kunnen we de PWM gebruiken inschakelen van de pin de helft van de tijd en het uitschakelen van de helft van de tijd. Zolang dit zeer snel gebeurt, kunnen we de spanning goed genoeg te klinken als de oorspronkelijke golfvorm benaderen.
De T2Interrupt functie is een interrupt handler voor Timer-2. Het betekent in feite dat de PWM een ander monster, moet zodat we een ander monster programmageheugen afgelezen en het in het OC1RS-register spullen. Dit is hoe PWM weet wat spanning te benaderen voor de volgende keer dat monster.
ongeldig __attribute__((__interrupt__)) _CNInterrupt (void)
{
Deze sectie is een interrupt handler voor de kennisgeving van de wijziging. Het wijzigingsbericht gooit een interrupt (dat wil zeggen, voert de bovenstaande functie) telkens wanneer u vanuit een van de pennen die u hebt ingeschakeld wijzigingen staat (gaat hoog -> laag of vice versa). Dit is hoe we detecteren de schakelaar wordt ingedrukt. Merk op dat we hier konden poll, maar de perifere wijzigingsmelding werkt zelfs wanneer de microcontroller in slaap is, waardoor wij een heleboel energie besparen. Wat wij hier doen, is afhankelijk van of een geluid al is afgespeeld. Als een geluid al is afgespeeld, maar we zijn in de eerste 375ms van het monster, zal het gewoon opnieuw de index van de steekproef (daardoor opnieuw afspelen aan het begin van hetzelfde monster is opgestart). Als er geen geluid spelen of we voorbij de eerste 375ms bent, wij willekeurig zullen kiezen van een nieuw geluid uit de 10 en die spelen. Hierdoor kan de Lil Jon Button te herhalen hetzelfde monster, maar nog steeds genoeg willekeurig gedrag interessant (bijvoorbeeld Ya-Ya-Ja! OKE!).
VOID setupHS()
VOID setupCN()
VOID setupPWM()
Hier zijn een aantal setup functies. Dit is vrij ingewikkeld en u zitten beste te raadplegen van het gegevensblad voor precies wat er hier gebeurt. Het volstaat te zeggen de eerste stelt de klok van de processor 66.33 Mhz, de tweede stelt het wijzigingsbericht en de derde stelt de PWM. Voor uw referentie, kan het gegevensblad hier worden gevonden:
http://www.microchip.com/wwwproducts/devices.aspx?dDocName=en532296
Tot slot de:
int main)
{
Immers de hoofdlus. Code begint uitvoeren van hier, dus het eerste ding dat het doet is ingesteld op de randapparatuur. Dan de hoofdlus niet zo heel veel. Het eigenlijk gewoon rond wacht een beetje en gaat slapen. Al het werk gebeurt omdat de interrupts hierboven zijn geregistreerd, dus wanneer iets moet aandacht (bijvoorbeeld de PWM moet in het volgende voorbeeld), de juiste interrupt automatisch zal worden genoemd. Meestal wanneer de microcontroller gaat slapen wordt geen code uitgevoerd. Echter omdat de perifere wijzigingsmelding is ingeschakeld, een druk op de knop zal leiden tot de microcontroller wakker worden en onmiddellijk service die onderbreken en beginnen met het spelen van een steekproef.
Laatste opmerking: Andere laatste opmerking:
Een oplettende ingenieur zou kunnen vragen, waarom heeft u niet de functie van de DAC van de microcontroller gebruikt? In feite heeft de dsPIC33FJ128GP802 een audio DAC die is ontworpen voor dit soort dingen. De reden is het ontwerp te versimpelen. Bericht dat het enige dat nodig is om te rijden een spreker uit een PWM, één digitale is schakelen (een BJT in dit geval met geen weerstanden voor vertekenende). Als in plaats daarvan de output een DAC, een lineaire versterker gemaakt van transistoren (met extra weerstanden was) of een opamp nodig zou zijn. Dit verhoogt sterk de complexiteit van het ontwerp en de graaf deel. Merk op dat de invoer golfvormen gewoon 8kHz 8-bits audiobestanden, zijn zodat een volledige CD-kwaliteit DAC overkill in termen van audio kwaliteit is, maar verhoogt de totale kosten.
De dsPIC33FJ128GP802 van spanningsbereik is alleen 3.0-3.6V. Ik heb geconstateerd dat het op ongeveer 2.8V zonder problemen met deze code wordt uitgevoerd, maar stabiliteit voor de lange termijn kan niet worden gegarandeerd. Ik adviseer als je bent om te experimenteren met de code sommige AAA-lithiumbatterijen te gebruiken: http://www.amazon.com/Energizer-Ultimate-L92BP-4-Lithium-Battery/dp/B0002DUQDQ . Zij beweren 1.5V voor een veel langere tijd dan alkalische AAAs.
Bewerken: probleem opgelost met behulp van PIC18, die naar beneden naar 2V loopt