Ik weet dat u bent klaar om te schrijven van het eerste programma. Je hebt meegemaakt veel tot nu toe! Terwijl we op het onderwerp, recapituleer de gebeurtenissen. U ging naar buiten en gekocht van de Atmel AVR Microcontroller van uw keuze. TheATMega32 koos ik voor mijn gebruik. U waren ingevoerd om het concept van microcontrollers hoe ze werken; en werden ook geïntroduceerd voor de programmeur, het apparaat waarmee de overdracht van het programma in de microcontroller. U bouwt een handige interface waarmee de SPI-pinnen sluit aan op de juiste pennen van de microcontroller. U gecontroleerd dat de programmeur (USBTinyISP)-stuurprogramma's correct zijn geïnstalleerd voor de 32-bits en 64-bits versies van Windows (XP, 7 en Vista). U ook geïnstalleerd de programmering milieu geïnstalleerd de "Programming Environment" genoemd WinAVR, zodat u kunt hebben van een omgeving waarin uw programma te schrijven, en breng het in de microcontroller. En om ervoor te zorgen dat alles correct werkt, gebruikt u avrdude getest de programmeur terwijl aangesloten op de computer en de microcontroller. Herinneren dat dit programma is het programma overdracht nut om verder te gaan onze gecompileerde programma in het geheugen de microcontroller. Ten slotte bouwde u het eerste circuit zodat we iets hadden te schrijven van een programma voor. Oef... dat was een stuk! Maar aangezien u sprong door alle van deze hindernissen, het harde werk is voorbij en het is glad zeilen van hier op. Hopelijk konden u krijgen door middel van de vorige stappen probleemloos--dus nu laten we krijgen op met ons eerste programma.
Omwille van de vereenvoudiging, laten we categoriseren de functie van de microcontroller in drie categorieën: controle, sensing en communicatie. We laten de details over het ontwikkelen van elk van deze functies, en ingaan op deze details als we de verschillende programma's schrijven. Merk op dat er vele manieren om deze functies programmeren. Voor het eerste programma maken we de microcontroller "control" iets. En zoals u uit de vorige post weet, we zullen worden met behulp van een LED voor dit doel. Kortom, wij zullen inschakelen de LED. Ja ik weet het... saai, recht? Nou moet ik ergens beginnen! Zoals ik u door de ervaring van de programmering meenemen, zal ik toevoegen meer complexiteit een beetje op een moment zo u gemakkelijk in staat bent om uw hoofd wikkelen rond deze belangrijke concepten.
Dus op dit punt waarschijnlijk vraagt u... Hoe maken we een programma om te controleren van een LED? Nou, het is echt gemakkelijk: We zullen gewoon vertellen Pin0 op PORTB voor de uitvoer van 5 volt. Vergeet niet dat dit de pin die de positieve leiding (anode) is aangesloten. De eerste toets in dit scenario is "uitvoer", en de volgende is "5 volt." Er is een manier die kunnen we het vertellen van een bepaalde pin moet worden ingesteld te worden een vermogen van het MCU. Zodra een pin is ingesteld op het bieden van uitvoer, zal u vervolgens zitten kundig voor besturingselement dat pin en maak het ofwel hoge (5 volt) of het lage (nulspanning). En aangezien er slechts twee staten voor deze pin in de uitvoermodus (5v of 0v), en slechts twee staten voor de mode zelf (ingang of uitgang), hoeft u alleen de waarde instellen op logische 1 of een 0. Merk op dat dit moet worden uitgevoerd voor elke pin die wij in onze schakeling wilt gebruiken. Maar voordat we naar inpluggen in een 1 of 0, laten we praten over invoer ten opzichte van de uitvoer. Als een pin in ingangsfunctie is luistert het naar een spanning. Als de pin in de uitvoermodus is kan de it worden gebracht op 5v of niet 0v in rekening gebracht. That's it!
Er zijn vele manieren om dit te doen. Dit is niet te verwarren u, maar eerder om dingen eenvoudiger te maken. Ik zal de invoering van u aan één van de vele manieren om deze taak te volbrengen, en verderop zal ik uitleggen enkele andere methoden tijdens het schrijven van andere programma's. Merk echter op dat terwijl deze eerste methode geweldig is voor de invoering van het concept, het is waarschijnlijk niet zo goed in de praktijk. Daarom ziet u andere methoden in toekomstige programma's, die contextuele pinnen (die pinnen aan beide zijden van de pin van belang) niet beïnvloed, verlaten zal aangezien ze kunnen heel goed hebben al eerder ingesteld in het programma. Maar aangezien we een eenvoudig programma schrijven, we zullen niet zorgen over deze complexiteit op dit moment.
Te halen de uitvoermodus voor een PIN-code, gebruikt u de Data richting registreren (DDR). Oh mens! Wat is een register?!? Laat dit u zorgen. Een register is gewoon een geheugenlocatie die maakt de microcontroller die reageren op een bepaalde manier. We gebruiken een register een status voor de microcontroller instellen, of de microcontroller die iets doen. Het is als reflexen, of prikkelt. Wanneer een persoon een andere persoon kietelt, roept het gelach. Kunnen we de MCU iets doen door een specifieke waarde in een register. Dat is alles wat die u moet weten op dit moment.
Dus wanneer u met het register van de DDR, bent u kundig voor troep de pin gegevens uitvoeren of gegevensinvoer accepteren. Maar we gezegd input of output, nu je gegevens ook zegt. De term "gegevens" gebruikt voegt hier gewoon een andere dimensie aan dit idee in de vorm van "tijd." Als u een pin 5 volt, dan nul volt, en vervolgens de 5 volt weer... verzendt u eigenlijk 1s en 0s. Om de pin, dit is niets meer dan een hoge (5 volt) staat, en vervolgens een laag (nul volt) staat: de MCU ziet deze hoog/laag-logica. En u kunt ook het ontvangen van gegevens op dezelfde manier.
Er zijn verschillende manieren om in te stellen pin0 voor poort B om uit te voeren. Een manier om dit te doen is om te schrijven:
DDRB = 0b00000001;Laat het me uitleggen. "DDRB" verwijst naar de Data richting Register voor poort B; "0b" is te vertellen de compiler dat wat volgt de binaire uitdrukking van een getal is; en de "1" op het einde geeft de positie van de pin 0 (de eerste pin in poort B). Recall zijn er 8 pinnen voor poort B; pinnen 0 al 7. Er zijn ook 8 cijfers in onze lijn van code. Dus elk cijfer vertegenwoordigt een pin op de poort, en we kunnen de afzonderlijke cijfers gebruiken om specifiek te verwijzen naar één van de pinnen in de haven B. Dus verwijst de '1' aan het einde van onze code-instructie naar de eerste pin in poort B, die in dit geval pin 0 is. (Herinneren dat C en C++ op nul gebaseerde talen, zijn zodat de eerste index van een gegevensstructuur naar verwijst het element zero'th is; de tweede index verwijst naar de eerste element, enz.) We hoeven niet echt te krijgen op dit punt meer complexe, zoals dit zal worden behandeld in veel meer detail in de toekomst tutorials. Echter als u meer weten over het binaire systeem wilt, kijk dan hier.
Nu moeten we toepassen van 5v op de pin. Dit werkt net als de code-instructie voor DDR die we hierboven gebruikten. We zullen een binair getal gebruiken 5v om op te zetten die pin (pin-nummer 0) met behulp van deze verklaring:
PORTB = 0b00000001;Het enige verschil tussen deze en de vorige verklaring is dat zijn we nu met behulp van het register van de poort. Dit register kent de pinnen van die specifieke poort, en geeft ons toegang tot de werkelijke waarde (logische 0 of 1) opgeven voor deze pinnen.
Nu moeten we praten een beetje over de algemene structuur van ons programma. Alle programma's moeten een opgegeven plaats om te beginnen met de uitvoering. Het is als het geven van iemand een reeks instructies over hoe te een cake maken zonder hen die stap te beginnen over te vertellen. De "belangrijkste" functie is de plek waar alle C/C++-programma's uitvoering start. Zo maken we een hoofdfunctie.
int main(void){
}
Om het programma te begrijpen van de DDR en de haven registreren informatie en hoe deze binnen de microcontroller werken, een include-instructie moet worden toegevoegd bevat dat alle informatie over de AVR-microcontrollers. Hierbij verklaring zal waarschijnlijk worden in alle programma's.
#include < avr/io.h >int main(void)
{
}
Wanneer het compilatieproces wordt gestart, wordt het pre processor-gedeelte van de compiler kijkt in de directory "avr" voor het bestand "io.h". De ".h" extensie hier aangeeft dat dit een headerbestand, en (zoals de naam al aangeeft) de code in dat bestand wordt ingevoegd aan het begin (hoofd) van het bronbestand dat u wilt maken. Nu kunt we invoegen verklaringen van de DDR en poort onze code, omdat de opneming van het headerbestand io.h de compiler heeft geïnformeerd over hen.
#include < avr/io.h >int main(void)
{DDRB = 0b00000001; //Data instelling pin0 richting registreren om uit te voeren en de resterende pinnen als input PORTB = 0b00000001; //Set pin0 tot 5 volt
}
Nu is de richting van de pin0 ingesteld op output, met een waarde die is ingesteld op 5v. Maar we zijn nog niet klaar. We moeten houden van de microcontroller uitgevoerd voor onbepaalde tijd, dus we moeten een routine om dit te doen. Dit heet een lus eindeloos (of oneindige). De oneindige lus zorgt ervoor dat de microcontroller stopt niet uitvoeren van haar activiteiten. Ik zal dit in meer detail uitleggen wanneer we dingen hebben te doen in deze for-lus. Er zijn verschillende soorten lussen die we voor dit doel gebruiken kunnen, maar voor deze demonstratie zal ik de while lus. Het betekent hetzelfde in het Engels als in de code: bijvoorbeeld, "terwijl" Ik heb mijn hand omhoog, u moet houden klappen.
#include < avr/io.h >int main(void)
{DDRB = 0b00000001; Gegevens richting registreren instelling pin0 uitgang en de resterende pinnen als input
PORTB = 0b00000001; Set pin0 tot 5 volt
while(1)
{
//Code zou hier indien dit nodig om uit te voeren over en over en voorbij... eindeloos
}
}
Opmerking dat we een '1' als het argument voor de while gebruiken lus, omdat iets anders dan '0' een logische true is. Dus de while lus voorwaarde zal nooit iets anders dan logisch waar, en het programma zal blijven voor onbepaalde tijd uit te voeren (dat wil zeggen; Ik houd mijn hand opgeheven).
Dus, hier is de vrucht van onze arbeid. Het was een lange rit tot nu toe zal, maar ik beloof, alles vanaf hier verheugend en veel minder tijdrovend. In de volgende video en instructie, zullen we de LED knipperen. We zullen onderzoeken hoe maak je een vertraging zodat de LED niet zo snel knippert dat het lijkt alsof het niet knippert.