Hemgjord MPC stil MIDI controller (1 / 6 steg)
Steg 1: Program drift.
I följande avsnitt kommer att diskutera hur programmet fungerar. Avsnitt 3.1 går över den initiering del av koden som händer innan den viktigaste loopen. När fylls i huvudloop är samtal ut till 4 olika funktioner: potread, knapptryckning, bankchange, och RGB. Avsnitt 3.2, 3.3, 3.4 och 3.5 kommer att diskutera dessa funktioner separat. Se koden i steg 6.
3.1 initiering
Någon microcontroller måste konfigureras först innan det träder en huvudprogrammet ögla. Detta inkluderar inställning av riktningen av stiften, sätta rätt värden i någon av register som kontroll och definiera de viktigaste klocka som mikrokontroller kommer att använda. Det första steget av mitt program var att ställa in config registren. Dessa register styra oftast saker som watchdog timer, alla master klart återställa pins, brun ut upptäcka och oscillator konfigurationer. I detta gäller till exempel upp jag det så att en 20Mhz kristall som externa oscillator används som främsta klockan för PIC. BILDEN har inre oscillatorer och kan köra upp till 8Mhz, men på grund av hastigheten av MIDI-data, jag behövde köra mikrokontroller med en högre hastighet för att undvika eventuella datafel. Anteckna platsen för oscillatorn på huvudsakliga PCB styrelsen layout i avsnitt 7.1. Jag lödde kristallen direkt under styrelsen så det inte syns i bild 2.0.
Nästa registret jag konfigurerat var de RCSTA och TXSTA register. Dessa register är ansvariga för att kontrollera hårdvara seriell kommandon. Jag använde hårdvara seriell kommandon, i motsats till mjukvaran följetong för att skicka MIDI-kommandon, anledningen är att jag skickar data till midi converter styrelsen på 31250 baud. Jag försökte skicka data först använda programvara kommandon bara, och jag fick fel och datorn var ta emot data som hade saknas bitar och saknade bitar av information. Hårdvara serieporten har en intern buffert används för att styra flödet av data och är därför mer tillförlitliga. Den enda begränsningen av med kommandona hårdvara följetong är du är begränsad till att använda endast vissa stift på mikrokontroller där som om du skicka programvara kommandon, du kan använda alla tillgängliga pin som du vill. LCD jag använde endast obligatoriska uppgifter som ska skickas på 9600 baud, så var jag något kommando jag skickade till LCD mjukvaran följetong kommandon.
Jag satte in stiften som kommer att användas för att styra LTC2309 marker. Dessa marker styrs med hjälp av I2C kommandon så bara två stift behövs för att styra två marker.
Efter detta definierade jag alla globala variabler som används i programmet. Jag konfigurerat sedan riktningen av stiften men laddar rätt byte till TRISA, TRISB och TRISC registren på bild. Laddar ett noll definierar pin av porten till en utgång. Lastning en en, definierar det som en ingång. Till exempel: om jag ladda värde 00000001 i i TRISB register, stift noll på PORTB skulle vara en ingång medan stift en genom sju definieras som resultat.
Eftersom bilden har också inbyggda ADC behövde jag göra oduglig den här så det är nästa sak jag gjorde. LCD-displayen då är påslagen och en intro skärmen visas. Kommandot mjukvaran följetong är en funktion inbyggd i Picbasic Pro som är kompilator jag använde. När jag vill att utfärda en mjukvaran följetong, måste jag ange PIN-koden jag vill skicka kommandot överföringshastigheten och de data som jag vill skicka. Jag grunda ute hur man styr LCD genom dess datablad.
Knapparna Bläddra sedan genom de olika färgerna. Syftet med detta är att se till att allt är korrekt ansluten. Om alla färger visas vet jag RGB-lysdioder är korrekt anslutna. Programmet kommer då in de viktigaste loopen.
3.2 Potread
Eftersom det finns 8 kanaler på varje LTC2309, ställt jag in programmet så att alla 8 kanaler IC2 läses i en for-loop, och alla 8 kanaler IC4 läses upp i en annan for-loop. Eftersom dessa marker styrs med I2C-kommandon bara två stift används. En är en klocka stift, som löper en 100Khz, och andra PIN-koden är en dubbelriktad stift, som används för att skicka och ta emot data.
Läsa det analoga värdet från någon viss kanal, måste du berätta ADC vilken kanal du vill läsa därför innan du läser någon kanal måste du först skicka två byte av information till chipet. Den första byten mikrokontroller skickar till ADC är adressen ramen. Det finns två stift på LTC2309, som du kan konfigurera för att ange adress. Genom att ange AD1 pin och AD0 pin till antingen högt, lågt eller flytande, kan du få upp till 8 olika adresser, vilket innebär att du kan ansluta upp till 8 olika LTC2309s' på en I2C bussen. Om du refererar till figur 6.0 kan du Visa olika konstellationer. Jag har angivit vilken adress jag använder. 7 bitar används som adress och LSB (Bit 0) används för att ange vädret är det en read-kommando eller skriva-kommando. Att denna biten att man förbereder ADC för en read-kommando och sätter det till noll ställer det till en write-kommandot.
Den följande byten skickas till ADC är lite 6 "Din" ordet. Detta är ansvarig för kanal konfiguration. Se figur 8.0 för Din konfigurationer. Jag har belyst olika orden jag har använt. I mitt program anges alltid S/D lite eftersom jag gör enda avslutade mätningar. Den UNI-biten anges också alltid eftersom jag bara använder chip i unipolär läge. Figur 7.0 är timing diagrammet för skriva kommandot ingår i databladet.
Därefter skickar ADC analoga värdet till mikrokontroller. Dock helst någon information som växlade från ADC till mikrokontroller, måste du fortfarande skicka adress ramen, förutom LSB i ramen adress ändras till en, vilket betyder att det är en read-kommando. 12-bitars analog värdet skickas i två byte. Figur 9.0 är formatet på data kommer in. Jag läste det analoga värdet i två olika variabler. En variabel innehåller de 8 mest signifikanta bitarna, och den andra byten innehåller de 4 minst signifikanta bitarna av variabeln. Men de minst signifikanta bitarna placering 4 platser till vänster i den variabeln, och de 4 bitarna till höger är bara nollor. För att få detta värde till en användbar form, skifta jag 8 mest betydande bitar 4 platser till vänster. Jag kan göra detta eftersom jag använder variabeln är ett 16-bitars ord. Jag skifta sedan variabeln med 4 minst signifikanta bitar 4 ställen till höger. Dessa två värden är sedan or'ed ihop och resultatet är en 16-bitars variabel med en 12-bitars analog värde. Men jag har fortfarande att förminska värdet eftersom en MIDI-signalen värde är bara ett byte. Max ADC värdet är 4095 i decimal, och därför måste skalas till 128. För att göra detta jag multiplicera värdet som ADC av 4095 då klyftan är av 128. Jag har en annan variabel, där jag spara tidigare ADC värde. När slingan kommer runt igen kontrollerar den om det nya ADC-värdet har ändrats. Om det ändrats mer än ett visst tröskelvärde, sedan skickar MIDI-signalen med det nya värdet för ADC. Om det är under detta värde, det hoppar över det alla tillsammans och fortsätter att läsa nästa kanal. Jag spara un-skalade värdet, så att detta tröskelvärde är 50. Jag var tvungen att välja ett värde som var tillräckligt stor för att vara över bullret, men inte vara så stor att de analoga värden skickas till MIDI-controller riktigt långt bort från varandra, vilket ger ett hackigt ljud. Ett MIDI-kontroll kommando är en serie 3 byte. Den första byten anger att det är en kontroll kommando som skickas. Den andra byten är vilken kanal sänds trafikstyrning. Den sista byten är det analoga värdet. Så kan exempelvis säga inom min musikprogramvara jag tilldela en volym på en viss kanal att acceptera inkommande MIDI-signaler från kanal 16. När jag vrider potentiometern, sänder MIDI-controller kontinuerligt dessa 3 byte i mycket snabb takt. Första två byte bo samma varje gång dessa byte skickas men det sista värdet kommer att förändras. Tanken är du vill att detta värde ska flytta uppåt eller nedåt i små steg. De steg som den ändras av är tröskelvärdet diskuterades tidigare. Jag öka kanalen med 1, efter varje slinga, så alla potentiometrar skriver till sin egen MIDI-kanal. Denna slinga är då fortsatt 7 gånger för att ADC chip. Jag fortsätter en annan slinga en annan 8 gånger att läsa värden från andra ADC chip. Den enda skillnaden mellan de två slingorna är adressen jag använder för att kommunicera med chip, och det kanalnummer som uppdateras.