Fonaments bàsics del microcontrolador explorats

Proveu El Nostre Instrument Per Eliminar Problemes





Una cosa és fantàstica amb els circuits integrats de microcontroladors, que estan disponibles a gairebé totes les parts del món i als minoristes electrònics.

Introducció

Fonamentalment, els dispositius de microcontroladors s’utilitzen popularment en aplicacions que impliquen avaluacions de l’entorn circumdant i en sistemes electrònics similars.



Podríeu trobar aquests dispositius que s’utilitzen per mostrar un determinat paràmetre, en aplicacions de control de motors, il·luminació LED, sensors de diversos tipus, com ara sensor d’inclinació, acceleròmetre, velocímetre, registradors de dades, controladors de temperatura, teclats, etc.

La comprensió principal sobre els microcontroladors es podria obtenir referint-se al microcontrolador AVR Amega32, que és tan avançat que de vegades s’anomena ordinador dins d’un xip.



Aquest dispositiu està assignat per dur a terme una sèrie d’ordres per formar un programa.

L’idioma del programa que veuríeu aquí és C ++. Aquí podreu aprendre aquest idioma amb més profunditat.

Quan es tracta d’MCU, teniu la possibilitat de controlar i configurar tots els seus pinouts.

Si us cansa una mica amb això, només calgui perquè no és gens complex, us anirà facilitant tots els aspectes de manera constant però ferma a mesura que avancem.

En un xip MCU, tots els pins, excepte els Vdd i Vss, que són els pins de potència del xip, es poden assignar amb designacions exclusives.

Detalls del pinout

Si mireu el xip des de la part superior, trobareu una petita osca triangular que indica el punt d’inici des d’on comença el pinout, que és el pas 1 del xip que comença just a sota d’aquesta osca.

A partir d’aquest passador, trobareu 20 pins cap a la part inferior d’aquest costat (esquerra) i altres 20 pins a l’altre costat (dreta), continuant de baix a dalt a la dreta.

Els primers 8 pins que comencen des de la osca són els PBO-7 que formen els pins d'índex de l'IC ja que tots els programes aquí comencen amb l'índex zero.

La sèrie anterior de pinouts s’anomena PORT B, mentre que hi ha altres conjunts idèntics de ports assignats de A a D.

Aquests ports es podrien assignar per acceptar i reconèixer dades alimentades anomenades INPUT, i també per transmetre dades en una forma específica anomenada OUTPUT.

Dos dels pins que pertanyen a la categoria general són els pins (+) / (-) que també es coneixen com a Vdd i GND.

Es pot veure un passador de PORT D (PDO-6) situat al costat esquerre del xip a la zona inferior.

El PD7, que és el pin número 7 de PORT D, es pot rastrejar de peu sol i començant per la sèrie de pinouts de la dreta.

Ara, passant del costat dret del xip on acaba el PORT D, PORT C comença el seu recompte ascendent en l’ordre.

Aquests contribueixen als molts pins interessants de la MCU, des dels analògics als digitals.

Aquests pins es converteixen en les entrades de detecció per detectar molts paràmetres a través de fases de circuits analògics configurats externament.

Els passadors anteriors constitueixen el PORT A.

La conversió analògica a digital entre els pins anteriors es podria entendre amb l’ajut d’un exemple en què un nivell de temperatura analògic detectat mitjançant un sensor normal com un termister s’aplica a un dels pins PORT A que és fàcilment acceptat i convertit per la MCU per produir una lectura digital de zero a 255 graus F (una xifra de 8 bits que es podria actualitzar per aconseguir una sortida de 10 bits).

Una altra característica que també es podria presenciar a les MCU és l’espai de programació disponible o la memòria que determina l’espai per a les variables i el programa especificats per al microcontrolador.

A més, les MCU tenen un rellotge incorporat assignat per comptar els paràmetres rellevants.

Les funcions del rellotge permeten a la MCU aplicar-se a molts processos de recompte diferents que podrien ser ràpids en el rang de microsegons en funció de l’especificació del dispositiu en concret i també poden ser més lents en la mesura desitjada.

A hores d'ara és possible que hàgiu entès el concepte de microcontrolador fins a cert punt i quant als seus ports i pins.

Com es crea un connector SPI des del programador fins al microcontrolador

Ara toca aprofundir una mica en el tema i investigar el món de la programació.

Dit això, abans de lliurar-nos a un procediment de càrrega de programes al xip, hem de trobar una manera adequada d’integrar el connector SPI (Serial Peripheral Interface) amb l’MCU.

Tanmateix, fins i tot després d’això no podem introduir l’SPI cap als pinouts de la MCU, oi? Tampoc no podem permetre que els cables allargats de l’SPI s’introdueixin directament a la placa de pa. Això també pot provocar una configuració incorrecta dels cables connectats amb els pins incorrectes que fan males connexions.

Per tant, per fer que les coses siguin absolutament impecables, fem els procediments sobre una petita placa verboard on obtenim els passadors metàl·lics de connexió necessaris també anomenats 'capçalera' soldats. Aquests pins de capçalera ara es podrien utilitzar per connectar-se amb el connector SPI. Les connexions d'aquesta capçalera es poden finalitzar a altres pins de capçalera paral·lels que es poden utilitzar per a les connexions de la placa.

Per tant, el conjunt anterior forma ara una plataforma de connexió intermèdia còmoda i fiable per al SPI a la MCU.

Uptil ara sembla tot perfecte, així que anem a guanyar pel que fa al programador que cal entre el vostre PC i l'MCU.

Podrien existir moltes empreses que fabriquen i venen aquestes unitats de programador, de manera que la compra d’aquestes no hauria de suposar cap problema, com ara Adafruit Industries, USBtinyISP o Sparkfun, etc.

Alguns d'aquests poden semblar completament diferents als tipus convencionals, però bàsicament tenen tot idèntic i segueixen les regles de programació estàndard i es poden utilitzar com a interfície entre el vostre PC i el microcontrolador AVR.

Tanmateix, assegureu-vos de pensar, si utilitzeu algun altre MCU i no un AVR Atmega32, potser haureu de buscar un programador compatible corresponent per a aquest xip MCU en particular.

Es pot observar que molts d'aquests programadors fan servir controladors idèntics, cosa que s'ha de tenir en compte i en coneixerem més en els nostres capítols posteriors.

Connectar el vostre PC amb el xip de microcontrolador és realment bàsic i estareu encantats de saber fins a quin punt es requereixen els procediments. Doncs, premem el botó immediatamentJ

Fer el tauler d’interfície SPI explicat anteriorment no és difícil, es tracta de fer funcionar la planxa de soldadura a través de totes les connexions de les dues files de capçaleres de pins que es mostren en un petit tauler d’ús general.

La figura anterior mostra els detalls de la connexió que hauríeu de seguir mentre connecteu els cables entre les capçaleres.

Per simplificar les coses, anem a la informació de connexió següent per referir-nos a la imatge superior:

El pin SPI que comença des de la part superior esquerra va al 'Master IN, Slave OUT' (MISO)

El pin SPI del centre esquerre es connecta amb el pin del rellotge (SCK)

El pin SPI a la part inferior esquerra s’uneix amb el Restabliment. (Aprendrem amb deteniment aquest pin als següents tutorials)

SPI rellevant per a la part inferior dreta es connecta amb el pin GND de la MCU, GND es refereix al pin que forma la línia de subministrament zero o el carril negatiu (relatiu) del subministrament.

L'SPI que finalitza des de la capçalera dreta central enllaça amb el pin 'Master Out, Slave IN' (MOSI) de l'MCU.

El SPI que surt de la capçalera superior dreta està connectat amb el (+) de la MCU, que és evidentment el Vdd o el pin de subministrament positiu de la MCU.

Això és.

Connecteu els dos connectors tal com s’explica i la vostra placa d’interfície SPI estarà preparada per a les accions necessàries.

Per obtenir més ajuda, podeu consultar la figura que es mostra més amunt, la vostra placa d’interfície final hauria d’ésser així després de fer totes les connexions de cable amb l’ajut de la discussió anterior.

Espero que ja hagueu construït la interfície SPI tal com s’explica al tutorial anterior i ara és hora de garantir que el nostre ordinador accepti el programador que hem d’integrar entre el PC i l’MCU.

Creació d’un codi de programació simple per a una MCU

Prenem una unitat USBTinyISP disponible a Sparkfun per enllaçar l’ordinador amb el microcontrolador.

Sabem que qualsevol sistema operatiu de l’ordinador, com ara Windows, necessitarà controladors sense els quals no serviria de res carregar res a l’ordinador, per la qual cosa el nostre programador necessitarà controladors per carregar-lo al vostre ordinador.

Vegem els procediments necessaris per instal·lar els controladors al sistema operatiu de l’ordinador; aquí prenem l’exemple del sistema operatiu Windows 7 amb especificacions de 32 o 64 bits.

Obriu sparkfun.com i feu clic a 'pàgina de programador de butxaca AVR'. L'enllaç es pot visualitzar fàcilment a la pàgina.

A continuació, cerqueu el 'controlador de Windows' als documents i feu-hi clic.

Això us proporcionarà el fitxer pocketprog-driver.zip al vostre ordinador.

Aneu a l’ordinador, cerqueu la ubicació de baixada i descomprimiu el fitxer descarregat a una carpeta.

En cas que el vostre ordinador tingui un sistema operatiu de 64 bits, haureu de seguir uns quants passos més, tal com es mostra a sota, amb un sistema operatiu de 32 bits, és possible que comenceu directament la instal·lació des del fitxer descomprimit.

Per a una versió de 64 bits, seguiu aquestes instruccions: per a 32 bits, simplement ignoreu:

Google 'libusb sourceforge' i feu clic a la versió més recent d'aquest enllaç.

Us trobareu amb uns quants fitxers addicionals, però us agradaria trobar el fitxer de pitet, és a dir: libusb-win32-bin - #. #. #. #. Zip

Ara aneu a trobar aquesta ubicació de baixada a l'ordinador, descomprimiu-la i deseu-la en una de les carpetes.

En aquesta carpeta, navegueu per la carpeta de la paperera i aneu a la carpeta amd64.

Veureu aquí un parell de carpetes com: ghcalled libusb0.dll i libusb0.sys.

Voleu canviar-ne el nom per: libusb0_x64.dll i libusb0_x64.sys.

Ara haureu de copiar els fitxers anteriors a la carpeta pocketprog-driver, només heu de sobreescriure els fitxers de la versió existent.

Per instal·lar els controladors anteriors, us interessaria el següent mètode, que no és un tipus convencional:

És un mode 'afegir maquinari heretat'.

Feu clic a 'Menú Inici'

A continuació, feu clic amb el botó dret a 'ordinador'

Feu clic a 'Gestiona' i, finalment, feu clic a 'gestor de dispositius'

A continuació, dins del menú, trieu 'Afegeix maquinari heretat'

Continueu prement 'següent' fins que s'insereixi l'assistent

Seguint les instruccions, feu clic a 'Instal·leu el maquinari que haureu de seleccionar d'una llista avançada'. Això farà que aparegui la icona del botó d'opció en aquesta selecció. En realitat, és un botó de control de Windows que ara apareixeria com un petit cercle amb un fitxer de color blau rodó a l'interior.

Ara només cal que feu clic a 'Següent'

Això us mostrarà el menú 'Mostra tots els dispositius' al qual haureu de fer clic.

Després d'això, feu clic a la icona 'Teniu disc'.

Amb l'ajut de la icona 'Examinar', aneu a la ubicació de la carpeta pocketprog-driver. Si la selecció la feu correctament, visualitzareu el fitxer pocketprog.inf situat a la carpeta en particular.

Feu doble clic sobre aquest fitxer i, sens dubte, podríeu veure com s’instal·la el controlador al vostre PC.

Canvi i fora!! Continuem amb el nostre següent tutorial a la pàgina següent.

A hores d'ara és possible que hàgiu instal·lat el programari necessari i que hàgiu creat la interfície SPI.

Com transferir un programa a un xip de microcontrolador

El següent pas requerirà uns quants components, com ara una placa de control, un LED i una resistència calculada per a l’aplicació prevista.

En aquesta secció coneixerem el mètode de prova del programador i confirmarem la instal·lació dels controladors i del programari rellevants.

Per tal de verificar si els controladors i el programari s’han instal·lat correctament, implementarem un programa senzill conegut com avrdude.

L'AVRdude és un programa associat a la darrera instal·lació de WinAVR sense la qual no es pot realitzar la transferència real del fitxer a la MCU.

Aquest programa és un format de fitxer .hex que essencialment es fa comprensible per a la MCU per a les execucions necessàries.

En cas que la verificació no tingui èxit, el programador serà incapaç de fer la transferència del fitxer.

Vegem ràpidament com podem implementar el procediment de prova amb l'ajut de les instruccions següents:

Obriu l’indicatiu DOS (sistema operatiu de disc) fent clic a “menú d’inici” i escrivint cmd.exe al quadre de cerca indicat.

Ara, la realització de l'AVRdude es pot fer simplement escrivint avrdude –c usbtiny –p m32 a través de l'indicador DOS. Tan bon punt s’implementi, el DOS reconeixerà instantàniament si la connexió ha estat un èxit.

A l'ordre anterior, '-c' és un indicador de notificació que inclou l'especificació del paràmetre del programador 'usbtiny', mentre que l'etiqueta '-p' identifica el dispositiu del microcontrolador ('m32 indica Atmega32).

En cas que hàgiu utilitzat una MCU diferent, haureu d'incloure els prefixos pertinents per a la implementació.

Un cop finalitzat el procediment anterior, podeu escriure 'exit' a la sol·licitud de DOS i això us farà moure per la finestra.

Si us pregunteu seriosament sobre els detalls de programació reals, bé, per a això, primer hauríem de soldar i construir el circuit LED analògic extern sobre el qual es podria implementar el programa, perquè tret que hi hagi un sistema que reconegui la resposta de la MCU, la programació i el funcionament del microcontrolador no tindria cap sentit.

Fer la placa LED és molt senzill, es tracta de soldar els dos cables del LED sobre un tros de placa verbo i connectar la resistència amb un dels cables del LED. La funció d’aquest LED és limitar el corrent al LED perquè no es cremi a causa de l’excés de tensió de l’anunci de la sortida de la MCU.

El valor de la resistència es pot calcular mitjançant la fórmula simple següent:

R = (Ub - LEDfwd) / I

Quan Ub és la tensió d'alimentació, LEDfwd és la tensió de funcionament òptima del LED utilitzat, i I és el seu amplificador òptim.

Suposem que fem servir un LED VERMELL que té un voltatge frontal LED = 2,5 V i un corrent I = 20 mA, l'equació anterior es pot resoldre de la següent manera:

Com que la tensió de l'MCU seria de 5 V, es pot expressar com:

R = (5 - 2,5) /. 02 = 125 ohms, ¼ watt, el valor més proper serà de 120 ohms.

Ara tenim el LED, una resistència de 120 ohm i una placa base, simplement interconnecteu els components anteriors tal com es mostra al diagrama amb el microcontrolador.

Un cop fet això, la MCU es podria programar per a la resposta prevista a la configuració del LED anterior.

A continuació, la programació de la MCU.

Per tal de permetre al microcontrolador realitzar algunes implementacions significatives, és imprescindible escriure les instruccions adequades a la MCU.

Com instal·lar un entorn de programació i investigar WinAVR

Per a això, probablement podríem fer servir el nostre propi 'editor de text' al nostre PC, tot i que potser agrairíem l'ús d'un 'entorn de programació' més professional en lloc d'un editor de text normal, senzill perquè aquest enfocament us permetrà gaudir funcions interessants incorporades dins d’aquest paquet “entorn de programació”.

Seria compatible amb la creació i edició de programes a través de diferents idiomes i també es compilaria en un mode de lliurament fàcilment entès i acceptat per un xip de microcontrolador.

En última instància, això seria recolzat per WinAVR i transferit al xip MCU en qüestió.

WinAVR també podria estar equipat per fer moltes altres operacions, com ara solucionar problemes dels programes i avisar-nos sobre possibles sintaxis i la compilació d’errors i errors. En comentarem aquests I els nostres tutorials posteriors.

Voleu que el curs d’instal·lació de WinAVR sigui extremadament ràpid i ràpid. Aprofundim en els detalls amb els punts següents:

Haureu de descarregar les últimes versions de la carpeta de fitxers de forja font de WinAVR. Trobareu informació útil relacionada amb aquesta descàrrega des del seu lloc web oficial.

Se us demanarà una consulta de seguretat, de manera que pugueu respondre si voleu que es faci la descàrrega; es demana que el fitxer que es descarrega sigui un fitxer executable.

Descarregueu el fitxer i comenceu el procés d'execució fent-hi clic. Deixeu que comenci la instal·lació.

El procés us guiarà amb algunes preguntes que us poden respondre perquè pugueu racionalitzar la instal·lació segons el vostre confort. Voleu ignorar molts d'aquests als seus formularis predeterminats, tot us correspon seleccionar els que considereu més adequats per a les accions.

Fins ara trobareu tot bastant normal i senzill i trobareu algunes opcions sobre el menú d'inici. No us preocupeu, només alguns d’aquests utilitzarien en realitat només un dels temes anomenats “bloc de notes per a programadors”.

Quan feu clic a aquesta icona, s'iniciaria la interfície d'usuari perquè pugueu aplicar l'escriptura dels programes (com ara crear i editar). També assistiríeu al programa que consisteix en ordres de menú per ajudar-vos a compilar els codis i incrustar-los al microcontrolador.

La tasca fonamental del bloc de notes del programador anterior és transformar un codi llegible per a humans que escriuríeu en una sèrie d’instruccions comprensibles només per a la MCU.

El següent tutorial tractarà les proves del programador anterior, de manera que puguem estar segurs de la seva compatibilitat amb Windows i de si 'dóna la mà' perfectament amb el vostre IC de microcontrolador.

Com programar una MCU per encendre un LED

Un cop confirmat, procedirem a crear un petit codi 'no fer res', només per assegurar-nos que el procediment de transferència de codi no tingui errors.

Per descomptat, ara estem preparats per implementar el nostre primer programa dins de la MCU, però abans seria interessant resumir ràpidament el que vam fer al llarg dels nostres tutorials anteriors:

Vam adquirir el microcontrolador AVR Atmel segons les nostres especificacions requerides aquí, hem utilitzat l’ATMega32 per a les il·lustracions. A continuació, vam conèixer els conceptes bàsics del microcontrolador i la unitat de programació que s’encarrega de transferir un programa al xip MCU.

Més endavant, vam crear el connector d'interfície SP que és essencial perquè el vostre ordinador es pugui enllaçar amb el microcontrolador per a les accions de programació.

Després d'això, vam confirmar si els controladors estaven instal·lats correctament a l'ordinador per a un sistema operatiu de 32 i 64 bits.

A continuació, vam instal·lar l’entorn de programació anomenat Win AVR per facilitar la transferència d’anuncis d’escriptura dels codis al microcontrolador, seguit de la implementació de l’avrdude per verificar el programador amb el vostre PC i el microcontrolador interconnectat.

Finalment, al capítol anterior vam acabar de construir el circuit LED / resistència i el vam connectar amb les sortides MCU corresponents.

De fet, això suposa molta feina, tot i que és hora de dirigir-vos immediatament a algunes coses reals de programació.

Per començar, voldríem dividir el microcontrolador en tres categories, cosa que simplificaria molt la nostra comprensió:

Control, detecció i comunicació

Seria interessant saber que les funcions anteriors es podrien programar de moltes maneres diferents.

Al nostre primer programa intentaríem ordenar al microcontrolador que 'controlés' un paràmetre extern, sí, teniu raó, seria el LED que vam construir recentment.

Per ser precisos, direm a la MCU que engegui el LED connectat, sí, sé que sembla bastant primitiu, però la fase inicial sempre ha de ser fàcil.

Avançar amb la feina actual, fer que la MCU controli el LED és realment bastant senzill:

Per a això, instruïm el pin # 0 al PORT B ​​per produir els 5V necessaris per al LED.

Recordem el tutorial anterior, vam connectar l’ànode del LED al pin esmentat de l’MCU.

Es requereixen dues coses essencials per abordar aquest pin de la MCU: 1) sortida i 2) 5 volts

Aprendrem una manera d’instruir el pin concret perquè es converteixi en la sortida de l’MCU.

Un cop configurat com a sortida del xip, és possible que indiquem que sigui 'alt' (5V) o 'baix' (0V) segons es desitgi per a una aplicació.

Com que qualsevol circuit lògic, com ara una MCU, els pins es poden assecar a una sortida o una entrada i es poden configurar per produir una lògica alta o una lògica baixa, els pins només s’han d’assignar per ser un màxim lògic o un mínim lògic. , no hi ha cap estat intermedi o indefinit que no sigui aquest parell d'estats per a microcontroladors o per a cap CI digital per a la matèria. També s’aplica el mateix per a tots els pins de l’MCU.

Pel que fa a les assignacions de pins d’entrada i sortida, les entrades es posicionarien per acceptar senyals d’etapes analògiques externes, mentre que les sortides serien responsables d’interpretar-les en els estats lògics especificats o en una freqüència.

Tot i que les tasques anteriors es podrien fer amb molts mètodes diferents, estaríem parlant d’una d’elles per simplicitat. Tanmateix, cal tenir en compte que, tot i que el que es presentaria ara sembla fàcil i interessant, no és tan viable i no és un tipus recomanable per a totes les aplicacions MCU, per la mateixa raó que se us presentarà els mètodes de programació més populars més endavant en el curs . Aquests programes permetran assignar només els pins desitjats segons les especificacions sense afectar els altres adjunts que possiblement ja es podrien assignar per fer algunes altres funcions.

Tanmateix, ara mateix no ens preocuparem tant dels altres pins i utilitzaríem només els pins d’interès pertinents, evitant complicacions fins a cert punt.

Per assignar un pin com a sortida, hem d’utilitzar el registre de direcció de dades (DDR). Si us pregunteu què vol dir registre aquí, és simplement un espai de la MCU que permet que el microcontrolador respongui d’una manera específica.

Mitjançant el DDR podem configurar el pin perquè enviï una dada que sigui com una 'sortida' o bé acceptar dades que es trobin en forma d ''entrada'.

Tot i que us pot confondre pel que fa a la paraula, què implica això? Les dades afegeixen una tercera dimensió als pins que es pot assignar a la contínua en zero lògic (0V) o en lògica alta (5V), però què passa amb els senyals que podrien variar ràpidament, com ara una freqüència de polsos. Una freqüència s’acompanyaria de lògiques altes i baixes (5V i 0V) oscil·lant amb alguns intervals o períodes especificats, per tant s’orienta al temps i es pot ajustar respecte al temps, per això ens identifiquem com a “dades” que significa un paràmetre que indica una funció relativa a una altra funció (estats lògics i temps).

Un mètode per assignar pin0 com a sortida és escrivint el codi següent:

DDRB = 0b00000001

Al programa anterior, DDRB significa Registre de direcció de dades per a PORT B ​​0b indica al compilador la següent expressió binària d’un número mentre que el “1” al final de l’expressió indica la posició del pin0, és a dir, la seva ubicació al formulari del primer passador del PORT B.

Si recordeu, hem après que PORT B ​​hi associa 8 pins (de 0 a pin7) i, si observeu que el codi anterior també conté 8 dígits, és a dir, cada dígit significa aquests 8 pins de PORT B.

Ara el següent procediment seria assignar 5V a aquest pin (pin0). Una vegada més, el principi de funcionament és idèntic al DDR que s'expressa anteriorment mitjançant el següent codi binari:

PORTB = 0b00000001

Com es pot veure, l'única diferència entre el codi anterior i l'anterior és que en aquest codi hem fet ús del registre PORT. Aquest registre gestiona específicament les assignacions de pins d’aquest port concret per al qual s’ha situat dins de l’MCU. Per tant, ens permet assignar les lògiques de dades reals (0 o 1) per a aquests pinouts.

Ara ens pot interessar discutir alguns detalls aproximats del nostre programa. Com sabem, tots els programes requereixen un espai concret per iniciar l'execució, es pot comparar amb un xef que coneix tots els ingredients relatius a una recepta concreta, però no se li indica des d'on començar.

La funció 'principal' aquí és la ubicació on cadascun dels programes C / C ++ inicia l'execució. Per tant, el principal es pot crear com:

int main (buit)
{
}

No obstant això, per permetre al programa interpretar els detalls del registre DDR i PORT i el seu funcionament dins del xip MCU, cal incloure una declaració addicional que pot consistir en totes les dades relatives a la MCU AVR. Potser voldríem afegir aquesta inclusió a tots els nostres programes.

#incloure
int main (buit)
{
}

Tan aviat com s'inicia la compilació, la secció de pre-processador del compilador se centra al directori AVR per identificar el fitxer 'io.h'. L'extensió '.h' aquí indica que és un fitxer de capçalera i que aquest codi dins del fitxer s'introduiria a l'inici (capçalera) del fitxer font que s'està creant, d'aquí el nom de 'capçalera'.

A continuació, podem introduir les sentències DDR i PORT al nostre codi, perquè l’addició del fitxer de capçalera io.h hauria dirigit el compilador al respecte.

#incloure

int main (buit)

{

DDRB = 0b00000001 // Registre de direcció de dades configurant pin0 a la sortida i els pins restants com a entrada

PORTB = 0b00000001 // Estableix el pin0 a 5 volts

}

L'anterior fixa l'orientació del pin0 com a sortida, amb una magnitud de 5V. Tanmateix, encara hi ha un problema que no s’ha determinat per a aquest pin, és a dir, aquest pin encara no s’ha d’encarregar que s’encengui indefinidament mentre s’encengui l’MCU. Aquest bucle de retroalimentació infinita asseguraria que aquest pin de l'MCU no s'apagui, sinó que continuï amb la sortida de 5V indefinidament.

Tot i que hi ha molts mètodes diferents d’aplicar una instrucció de bucle per a un pin, aquí provaríem d’utilitzar el bucle “while”. Com el seu nom indica, el bucle 'mentre' indica al microcontrolador que 'mentre' està disponible l'alimentació, heu de romandre activat amb el 5V assignat per al pinout assignat.

#incloure

int main (buit)

{

DDRB = 0b00000001 // Registre de direcció de dades configurant pin0 a la sortida i els pins restants com a entrada

PORTB = 0b00000001 // Estableix el pin0 a 5 volts

mentre que (1)

{

// El codi estaria aquí si fos necessari executar-se una vegada i una altra ... sense fi

}

}

És possible que vulgueu tenir en compte que aquí hem utilitzat '1' en forma d'argument per al bucle 'while', ja que tot excepte '0' es pot considerar un 'veritable' lògic.

Això implica que la consideració del bucle 'while' mai seria responsable de res excepte d'un 'veritable' lògic, el que significa que el pin concret es fixaria indefinidament amb l'estat especificat.

Es pot comprovar que el LED està encès al pin assignat permanentment, sempre que la MCU rebi alimentació a través dels seus Vdd i Vss.

Això és tot, ara tenim el resultat que volíem obtenir i, finalment, podem veure-ho succeir després de tanta feina dura, però, no obstant això, veure el dolç resultat del nostre treball és tan satisfactori.

Dins dels propers tutorials aprendrem com afegir una dimensió de 'temps' al LED anterior, és a dir, com fer que parpellegi a un ritme determinat.

De fet, en la implementació anterior, el LED parpelleja, però la velocitat del bucle és tan ràpida que és gairebé com un interruptor permanent encès sobre la il·luminació del LED.

Veurem com es pot afegir aquest bucle amb el retard que vulgueu per fer parpellejar el LED a aquesta velocitat retardada.

Com fer parpellejar un LED mitjançant el microcontrolador AVR

En l'última discussió, vam aprendre a fer que un interruptor LED s'encengui a través d'un microcontrolador, era excepcional, no? Pot ser que no ho sigui tant!

Aquí aprendrem com condimentar la il·luminació LED anterior atribuint una funcionalitat bidireccional, és a dir, intentarem que parpellegi o parpellegi a una freqüència o velocitat especificada. També veurem com es pot augmentar o disminuir aquest percentatge segons vulgui l’usuari.

Vegem això:

#incloure

#incloure

int main (buit)

{

DDRB | = 1<< PINB0

mentre que (1)

{

PORTB ^ = 1<< PINB0

_delay_ms (100)

}

}

Si us sentiu desconcertats amb aquests estranys símbols (&, ^, | etc) utilitzats en l'expressió anterior (& no hi és, però es podria utilitzar en altres codis similars), aquí teniu la informació relacionada que us interessa conèixer sobre aquests :

Inclou molts algoritmes lògics estàndard com AND, OR, NOT i XOR que solen utilitzar-se amb el codi anterior.

Aquesta funcionalitat lògica compara específicament els dos bits '1' i '0' segons les seves taules de veritat assignades.

Ens farem una idea analitzant la següent disposició de bits:

01001011 &
10001101
és igual
00001001

Al codi anterior es fa referència a AND tal com s'utilitza a la programació C.

Llegint les files verticalment, suggereix que 0 i 1 és igual a 0, 1 i 0 també és igual a 0, 0 i 0 és igual a 0, 1 i 1 és igual a 1. Llegir-lo és tan senzill. Aquests són segons la taula de veritat d'un operador AND.

Si valorem la taula següent, indica el símbol “|” que indica l'ús de la funcionalitat 'O', el '|' es pot trobar a l'esquerra de 'retrocés' al teclat de l'ordinador:

01001011 |
10001101
és igual
11001111

Idènticament, aquesta taula de veritat d’una funcionalitat lògica OR indica que els bits 0 o 1 són iguals a 1, 1 o 0 també són iguals a 1, 0 o 0 són iguals a 0, mentre que 1 o 1 és igual a 1.

La següent combinació de bits és per a l'operador lògic XOR indicat per ^ i es pot estudiar tal com vam fer amb les taules de veritat AND, OR:

01001011 ^
10001101
és igual
11000110

Ara continuem amb el primer programa i aprenem què significa la següent línia:

#incloure

A través dels nostres tutorials anteriors sabem com funciona l'expressió, de manera que no ho tornarem a reiterar, però sembla que és una nova 'inclusió' expressada per #include que cal investigar.

En aquest 'incloure' el delay.h ens permet fer alguns mètodes senzills d'implementació.

Com el seu nom indica, delay.h ens permet induir un retard en el programa en particular.

La següent expressió int main (void) es podria ometre del debat en curs, ja que ja ho hem tractat en les nostres publicacions anteriors.

A continuació ve el DDRB modificat.

A continuació es mostra la forma anterior, que no és una manera millor d'assignar els pins, ja que tots els pins del 0 al 7 es van canviar per formar les entrades. Però imagineu quina seria la situació si volguéssim crear un programa més llarg que requereixi aquests pins per a alguna altra funcionalitat? Per exemple, es podria necessitar pin2 per aplicar una commutació remota d'un aparell. En aquest cas, no agrairíem assignar el mateix que una entrada només mitjançant proves i errors. Això podria significar una resposta incorrecta del transmissor remot al receptor de l'aparell.

DDRB = 0b00000001

Més aviat volem influir només en un bit, hat pin0 bit, donant un cop d'ull a la funcionalitat 'OR' que es podria executar mitjançant un emmascarament binari.

DDRB = DDRB | 0b00000001

Aquí es tapa amb una màscara 'OR': 0b00000001, tot i que sembla ser un número binari autèntic, en cas que el DDRB anterior, per exemple: 0b01001010, aplicar-hi una OR mitjançant un emmascarament podria donar: 0b01001010 | 0b00000001 = 0b01001011.

La diferència resultant, com es va poder comprovar, és només amb el pin0, els bits del qual han canviat.

Comprimir encara més la sentència anterior mitjançant C ++ dóna:

DDRB | = 0b00000001

Tot i així, trobem que hi ha encara més en el programa donat. Tot i que pot semblar bastant legítim i obvi, hauríem d’aprofitar algunes de les afirmacions del fitxer de capçalera io.h, especialment quan es crea fonamentalment per a la nostra comoditat.

Per tant, si “DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

Comencem amb un 0b00000000 i posem un '1' per produir 0b0000001 i després el transferim a 0 posicions a l'esquerra, cosa que dóna un 0b00000001 exactament idèntic a l'anterior.

Ara, si suposem que era PINB4, la declaració es podria expressar com a 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Compte, estem utilitzant un índex zero, és a dir, que hi ha quatre zeros després de l'1.

Ara passem al bucle 'while' que anteriorment havíem assenyalat a través del 'bucle infinit'. Però potser ara volem que el microcontrolador implementi algunes de les execucions desitjades. Això només pot ser factible dins del bucle donat. És el bucle on es repeteix la seqüència particular una i altra vegada.

En cas que l'execució es posés abans del bucle, s'hauria implementat només una vegada.

Tanmateix, per fer parpellejar el LED indefinidament, caldria activar / desactivar el PINB0 alternativament dins del bucle. Aquí també trobem que s’introdueixen els retards, sense els quals el parpelleig del LED seria impossible. Però això obligaria el LED a parpellejar a un ritme molt ràpid i difícil de reconèixer a simple vista, hauria de frenar una mica per convertir-se en identificable amb els nostres ulls.

Som conscients del procediment de configuració d’un bit concret en el número binari, però no estem segurs del mètode d’aplicació d’un bit específic “0” en cas que encara sigui un “1”.

Es pot veure el programa següent fent això, però també veurem que pot ser que no sigui visible al programa.

Les dues frases inicials canvien el bit a '1' (5V, llums LED) i, a continuació, s'introdueix una pausa durant 100 ms.

El següent parell de línies converteix el bit PINB0 en “0” (zero voltatge, LED apagat), però ho sento, la comparació AND no podrà executar un “0” del bit, però si fem servir NO “~” per a la màscara binària podria canviar tots els 0 en 1 i viceversa.

Això ens permetrà influir només en el bit PINB0 i capgirar-lo a '0'. El parèntesi es va incloure per contenir l'execució de l'emmascarament de manera que l'operació NO es pogués aplicar per a totes les màscares i no simplement per sobre del '1' abans del desplaçament a l'esquerra '<<”.

PORTB | = 1<< PINB0
_delay_ms (100)
PORTB & = ~ (1<< PINB0)
_delay_ms (100)

Per tal de crear els retards en ON OFF o els períodes d’igual durada, podem reduir les quatre línies anteriors a dues i aplicar la funcionalitat XOR al nostre benefici. Cal tenir en compte una execució XOR i un pin assignat a un 1 en cas que sigui 0 i viceversa. Aquesta execució només influiria en el PINB0. Com moltes vegades s'aplica l'ordre, simplement convertiria el bit en el contrari de la lògica existent.

PORTB ^ = 1<< PINB0
_delay_ms (100)

FET! El vostre LED parpellejaria ara segons la velocitat establerta ... Simple, no?




Anterior: Circuit de control remot de diversos electrodomèstics Següent: Circuit indicador de falles a la fase de corrent altern, neutre i de terra