Stap 7: Hoe het werkt
Zoals eerder (in shift-in-midi-description.rtf, beschikbaar op GitHub) wordt beschreven, zorgt ervoor dat de microcontroller de registers van de verschuiving naar de klink van de gegevens over elke input en vervolgens verschuivingen alle 64 bits van gegevens uit de registers. Hier is het proces voor het omzetten van de shift registergegevens in notes:
Opmerking: dit proces draait continu in een lus, duizenden keren per seconde
1. de shift registers zijn vergrendeld, lezen de 61inputs allemaal tegelijk.
Opmerking: logica poorten moeten altijd een verwijzing voor hoge of lage. Het is meestal het beste om een verwijzing naar "high". Dit was noodzakelijk voor vroege geïntegreerde schakelingen "emitter combinatie logic" of "TTL" genoemd. Het was veel minder verspilling van macht voor hoog op deze chips dan te proberen te trekken ze lage pull-ingangen. Als we zeggen "pull" bedoelen we een PIN-code verbinden met een stroombron of gootsteen via een weerstand. Typisch 10K Ohm wordt gebruikt. Zo, in ons geval, elke input vereist een verbinding met de voedingsspanning (5 V) via een 10K-weerstanden. Dit is een heleboel weerstanden, maar gelukkig, weerstanden zijn zeer goedkoop. Dus, wanneer we in de ingangen, klink als geen toets wordt ingedrukt een "hoog" logica staat worden gelezen. Wij verbinden de gedeelde bus op grond (eigenlijk een pin op de microcontroller ingesteld op een lage productie, die als een huidige wastafel fungeert). Als een toets wordt ingedrukt, trekt het"" de shift register invoer pin naar een "lage" logica staat. Dit betekent een belangrijke wezen "op" eigenlijk gelezen is als "off", die verschijnt achterstevoren, maar wij kunnen dit bevestigen gemakkelijk een beetje later.
2. shift registergegevens wordt opgeslagen in een 8-byte-matrix van belangrijke stand en vorige hoofdframe.
Zodra de shift registers zijn vergrendeld, beginnen we met het verzenden van pulsen van de klok. Elke klok-puls zorgt ervoor dat de status van de shift-inschrijven voor het verschuiven van een beetje richting de uitgang-Pins. Elke fiches-uitgang is aangesloten op de ingang van de volgende chip. Dit kan de gegevens sequentieel doorlopen alle chips. Maar hoe gaan we om met de "op is uitgeschakeld" en "uit is op"? De 74hc165 biedt twee seriële uitgangen - een normale uitgang en een omgekeerde uitgang. Wij verbinden de microcontroller met de omgekeerde uitgang van het laatste shift register. Deze wijzigt de input staat terug naar wat wij willen - toets ingedrukt is "on" of "1" en belangrijke omhoog is "uit" of "0".
We zijn met behulp van een 8-bit microcontroller. Het werkt het beste en meest efficiënt met 8 bits (één byte) tegelijk. Dus, we lezen de shift register gegevens één byte tegelijk. De acht bits in een byte slaan de belangrijke status van acht toetsen. We moeten de 8 bytes voor het opslaan van de belangrijke staten van alle 61 toetsen.
Wij moeten zorgvuldig aandacht besteden aan hoe de gegevens zijn afkomstig uit de registers van de verschuiving. We bedraad onze chips, zodat de eerste registers eerste pin (a-invoer) is aangesloten op de meest rechtse sleutel - we die sleutel "1 noemen". De laatste sleutel is sleutel "61". Wij gaan er dus, om de belangrijke staten uit de registers in rechts links om. Dus gaat de eerste byte lezen eigenlijk worden van de laatste vijf sleutels (en de drie ongebruikte ingangen). We wilden onze bytes worden opgeslagen in links naar de juiste volgorde, dus moesten we ook zorg ervoor dat we de eerste bit ontvangen in elke byte in de meest linkse bit van de hoofdframe-byte.
U kunt elke gewenste volgorde doen, maar je moet wel consequent!
3. belangrijke staten worden omgezet in push-Staten; Push-Staten worden opgeslagen in een 61-byte-array dat nota over, opmerking af of geen verandering.
We hebben dus 8 bytes waard van belangrijke staten voor alle 61 toetsen. Maar dit is niet precies wat we nodig hebben om MIDI-opdrachten te sturen. MIDI veroorzaakt toelichting op geluid met een "nota over" commando en de notitie blijft op tot "opmerking uit" is verzonden. Dus hebben we de belangrijkste Braziliaanse omzetten in een druk op staat. We willen weten wanneer een toets heeft worden gedrukt, dus we kunnen de notitie inschakelen en we willen weten wanneer een sleutel is vrijgegeven zodat we de notitie kunt uitschakelen. We willen niet verzenden "Let op" duizenden keren per seconde. Dat zou het overspoelen van de MIDI-bus met gegevens en het zou niet werken.
Voor het genereren van push Staten van belangrijke staten hebben we voor het opslaan van de huidige sleutel staat en de vorige belangrijkste staat. We vergelijken de twee elke scan loop en zie als de staat gewijzigd. Als het ging laag naar hoog, dan een duw naar beneden is geregistreerd en een "nota over" wordt verzonden. Als het ging hoog-op-laag, vervolgens een sleutel omhoog is geregistreerd en een "notitie uit" wordt verzonden. Als er niets veranderd, is geen nieuwe MIDI-gegevens verzonden.
We berekenen MIDI notitie-informatie door een laagste waarde van de notitie op te slaan en vervolgens de matrixindex toe te voegen om het te krijgen van de werkelijke notitie. Dit is de eenvoudigste manier te benaderen. Als u wilt krijgen fancy moet u één of andere soort look-up tabel.
4. het proces wordt herhaald. Wij zorgen ervoor dat we wachten een minimale hoeveelheid tijd tussen toetsenbord scans. Als wij te snel scannen zullen wij halen wat "belangrijke bounce" - elektrische ruis gegenereerd heet wanneer de belangrijke contactpersonen openen en sluiten. Als we lezen zullen we valse belangrijke statusinformatie. Alles wat we moeten doen is wachten een beetje langer dan de typische "bounce"-periode. Als de bounce periode (10 microseconden in dit project) nog niet verstreken is, we gewoon verlaten de scannen lus en probeer het opnieuw.
Hoe we eigenlijk belangrijke staten omzetten in push-Staten?
In dit project lezen we dat de verschuiving registreert met behulp van software. Dit heet "bits bonzen". Het is niet de snelste methode. Er is een hardwarefaciliteit in de chip van de ATMEGA genaamd de SPI (seriële/parallelle Interface), die kon doen veel sneller. Echter het is moeilijker te begrijpen en het blijkt voor veel snelle menselijke ingangen bit-banging lezen is. Wij zorgen ervoor dat er snel met behulp van de microcontroller zo efficiënt mogelijk. We maken alle onze belangrijkste staat vergelijkingen met bitsgewijze operatoren. De bitsgewijze operatoren die we gebruiken zijn "<<" verschuiving links, ">>" rechts verschuiven. "^" exclusieve-of (XOR) en "&" AND. XOR wordt gebruikt om te zien wanneer belangrijke staat binnen een staat byte veranderd in vergelijking met de vorige toestand. EN wordt gebruikt voor het selecteren van stukjes van een byte met behulp van een bitmasker. De operatoren verplaatsen worden gebruikt voor het verplaatsen van een bitmasker beetje links of rechts binnen een byte te selecteren van een specifieke bit te vergelijken. Al deze operaties kunnen worden uitgevoerd in één of twee klokcycli, waardoor ze zeer snel.
Als u meer weten wilt over hoe de code werkt, neem een kijkje bij de bron. Wij bieden tal van opmerkingen over de werking van elk onderdeel. Nogmaals, het moeilijkste deel is gewoon om ervoor te zorgen u lezen en vergelijken van gegevens in de juiste volgorde.