Een zeer eenvoudige en gemakkelijke manier te voorzien van menselijke interactie met de microcontroller is een knop invoegen in het circuit. We communiceren met computers met behulp van de twee belangrijkste invoerapparaten: de muis en het toetsenbord. Een toetsenbord is niets meer dan een stelletje knoppen gelegd-out zodat de gebruiker de tekens invoeren (ASCII) naar de computer. Als u bent je hoofd krabben op het ASCII-gedeelte, don't worry--vertegenwoordigt het gewoon de code voor elk teken.
Door dit punt in onze reis, moet u hebben al setup de computer met WINAVR (of AVR-GCC voor Linux), en kunnen uw microcontroller te programmeren. U moet ook een circuit gebouwd met een LED aangesloten op de microcontroller. U maakte ook de LED knipperen in de vorige tutorial.
Het toevoegen van een knop of schakelaar aan het circuit in staat stelt de microcontroller te ontvangen van menselijke input. Andere vormen van input voor microcontrollers omvatten (maar zijn niet beperkt tot) een toetsenbord of een muis, knoppen, schakelaars, audio (via microfoons), touch screen displays en digitizers. Er zijn natuurlijk veel andere apparaten die bijdragen aan een microcontroller kunnen bieden, maar deze kunnen niet allemaal worden geactiveerd door vrijwillige menselijk handelen. Ik plaats deze andere apparaten in de "sensing" categorie, zoals deze apparaten meestal zin omstandigheden of gebeurtenissen en dienovereenkomstig reageren. Een paar van dergelijke voorbeelden zijn sensoren voor tilt (versnellingsmeters), opsporen van de infrarood energie of temperatuur te bewaken.
Dus, hier is de magere op knoppen en mechanische schakelaars: ze onvolmaakt! De twee families van mechanica en elektronica gaan samen zoals de Montagues en de Capulets. Dat wil zeggen, ze niet! Wanneer u op een knop, zou u elektronisch een schone antwoord verwachten. Nou, sorry als de drager van slecht nieuws, maar het signaal vaak stuitert nogal een beetje voordat het afwikkelt op de juiste spanning-niveau. In dit beeld laat ik dit verschijnsel. Als de spanning op de 5 volt is vastgesteld voordat de knop wordt ingedrukt en dan naar nul Volt gaat wanneer de knop wordt gedrukt, zal er een "stuiterende" effect van de spanning tussen deze twee waarden. Dus waarom niet al onze keukentoestellen of onze auto's vertonen dit probleem?
Als u kundig voor zien in de afbeelding zitten moet, heb ik een condensator tussen de twee pinnen ingevoegd. Dit zal het signaal gladstrijken. Het effect van deze condensator kan worden gezien op een oscilloscoop, zoals aangetoond in de video. Maar als u geen een oscilloscoop van je eigen, dan gewoon zul je me vertrouwen. Een andere manier wij dit probleem kunnen verlichten is het toevoegen van een vertraging in het programma, net nadat de microcontroller de eerste knop persevenement zintuigen. Echter het toevoegen van een discrete component aan een schakeling die een elektronica probleem, op te lossen is vaak een betere manier dan code toe te voegen om het met enige vertraging--als die code een andere mogelijke bron van een bug in het programma introduceren zal en vergt ook meer processortijd uit te voeren. In extra, deze code kan ook leiden tot de ontwikkeling van andere problemen zoals de rest van de code nog steeds uitvoeren.
Maar de condensator van welke waarde moeten we kiezen? Dit zal uiteindelijk afhangen van hoe slecht de knop met betrekking tot dit specifieke probleem vervult. Sommige knoppen kan een enorme stuiterende gedrag worden weergegeven, maar anderen hebben heel weinig. Een lage condensator waarde zoals 1.0nF (nanofarads) reageert zeer snel, met weinig of geen effect op het stuiteren. Omgekeerd, een hogere condensator waarde zoals 220nF (die is nog steeds vrij klein in termen van condensatoren) zorgt voor een langzame overgang vanaf de begindatum tot de einddatum spanning (d.w.z. 5v aan 0v). De overgang gezien met een capaciteit van 220nF is echter nog steeds vrij snel in een echte wereld-gevoel, en kan dus op slecht presterende knoppen worden gebruikt.
U misschien opgevallen door nu dat het breadboard veranderd iets, het circuit een schonere uiterlijk geven. De vorige draden waren te lang en de build-omgeving begon rommelig te krijgen, zoals ik verder onderdelen toegevoegd aan het circuit. Daarom was een re-design van het breadbord in orde, zodat ik een tweede breadboard aan het einde van de eerste beet. Maar u zou moeten vragen--waarom heb ik dit als er voldoende banden nog aan de andere kant? Nou, ik deed het voor netheid, en ik hield ook van waar de microcontroller was geplaatst. U kunt mogelijk te vertellen dat ik het met de nummers hebt uitgelijnd zodat ik niet hoef te rekenen pinnen hele tijd--ik laat gewoon de breadboard nummering vertel me waar elke pin is op de MCU. Ik ook samengebonden aller de positieve (+)-rails op beide planken, en deed hetzelfde voor alle van de negatieve (-) rails ook. Hierdoor zal me VCC of GND vlakbij, overal op het breadboard.
Zo dan, hoe we de ATmega32 microcontroller (of andere MCU die u aan dit experiment kan toepassen) programma maken gebruik van de knop Nieuw? Nou is het echt heel eenvoudig! Wij hebben slechts twee initialiseren regels vlak voor de oneindige lus en een blok van één voorwaarde binnen de lus toe te voegen. De twee initialisatie lijnen die zijn toegevoegd voordat de lus bevatten één instructie instellen PINB1 Invoerfilter door het toe te wijzen met een "0" als dit:
DDRB &= ~(1 << PINB1);
We zullen ook pincode B1 "hoog," wat betekent dat de pin verschijnt 5 volt totdat de knop is ingedrukt; instellen op dat moment zal de pin nul volt Lees. Om de pincode instellen op een hoogspanning van 5 volt, voegen we deze coderegel:
PORTB |= 1 << PINB1;
Binnen het programma, moet er een besluit: een besluit tot sommige code worden uitgevoerd wanneer op de knop wordt gedrukt, of enige andere code uitvoeren als de knop niet is ingedrukt. Deze taak wordt in de vorm van een voorwaardelijke instructie genoemd een "als anders" verklaring. Het doet precies wat zegt. Net als het Nederlands equivalent... als (de knop is ingedrukt), springen op en neer, anders staan op uw hoofd. de actie "springen op en neer" zal gebeuren terwijl de knop is ingedrukt. Maar terwijl de knop niet is ingedrukt, de andere actie "stand on your head" zal gebeuren. De if statement code:
if (bit_is_clear(PINB, 1))
Hiermee geeft u een test voor een voorwaarde die opgegeven tussen de haakjes. De naam "bit_is_clear" vertegenwoordigt een functie die twee argumenten. Het eerste argument is in dit geval PINB, waarin het aantal pinnen die we opgeeft. Het tweede argument vertegenwoordigt welke pin we controleren, en in dit geval zijn wij betrokken met pin #1 in de set.
Je zou kunnen afvragen welke soorten dingen kunnen we in het codeblok gecontroleerd door de "als" conditie? Dat alles hangt af wat u willen uw programma (circuit). In dit geval, als een manier om te tonen dat deze knop iets doet en werkt, heb ik de LED knippert langzaam (elke 100 ms) terwijl de knop niet is ingedrukt, en knippert sneller (elke 10ms) zolang ingedrukt blijft.
Hier zijn de wijzigingen in de vorige knipperende LED-programma:
#include < avr/io.h > #include < util/delay.h > int main(void) {DDRB | = 1 << PINB0, DDRB & = ~ (1 << PINB1); PORTB | = 1 << PINB1; (1) {PORTB ^ = 1 << PINB0; #include <avr/io.h>#include <util/delay.h> int main(void){DDRB |= 1 << PINB0;DDRB &= ~(1 << PINB1); PORTB |= 1 << PINB1;while (1){ PORTB ^= 1 << PINB0; if (bit_is_clear(PINB, 1)) { _delay_ms(10); //Fast} else { _delay_ms(100); //Slow, from previous } }}
That's it! Er is zeer weinig programmeerkennis vereist gebruik van een knop, LED en maak dingen knipperen!