YEAAAUGH, WHHAT? OKKKAY! Lil Jon lätt knappen (3 / 4 steg)
Steg 3: Hur det fungerar:
Först, här är ett gäng ingår. Det finns naturligtvis de för processorn samt vissa standardbibliotek. Vad som är viktigt här är huvudet filer som överensstämmer med proverna. Detta är ett sätt att bekvämt ladda data från din dator till mikrokontroller vid kompileringen. Jag skrev ett MATLAB script som läser WAV-filer och deklarerar ett stort utbud t.ex.:
int mydata [] = {1, 2, 3, 4};
Då finns det i avsnittet:
ogiltiga __attribute__((__interrupt__)) _T2Interrupt (void)
{
Detta är avbrottet för Timer 2, som driver PWM. En PWM (Pulse bredd Modulator) genererar en typ-av-analog vågform genom att snabbt ändra intermittensen av en puls vågform. Detta beror på att de digitala utgångarna för mikrokontroller kan bara generera en logisk 0 (som är på marken spänning) eller en logisk 1 (som är på batteriets spänning). Om vi vill säga, approximera en spänning halvvägs mellan det, kan vi använda PWM att aktivera PIN-koden halva tiden och stänga av halva tiden. Så länge detta sker mycket snabbt, kan vi approximera spänningen tillräckligt väl för att låta som den ursprungliga vågformen.
T2Interrupt funktion är en avbrottshanterare för Timer 2. Det innebär i princip att PWM behöver ett annat prov, så vi läsa ett annat prov från programminne och grejer det in i OC1RS-registret. Detta är hur PWM vet vad spänning att approximera prov nästa gång.
void __attribute__((__interrupt__)) _CNInterrupt (void)
{
Detta avsnitt är en avbrottshanterare för förändring anmälan. Ändra anmälan kastar ett avbrott (det vill säga utför funktionen ovan) helst en av stiften du har aktiverat förändringar stat (går hög -> lågt eller vice versa). Detta är hur vi upptäcka växeln pressas. Observera att vi kunde avsöka här, men de perifera ändringsmeddelanden fungerar även när mikrokontroller sover, gör att vi kan spara en hel del makt. Vad vi gör här beror på om ett ljud redan spelar. Om ett ljud redan spelar och vi är i den första 375ms av provet, återställs helt enkelt prov index (därmed omstart uppspelning i början av samma prov). Om det finns inga ljud spelar eller vi är förbi den första 375ms, vi kommer att slumpmässigt plocka ett nytt ljud av 10 och spela som. Detta gör att Button Lil Jon att upprepa samma prov men har fortfarande tillräckligt slumpmässiga beteende att vara intressant (e.g. Ya-Ya-Ja! OKEJ!).
void setupHS()
void setupCN()
void setupPWM()
Här är några setup funktioner. Detta är ganska komplicerat och du är bäst att konsultera databladet för exakt vad som händer här. Det räcker för att säga det första anger upp processorn klocka till 66.33 Mhz, de andra sätter upp ändra anmälan och de tredje uppsättningarna upp PWM. Som referens finns databladet här:
http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en532296
Slutligen den:
int main)
{
Vilken är den viktigaste loopen. Koden börjar köra här, så det första den gör är inställd kringutrustning. Då huvudloop inte så mycket. Det i princip bara väntar runt för lite och går för att sova. Allt arbete sker eftersom avbrotten ovan har registrerats, så när något behöver uppmärksamhet (t.ex. PWM behöver nästa provet), på rätt avbryta automatiskt kommer att kallas. Vanligtvis när mikrokontroller går för att sova, blir ingen kod körs. Men eftersom den perifera ändringsmeddelanden har aktiverats, kommer att ett tryck på knappen orsaka mikrokontroller att vakna upp och omedelbart service att avbryta och börja spela ett urval.
Sista anmärkning: Andra sista anmärkning:
En observant ingenjör kan fråga, varför inte du använder funktionen DAC för mikrokontroller? DsPIC33FJ128GP802 har faktiskt en audio DAC som är avsedd för sånt här. Anledningen är att förenkla designen. Observera att det enda som behövs för att köra en högtalare av en PWM, är enda digitala växlar (en integrerade i det här fallet med inget motstånd för polarisering). Om istället produktionen var en DAC, en linjär förstärkare gjord av transistorer (med extra motstånd) eller en op-förstärkare skulle krävas. Detta ökar avsevärt komplexiteten i designen och del greven. Observera att den ingående vågformer är helt enkelt 8kHz 8-bitars ljud filer, så en full CD-kvalitet DAC är overkill när det gäller ljudkvalitet, men ökar den totala kostnaden.
Den dsPIC33FJ128GP802 spänningsområde är endast 3.0-3.6V. Jag har observerat det köras vid ca 2.8V utan problem med denna kod, men stabilitet kan inte garanteras på lång sikt. Jag rekommenderar om du är att experimentera med koden för att använda vissa litiumbatterier AAA: http://www.amazon.com/Energizer-Ultimate-L92BP-4-Lithium-Battery/dp/B0002DUQDQ . De underhåller 1,5 v för en mycket längre tid än alkaliska AAA.
Redigera: problemet löst genom att använda PIC18, som går ner till 2V