Början Microcontrollers del 8: Lägga till en knapp till mikrokontroller och göra det göra något
En mycket enkel och lätt sätt att tillhandahålla för mänsklig interaktion med mikrokontroller är att infoga en knapp i kretsen. Att kommunicera med datorer som använder två viktigaste inmatningsenheter: musen och tangentbordet. Ett tangentbord är inget annat än en massa knappar som är uppbyggda för att tillåta användaren att input (ASCII) tecken till datorn. Om du avlysningen din huvud på ASCII-del, oroa dig inte--representerar det bara koden för varje tecken.
Genom denna punkt i vår resa, bör du redan setup din dator med WINAVR (eller AVR-GCC för Linux) och att kunna programmera din mikrokontroller. Du bör även ha en krets byggd med en lysdiod ansluten till mikrokontroller. Du gjorde också den LED blinkar i den tidigare handledningen.
Du lägger till en knapp eller omkopplare till kretsen kan mikrokontroller att få människors input. Andra former av input för microcontrollers inkluderar (men begränsas inte till) ett tangentbord eller en mus, knappar, brytare, ljud (via mikrofoner), touch skärm förevisningarna och digitizers. Det finns naturligtvis många andra enheter som kan ge input till en mikrokontroller, men dessa kan inte alla aktiveras med frivilliga mänskliga insatser. Jag placera dessa andra enheter i kategorin "avkänning", som dessa anordningar vanligtvis känna förhållanden eller händelser och agera därefter. Några sådana exempel är sensorer för tilt (accelerometrar), upptäcka infraröd energi eller övervakning temperatur.
Så här är mager på knappar och mekaniska brytare: de är perfekt! De två familjerna av mekanik och elektronik går ihop som Montagues och Capulets. Det vill säga de inte! När du trycka på en knapp, kan du förvänta dig en ren svar elektroniskt. Tja, ledsen att vara bärare av dåliga nyheter, men signalen ofta studsar en hel del innan det sätter sin rätt spänning nivå. I denna bild visar jag detta fenomen. Om spänningen ligger på 5 volt innan knappen är intryckt och sedan går till noll volt när knappen trycks, kommer det att finnas en "studsande" effekt av spänningen mellan dessa två värden. Så så varför inte alla våra Vitvaror eller våra bilar ställer ut detta problem?
Som du ska kunna se i bilden, jag har satt in en kondensator mellan två stiften. Detta kommer att jämna ut signalen. Effekten av denna kondensator kan ses på ett oscilloskop, vilket framgår i videon. Men om du inte har ett oscilloskop för din egen, då måste bara du lita på mig. Ett annat sätt vi kunde lindra detta problem är att lägga en tidsfördröjning i programmet, precis efter mikrokontroller sinnen den första knapp tryck på händelsen. Men att lägga till en diskret komponent till en krets att lösa sådan en elektronik problem, är ofta ett bättre sätt än att lägga till kod att orsaka en försening--som att koden kommer att införa en annan möjlig källa till en bugg i programmet, och kommer också att kräva mer processortid att köra. I ytterligare, denna kod kan också resultera i utvecklingen av andra problem som resten av koden fortsätter att köra.
Men vad värdet kondensator bör vi välja? Detta beror ytterst på hur dåligt knappen utför när det gäller just detta problem. Vissa knappar kan visa en enorm studsande beteende, men andra kommer att ha mycket lite. Ett lågt kondensator värde som 1.0nF (nanofarads) att reagera mycket snabbt, med liten eller ingen effekt på den studsande. Däremot en högre kondensator värde såsom 220nF (som fortfarande är ganska liten när det gäller kondensatorer) ger en långsam övergång från start till slut spänningen (dvs 5v till 0v). Övergången sett med en 220nF kapacitet är dock fortfarande ganska fort i verkliga bemärkelse, och således kan användas på dåligt utför knappar.
Du kanske har märkt av nu när skärbräda har förändrats något, för att ge kretsen ett renare utseende. De tidigare trådarna var för långa och bygga miljö började bli stökigt som jag lagt till ytterligare komponenter till kretsen. Därför var en re-design av bakbord i ordning, så jag knäppte en andra bakbord till slutet av först. Men du kan fråga--varför jag gjorde detta om det inte fanns tillräcklig anknytning kvar i andra änden? Tja, jag gjorde det för prydlighet, och jag gillade också där mikrokontroller var placerad. Du kanske kan berätta att jag har anpassat det med siffrorna så att jag inte behöver räkna pins hela tiden--jag helt enkelt låta bakbord numreringen säga mig var varje stift är på MCU. Jag också hopbundna alla för den positiva (+) skenor på båda styrelser, och gjorde samma sak till alla negativa (-) rälsen också. Detta kommer att tillåta mig att ha VCC eller GND i närheten, var som helst på en skärbräda.
Så då, hur programmerar vi ATmega32 mikrokontroller (eller andra MCU som du kan tillämpa till detta experiment) att göra användning av den nya knappen? Det är väl egentligen ganska enkelt! Vi har bara att lägga till två linjer som inträffade strax före den oändlig loopen, och ett enda villkor block inom slingan. De två initiering raderna lagts innan loopen inkluderar ett uttalande att ange PINB1 för indata genom att tilldela den en "0" så här:
DDRB & = ~ (1 << PINB1);
Vi kommer också ange pin B1 "hög", vilket innebär den PIN-kod kommer att läsa 5 volt tills knappen trycks; då läser stiftet noll volt. Om du vill ange PIN-koden på en hög spänning på 5 volt, lägger vi denna kodrad:
PORTB | = 1 << PINB1;
Inom programmet, det måste finnas ett beslut: beslut om att köra några kod när knappen trycks, eller köra några andra kod om knappen inte är intryckt. Denna uppgift är i form av en villkorssats kallas en "om annat" uttalande. Den gör exakt vad är säger. Precis som den engelska motsvarigheten... om (knappen är intryckt), hoppa upp och ner, annars stå på huvudet. åtgärden "hoppa upp och ner" kommer att hända när knappen är nedtryckt. Men medan knappen inte är intryckt, den andra åtgärden "stå på huvudet" kommer att hända. Om uttalande koden:
om (bit_is_clear (PINB, 1))
anger ett test för ett villkor som anges inom parentes. Namnet "bit_is_clear" representerar en funktion som tar två argument. I detta fall är det första argumentet PINB, som beskriver en uppsättning stift som vi anger. Det andra argumentet representerar vilka stift som vi kontrollerar och i detta fall handlar pin #1 i set.
Du kanske undrar vilka typer av saker kan vi sätta i kodblocket kontrolleras av villkoret "om"? Att allt beror på vad du vill att dina program (och krets) att göra. I detta fall, som ett sätt att visa att denna knapp gör något och fungerar, har jag lysdioden blinkar långsamt (varje 100 ms) medan knappen inte är intryckt, och blinkar snabbare (varje 10ms) när nedtryckt.
Här är de ändringar som gjorts i tidigare LED blinkande programmet:
#include < avr/io.h >
#include < util/delay.h >
int main(void)
{
DDRB | = 1 << PINB0;
DDRB & = ~ (1 << PINB1);
PORTB | = 1 << PINB1;
samtidigt (1)
{
PORTB ^ = 1 << PINB0;
om (bit_is_clear (PINB, 1))
{
_delay_ms(10); Snabb
}
annat
{
_delay_ms(100); Långsam, från tidigare
}
}
}
Det är det! Det finns mycket lite programmering krävs för att använda en knapp, LED och göra saker blinka!