Conocimientos Básicos del Microcontrolador ATmega 328. Puertos de Entrada/Salida de propósito general. os pines usados en la placa Arduino Arduino !el AT ATmega8 mega8 " el AT ATmega# mega#$8% $8% posee poseen n tres puert puertos os !El ATmega328 AT mega328 !Arduino &no% &no% usa la misma misma con'iguración de pines pines (ue el ATmega#$8%) ATmega#$8%) •
B (pines digitales del 8 al 13)
•
C (entradas analógicas)
•
D (pines digitales del 0 al 7)
Puertos de Entrada y Salida (I/O Ports). LA siguiente fgura muestra el circuito equivalente de un pin de entrada y salida.
odos los registros y los !its de re"erencia se escri!en en "orma general. Los odos registros indicados en la siguiente descripci#n nos permiten emplearlos para un uso us o es espe pec c$f $fc co en "un unc ci# i#n n de la ope pera rac ci# i#n n de dese sead ada a po porr el us usua uari rio o. A continuaci#n se muestra el esquem%tico del Puerto como entrada y salida de prop#sito general.
A continuaci#n se muestra la siguiente ta!la que descri!e su uso para la confguraci#n de los puertos y pines del microcontrolador. microcontrolador.
Puertos de Entrada y Salida (I/O Ports). LA siguiente fgura muestra el circuito equivalente de un pin de entrada y salida.
odos los registros y los !its de re"erencia se escri!en en "orma general. Los odos registros indicados en la siguiente descripci#n nos permiten emplearlos para un uso us o es espe pec c$f $fc co en "un unc ci# i#n n de la ope pera rac ci# i#n n de dese sead ada a po porr el us usua uari rio o. A continuaci#n se muestra el esquem%tico del Puerto como entrada y salida de prop#sito general.
A continuaci#n se muestra la siguiente ta!la que descri!e su uso para la confguraci#n de los puertos y pines del microcontrolador. microcontrolador.
&e!emos de re &e!emos recor cordar dar que las ter termina minales les de los di"e di"ere rente ntes s pue puerto rtos s tie tienen nen "unciones adicionales tal y como se muestra a continuaci#n' continuaci#n'
A continuaci#n se descri!en los registros registros correspondientes. correspondientes. PEO *.
PEO +.
PEO &.
El Arduino no que contine al microcontrolador Amega,-P presenta los puertos *+ y &. +ada puerto es controlado por tres registros los cuales tam!i0n est%n defnidos como varia!les en el lengua1e del Arduino. El registro &&2 (egistro de &irecci#n de &atos del Puerto 2) determina si el pin es una entrada o una salida. El registro PO2 (egistro de &atos del puerto 2) controla si el pin est% en nivel alto o en nivel !a1o. El registro PI32 (egistro de confguraci#n de PI3 del puerto 2) permite leer el estado de un pin que se 4a confgurado con entrada usando la "unci#n pin5ode(). 6Los registros && y PO pueden ser am!os escritos y le$dos. El registro PI3 corresponde al estado de las entradas as$ que solo puede ser le$do.7 El PO& mapea los pines digitales del 8 al 9 &&& : El registro de confguraci#n del modo de los pines del puerto & : lectura/escritura PO& : egistro de datos del puerto & : lectura/escritura PI3& : egistro de pines de entrada : solo lectura El PO* mapea los pines digitales del al ;,. Se de!e recordar que< Los !its altos (= > 9) est%n mapeados a los pines del cristal de cuar?o y no pueden ser usados. Estos son solamente accesi!les en el Arduino 5ini. &&* : El registro de confguraci#n del modo de los pines del puerto * : lectura/escritura PO* : egistro de datos del puerto & : lectura/escritura PI3* : egistro de pines de entrada : solo lectura El PO+ mapea los pines de entrada anal#gica del 8 al @. &&+ : El registro de confguraci#n del modo de los pines del puerto * : lectura/escritura PO+ : egistro de datos del puerto & : lectura/escritura
PI3+ : egistro de pines de entrada : solo lectura +ada !it de estos registros corresponden con un solo pin por e1emplo el !it menos signifcativo de los registros &&* PO* y PI3* 4ace re"erencia al pin P*8 (pin digital ) 3ormalmente antes para declarar un pin lo 4ac$amos de la siguiente manera' na de las caracter$sticas de la programaci#n de microcontroladores es el mane1o de operaciones orientadas a !its. Esto se usa de!ido a que cada uno de los !its de los registros de E/S del microcontrolador tienen un signifcado espec$fco como por e1emplo la 4a!ilitaci#n de una caracter$stica. E2isten di"erentes "ormas de acceder a los !its de un registro entre ellas la de reali?ar enmascaramientos con operaciones or y and. A continuaci#n se muestra un e1emplo de ello' PO* BC (;DDP*-) //+oloca un ; en el !it - del Puerto * PO* >C (;DDP*-) //+oloca un 8 en el !it - del Puerto * En la primer l$nea de c#digo se reali?a la operaci#n or entre el registro y un valor dado por un ; despla?ado P*- veces. Esto es ;DD- lo cual corresponde a F88888;88F en !inario. Al reali?ar la suma l#gica de un ; en la posici#n - independiente del valor en que se encuentre este !it se coloca en ; y el resto de !its no se ven a"ectados porque el valor que se les est% sumando es cero. En la segunda l$nea de c#digo se reali?a la operaci#n and entre el registro y el valor negado de la operaci#n de un ; despla?ado PA- veces. Esto es (;DD-) lo cual corresponde a F;;;;;8;;F en !inario. Al reali?ar la and con este valor solo el !it - es colocado en cero y el resto de !its queda en su valor original. 5acros na "orma simple de tra!a1ar con estas operaciones orientadas a !its es creando macros que permitan reali?ar esta tarea de "orma m%s si mple' ; -
Gdefne s!i(PO!it) PO BC (;DD!it) Gdefne c!i(PO!it) PO >C (;DD!it)
La "orma de usarlo ser$a la siguiente' ; -
s!i(POA;) //+oloca el !it ; del puerto A en ; c!i(PO+=) //+oloca el !it = del puerto + en 8
Otros macros disponi!les en las li!rer$as del AH Li!c se pueden encontrar en' *ttp)//+++.nongnu.org/a,r-lic/user-manual/groupa,rs'r.*tml
Otra "orma de llevar a ca!o la ela!oraci#n de un programa con Arduino.cc es de la "orma siguiente'
Entonces si quisi0ramos declarar 9 pines (desde el digital 8 al digital 9) tendr$amos que repetir pin5ode 9 veces. Al igual que escri!ir tendr$amos que poner digitalrite(pinestado) pin 8 estado alto pin ; estado !a1o etc. Al utili?ar egistros PO (Puerto) tenemos la venta1a de que con solo una instrucci#n podemos declarar el pin como entrada o salida y tam!i0n podemos escri!ir si lo queremos como estado JIKJ o LO. Para controlar cualquiera de los tres puertos de!emos usar dos instrucciones. Primera instrucci#n' se de!e declarar en la estructura void setup() y nos sirve para declarar si el pin se va a usar como I3P o como OP. &ato Importante'
E1emplo' ; C OP
8 C I3P
&& C *;;;;;;;8 donde es la letra del puerto a usar (*+&). Sin em!argo si queremos tener comunicaci#n Serial tendr$amos que 4acer esto' && C && B *;;;;;;88 Esta manera es m%s segura ya que confgura los pines del - al 9 como salidas sin cam!iar los pines 8 y ; que como mencionamos son y Para tener m%s re"erencia de los operadores !it a !it tipo A3& visita el siguiente post de Arduino' utorial de operaciones con !its. enemos el siguiente c#digo' *;;;;;;;8 +olocamos * porque el nMmero a marcar es *inario. Para ampliar m%s so!re los tipos de datos en Arduino visitemos el siguiente !log' ipos de &atos en Arduino. Para sa!er el estado que le daremos al pin siempre lo pondremos escri!iendo de derec4a a i?quierda. 3Mmero a marcar ; ; ; ; ; ; ; 8 !icaci#n 9 = @ N , ; 8
del pin en Arduino. Segunda instrucci#n' es la escritura del puerto (esta variar% en "unci#n del programa que estemos desarrollando). Lo locali?amos en la "unci#n void loop(). E1emplo' ; CJIKJ POC *;;;;;;;8
8 C LO
En este e1emplo los pines del ; al 9 permanecer%n encendidos (JIKJ) y el pin 8 LO. Heamos un e1emplo aplicando estos conceptos' En este e1emplo lograremos que durante dos segundos todos los leds enciendan durante dos segundos m%s alum!ren los impares y durante dos m%s todos se apaguen. Heamos' +onfguraci#n tili?ada'
Configuración Utilizada para este proyecto.
A!rimos Arduino IDE y escri!imos el siguiente c#digo :
Para ver otro e1emplo utili?ando egistro PO (Puerto) visitemos el siguiente post' +ontrol de &isplay 9 Segmentos mediante Pulsadores. Henta1as y &esventa1as que nos o"rece al utili?ar el egistro PO (Puerto)' &esventa1as' El c#digo es muc4o m%s di"$cil de depurar y mantener y es muc4o m%s di"$cil de entender para la gente. Solo lleva algunos microsegundos al procesador e1ecutar c#digo pero podr$a llevarte 4oras descu!rir por qu0 no "unciona y arreglarlo. Es muc4o m%s "%cil causar mal "uncionamiento no intencionado usando el acceso directo a un puerto. O!serva como la l$nea &&& C *;;;;;;;8 de arri!a menciona que el pin 8 se de!e de1ar como una entrada. El pin 8 la l$nea de recepci#n () en el puerto serial. Podr$a ser muy "%cil causar que tu puerto serial de1e de "uncionar por cam!iar el pin 8 a una salida. Henta1as' Puede que puedas cam!iar los pines de estado muy r%pido en "racciones de microsegundos. Las "unciones digitalead() y digitalrite() son cada una cerca de una docena de l$neas de c#digo lo cual al ser compilado se convierte en unas cuantas instrucciones m%quina. +ada instrucci#n maquina necesita un ciclo de relo1 a ;=5J? lo cual puede sumar muc4o tiempo en aplicaciones muy dependientes del tiempo. El egistro PO (Puerto) puede 4acer el mismo tra!a1o en muc4os menos ciclos de tra!a1o. •
•
•
•
•
Algunas veces necesitamos confgurar muc4os pines e2actamente al mismo tiempo. Por lo que usar las "unciones digitalrite (;8JIKJ) seguida de la "unci#n digitalrite (;;JIKJ) causar% que el pin ;8 se ponga en nivel alto varios microsegundos despu0s que el pin ;; lo cual puede con"undir circuitos digitales conectados al Arduino cuyo "uncionamiento dependa del tiempo preciso del cam!io de esos !its. Si te est%s quedando sin memoria para tu aplicaci#n puedes usar estos trucos para 4acer que tu c#digo sea m%s pequeo. sando este m0todo se necesitan muc4os menos !ytes de c#digo compilado que si se 4ace un !ucle para que se vaya cam!iando cada pin uno por uno.
Reset. El pin ; del A5ega,-P es el pin de ESE del cual podemos mencionar que es una interrupci#n de alta prioridad este de!e tener un estado Alto (JIKJ) para evitar que el microcontrolador se reinicie para ello ponemos una resistencia de ;8 entre el pin ; y positivo (@v). Si no ponemos la resistencia el microcontrolador "uncionar% igualmente pero para evitar posi!les reseteos aleatorios es me1or asegurar el nivel l#gico por lo que 4ay que ponerla. Para poder resetear el microcontrolador cuando uno desee se pone un pulsador (PSJ *OO3) conectado entre el pin ; 1usto antes de la resistencia de ;8 y negativo (K3&). As$ cuando lo pulsemos el microcontrolador detectar% el estado !a1o (LO) en el pin ; (ESE) y se reiniciar%. Herifcar que el pin 9 est% conectado a H++ del A5ega,-P o sea a positivo (@v) y el pin a negativo (K3&) con estas - cone2iones se alimenta al microcontrolador. El pin -- tam!i0n va conectado a negativo (K3&) y los pines -8 (AH++) y -; (AEQ) que son los volta1es de re"erencia. am!i0n podemos ver que el pin R (OS+;) y el pin ;8 (OS+-) se tiene conectador el oscilador de ;=5J? el oscilador no tiene polaridad as$ que se puede colocar como uno desee. En cada e2tremo del oscilador se tiene conectado un condensador de 22pF a negativo (K3&) para darle esta!ilidad al microcontrolador en circuitos !%sicos estos condensadores de --pQ no son necesarios pero si es recomenda!le ponerlos. Se pueden tener di"erentes maneras de dar un ESE al microcontrolador la anterior mencionada se conoce como ESE e2terno pero tam!i0n se puede tener ESE interno ya sea por programa o cuando uno de los m#dulos se ESEEA porque as$ est% confgurado. Los casos pueden ser' • • • • • •
ESE por Energ$a. ESE E2terno. Por &etecci#n de *a1ada de tensi#n. ESE por el Sistema de Perro guardi%n (atc4dog System eset). Holta1e de e"erencia Interno. atc4dog imer.
¿Cómo se realiza un restablecimiento de softare del !"#$ La "orma can#nica de reali?ar un resta!lecimiento de so"tare de la noT5EKA AH es utili?ar el tempori?ador de vigilancia. Activar el tempori?ador de vigilancia del tiempo l$mite esta!lecido m%s corto y luego ir a una no 4acer nada !ucle infnito. El organismo de control se resta!lecer% el procesador. 5EKA partes tienen un !it espec$fco SUSSU!m en el S.+L registro que genera un resta!lecimiento de 4ardare. SUSSU!m est% protegido por el sistema de confguraci#n de Protecci#n 5EKA +am!io. La ra?#n por la que utili?a el tempori?ador de vigilancia o SUSSU!m es pre"eri!le a saltar al vector de reset es que cuando el organismo de control o SUSSU!m resta!lece el AH los registros se resta!lecer%n a sus a1ustes conocidos por de"ecto. 5ientras que saltar al vector de reset de1ar% a los registros en su estado anterior que por lo general no es una !uena idea. PRECAUCIÓN! 5ayor AH tendr%n el tempori?ador de vigilancia des4a!ilitado en un reinicio. Por estas AH mayores 4aciendo un reinicio por so"tare que permite al organismo de control es "%cil ya que el organismo de control y luego se desactivar% despu0s del reinicio. En los nuevos AH una ve? que el organismo de control est% 4a!ilitado entonces se queda habiitado incuso despu"s de un reinicio! Por estas nuevas AH una "unci#n necesita ser aadido a la secci#n .init, (es decir durante el c#digo de inicio antes de main ()) para desactivar el organismo de control con sufciente antelaci#n para que no se reinicia continuamente el AH. Aqu$ 4ay un c#digo de e1emplo que crea una macro que se puede llamar para reali?ar un resta!lecimiento autom%tico'
Para AH m%s nuevos (como el atmega;-;) tam!i0n aadir esta "unci#n a su c#digo a continuaci#n desactivar el organismo de control despu0s de un reinicio (por e1emplo despu0s de un arranque en caliente)'
Por lo que al 4acer un reset se puede reali?ar tam!i0n de la siguiente "orma'
El c#digo anterior normalmente puede tener pro!lemas por lo que el siguiente c#digo se 4a cargado en di"erentes microcontroladores y no se 4a presentado tanto errores' 0include 1a,r/+dt.* ,oid setup!%
+dtdisale!%4 Serial.egin!5$66%4 Serial.println!7Setup..7%4 Serial.println!7ait 9 sec..7%4 dela"!9666%4 +dtenale !
// des*ailito el +atc*dog
// espero 9 segundos: para dar tiempo a cargar un nue,o s;etc*. // *ailito el +atc*dog cada 8 segundos
> int timer ? 64 ,oid loop!% // Cada # segundo se incrementara un contador !(ue sera mostrado por el monitor serial% " parpadeara el led
i'!@!millis!%#666%% timer4 Serial.println!timer%4 digitalrite!#3: digitalead!#3%??#D6)#%4 dela"!#%4 > // +dtreset!%4 // si se llamara a esta 'uncion todo andaria correctamente: "a (ue se resetearia el // +atc*dog. // Está remarcada para (ue se resetee el arduino a los 8 segundos " ,eamos (ue // pasa. >
Comportamiento esperado:
Se de!erian ver por monitor serial los valores del ; al R un reset del arduino y otra ve? los valores esto en un !ucle infnito. Comportamiento en arduinos que no funcionan correctamente:
Se ve por monitor serial los valores del ; al R y luego se cuelga el arduino parpadenado todos los leds como loco. %nterrupciones
Las interrupciones son eventos especiales que se generan interna o e2ternamente en el microcontrolador que pausa moment%neamente la e1ecuci#n del programa para reali?ar una tarea !reve y despu0s volver al punto donde se qued# e1ecutando el programa. Esto sirve para que el microcontrolador no est0 siempre tra!a1ando por e1emplo en c4ecar el estado de una entrada constantemente y solo poner atenci#n cuando el evento deseado ocurre. En esta entrada se tratar% de e2plicar c#mo "unciona el sistema de interrupciones de los AHVs los vectores y registros que lo componen tanto como su programaci#n en + con el compilador avrTgcc y avrTli!c. Imaginen que est%n en la mesa de su casa tomando el desayuno de repente el tel0"ono suena te levantas atiendes la llamada cuelgas y vuelves a la mesa a desayunar esa ser$a una analog$a de lo que es una interrupci#n. Lo mismo pasa con los microcontroladores y microprocesadores tienen un m0todo de que otros dispositivos e2ternos (o internos) al micro puedan mandarle una alerta so!re algo y este atienda la alerta y continMe su proceso. Los microcontroladores AH tienen no tiene interrupciones por so"tare lo que es Mtil para tareas especiales de sistemas operativos como intercam!io de
procesos o mane1o de e2cepciones aqu$ nos concentraremos solamente en las interrupciones por Jardare. Las interrupciones se organi?an en vectores de interrupci#n con prioridad. +ada modelo de AH tiene un con1unto di"erente de "uentes de interrupci#n podemos averiguar cu%les son las "uentes que pueden interrumpir al microcontrolador viendo su datas4eet. Los vectores de interrupci#n no son m%s que direcciones espec$fcas de la memoria de programa en la que se encuentra una instrucci#n de salto al "ragmento de c#digo que se de!e e1ecutar acorde a la "uente que lo interrumpe. En el AH tenemos di"erentes "uentes de interrupciones cada una teniendo su espacio de memoria de programa para el vector de interrupci#n en esta direcci#n se indicar% cual es la direcci#n de salto donde se encuentra el c#digo que se de!e e1ecutar para esa interrupci#n. El contador de programa se carga con la direcci#n del vector de interrupci#n una ve? que 0sta sucede y a4$ tendremos una instrucci#n de salto a la direcci#n de memoria donde est% el c#digo que atiende a la interrupci#n. Se 4a!lar% de las interrupciones del Amega,-P pero es muy "%cil escri!ir c#digo para otro microcontrolador !asta ec4ar un vista?o a su datas4eet para conocer los vectores y "uentes de interrupci#n. En la parte m%s !a1a de la memoria de programa est%n estos vectores de interrupci#n si dos interrupciones ocurren al mismo tiempo la interrupci#n con una posici#n de memoria m%s !a1a se e1ecuta primero estos vectores tam!i0n pueden ser u!icados en la F*oot Was4 sectionF en el caso de que usemos un !oot loader. a!la de Interrupciones y ESE para el Amega ,-P.
odas las interrupciones tienen su !it en el registro correspondiente para ser 4a!ilitadas o des4a!ilitadas tam!i0n 4ay un !it (Klo!al Interrupt Ena!le) para 4a!ilitar o des4a!ilitar todas las interrupciones en el registro de Status (SEK). Jay dos tipos de interrupciones las que se disparan por un evento que cuando
tiene lugar activa un !it (Wag) en un registro del microcontrolador y cuando se 4a!ilita salta y las que se disparan mientras la condici#n de la interrupci#n est% presente no tienen que tener ningMna !andera (Wag) como en el caso anterior si la condici#n de la interrupci#n desaparece antes de que 0sta est0 4a!ilitada no se dispara. El registro de Status no es salvado en el registro stac cuando se activa la interrupci#n se de!e salvar y restaurar por so"tare el registro que va al stac 0ste se encuentra en la SA5 (el programa empie?a por un lado y el stac por el otro) es el contador de programa y se restaura cuando se sale de la interrupci#n para que el micro vuelva al c#digo que esta!a e1ecutando. egistros interrupciones. Status.
*it ; T IHSEL (Interrupt Hector Select)' sitMa los registros de interrupci#n en memoria cuando' 8 se colocan al principio de la Qlas4 ; se coloca al principio de la secci#n del !ootloader. Para nuestro caso va a ser cero. *it 8 T IH+E (Interrupt Hector +4ange Ena!le)' sirve para mover los vectores de interrupci#n 1unto con el !it anterior.
El !it 9 es Klo!al Interrupt Ena!le que 4a!ilita o des4a!ilita todas las interrupciones.
Interrupciones e#ternas $ sus re%istros. Estas interrupciones se pueden disparar desde el e2terior del micro cam!iando el nivel de tensi#n de uno de sus pines todas tienen asociadas una o varias patillas del microcontrolador y son las que usaremos para los !otones. Las interrupciones e2ternas son disparados por los pines I39'8 y P+I3-,'8 incluso aunque est0n confgurados como salida lo que permite disparar interrupciones por so"tare. Jay ;8 vectores de interrupci#n (con el salto a la direcci#n de programa donde se encuentra el c#digo que atiende a la
interrupci#n) e2terna en la memoria 9 de ellos (los de e2ternal interrupt request) se corresponden con las interrupciones asociadas a los pines del registro EI5SX un vector/interrupci#n por cada !it del registro. Los otros , vectores (Pin +4ange Interrupt equest 8 ; y -) se corresponden con las interrupciones asociadas a los pines de los registros P+5SX- P+5SX; y P+S5X8 una interrupci#n por cada registro es decir los !its/pines del registro pueden 4acer saltar la misma interrupci#n luego 4a!r% que determinar en la rutina de atenci#n a la interrupci#n cual de esos !its dentro del registro es el responsa!le leyendo su entrada uno a uno. Pin +4ange Interrupt. Interrupciones que se disparan cuando cam!ia el estado del pin asociado a cada interrupci#n no necesitan la presencia de la seal de relo1 en el micro.
P+IE- (Pin +4ange Interrupt Ena!le -)' 4a!ilita las interrupciones de los pines entre P+I3-,';= los pines son 4a!ilitados uno a uno en el registro P+5SX-. +uando una de estas interrupciones ocurre se activa la !andera (Wag) correspondiente y se salta al vector de interrupci#n Y88;= si todo lo necesario est% 4a!ilitado. P+IE;' lo mismo con P+I3;@' P+I; P+5SX;. Y88;N. P+IE8' P+I39'8 P+I8 P+5SX8. Y88;-.
Estos !its son los Wags de las interrupciones 4a!ilitadas en el registro anterior cuando una interrupci#n ocurre se pone a ; el !it de este registro que se corresponde con la interrupci#n para indicar al microcontrolador que la interrupci#n 4a tenido lugar. EL Wag es limpiado cuando la rutina de interrupci#n 4a sido e1ecutada. Para limpiar un Wag de!emos escri!ir un uno l#gico en el !it.
La m%scara para P+IE-. Si uno de estos !its est% activado y el !it P+IE- del registro P+I+ est% activado la interrupci#n est% 4a!ilitada en el pin de entrada/salida correspondiente y cuando 4ay un cam!io en 0ste se dispara la interrupci#n de P+IE-. &e la misma "orma con P+IE; y P+IE8'
E#terna Interrupt. En este registro cada !it tiene su vector de interrupci#n no es como el caso anterior que todos los !its del registro 4ac$an saltar la misma interrupci#n.
Los !its 4a!ilitan la interrupci#n e2terna del pin correspondiente.
Los Wags de las interrupciones asociadas al registro anterior.
En estos registros se confgura el tipo de evento que dispara las interrupci#nes e2ternas asociadas a EI5SX segMn la ta!la de de!a1o por e1emplo podemos confgurar que la interrupci#n suceda cuando en el pin tenemos un Wanco de !a1ado o de su!ida cualquiera de los dos o cuando tenemos un nivel !a1o en el pin. Los Wancos de su!ida y !a1ada de las interrupciones de EI+* necesitan la presencia de relo1 en el microcontrolador mientras que las de EI+A son as$ncronas. Al cam!iar la confguraci#n 4ay que des4a!ilitar el !it correspondiente en EI5SX para evitar que la interrupci#n salte como consecuencia de este cam!io.
En AH K++ una rutina de atenci#n a la interrupci#n se declara de la siguiente "orma' IS(3O5*EUvect)
Z //code [ &onde 3O5*EUvect identifca el vector de interrupci#n puede tener m%s argumentos adem%s del nom!re segMn lo que queramos que 4aga la IS las opciones est%n en el lin anterior. &e!omos aadir el Ginclude Davr/interrupt.4\ al programa. +on sei() y cli() de avr/interrupts.4 4a!ilitamos y des4a!ilitamos todas las interrupciones poniendo a ; # 8 el !it de Klo!al Interrupt Ena!le. Al entrar en una IS se des4a!ilita el !it KIE a no ser que indiquemos lo contrario y al salir se 4a!ilita. En nuestro programa tenemos , !otones y por tanto de!eremos confgurar una interrupci#n para cada uno si usamos las interrupciones e2ternas o tam!i0n podemos seleccionar una misma interrupci#n para los tres utili?ando las Pin On +4ange Interrupt luego tendremos que leer los !otones uno a uno para determinar cu%l 4a sido pulsado. En este caso se van a usar las interrupciones e2ternas. +uando se pulsa un !ot#n no se pasa de uno a cero o viceversa en el momento si no que tenemos re!otes podemos tener una seal compuesta por varios pulsos de ; y 8 que pueden 4acer saltar a la interrupci#n varias veces lo mismo al soltar el !ot#n que mantenemos pulsado. Para ello lo me1or es aadir electr#nica adicional para eliminar los re!otes como puede ser un fltro + o varios circuitos que se pueden encontrar !uscando un poco diseados para tal fn. En este caso no 4ay electr#nica adicional por lo que la Mnica opci#n que tenemos es eliminarlos por so"tare para ello se puede 4acer un delay de ,8T N8 ms en la IS de tal "orma que cuando salgamos de la interrupci#n y 0sta est0 otra ve? lista para ser disparada los re!otes ya 4an desaparecido. En los P+*s fnales 4a!r% electr#nica adicional en los !otones para eliminar los posi!les re!otes no cuesta nada 4acerlo y "acilitamos la programaci#n y cuando tenemos un programa comple1o con varias interrupciones y muc4os tiempos cuanto m%s "acilitemos el programa me1or. Para compro!ar el "uncionamiento de lo anterior un e1emplo sencillo' Ginclude Davr/io.4\ Gdefne QU+P ;=888888L Ginclude Dutil/delay.4\ Ginclude Davr/interrupt.4\ Ginclude Flcd.4F //*otones del L+& interrupciones e2ternas. //Gdefne !oton; PO&- //I38 //Gdefne !oton- PO&, //I3;
void !otonesUiniciali?ar()
//Iniciali?ar Jard y confgurar interrupciones.
int main(void) Z lcdUiniciali?ar() !otonesUiniciali?ar()
c4ar linea;]^CFProyecto QireQlyF c4ar linea-]^CFPulse un !oton paraF c4ar linea,]^CFcomen?arF posicionarUcursor(;,) lcdUescri!ir(linea;) posicionarUcursor(,;) lcdUescri!ir(linea-) posicionarUcursor(N9) lcdUescri!ir(linea,)
4ile(;) Z [ [ void !otonesUiniciali?ar() //+onfgurar registros del micro. Z //ipo de evento que dispar% la interrupci#n ;8 Wanco de !a1ada. EI+A >C (;DDIS+-8) //I38EI+A BC (;DDIS+-;) EI+A >C (;DDIS+,8) //I3; EI+A BC (;DDIS+,;) EI5SX BC ((;DDI38)B(;DDI3;)) //Ja!ilitar interrupciones e2ternas 8 y ;. sei() //Ja!ilitar todas las interrupciones [ //ISs. utinas de atenci#n a las interrupciones. IS(I38Uvect) Z c4ar linea]^CFPulsado !oton ;F lcdUcomando(828;) //Limpiar pantalla L+&. posicionarUcursor(;,) lcdUescri!ir(linea) // UdelayUms(N8) //e!otes [ IS(I3;Uvect) Z c4ar linea]^CFPulsado !oton -F lcdUcomando(828;) //Limpiar pantalla L+&. posicionarUcursor(-,) lcdUescri!ir(linea) // UdelayUms(N8) //e!otes
[
El programa tiene un Ginclude Flcd.4F en el que est%n las "unciones necesarias y Gdefnes para el control del L+&. Lo primero que de!emos 4acer es confgurar el 4ardare del pic de esto se encarga lcdUiniciali?ar() que confgura los puertos como entrada/salida que necesita para "uncionar para los !otones no tenemos que tocar ningMn puerto ya que por de"ecto est%n todos confgurados como entradas lo que si tenemos que 4acer es confgurar los registros del microcontrolador para 4a!ilitar las interrupciones e2ternas. En los !its de E+IA y EI+* seleccionamos que las interrupciones e2ternas 8 y ; (las que vamos a usar) se disparan cuando tenemos un Wanco de !a1ada en la entrada es decir cuando se pulsa el !ot#n pasando de ; a 8 si no confguramos estos !its por de"ecto estar$an en 88 la interrupci#n se disparar$a cuando tengamos un nivel !a1o en el pin y de esta "orma estar$amos entrando repetidamente a la interrupci#n mientras mantuvieramos el !ot#n pulsado. Luego se 4a!iltan las interrupciones en EI5SX poniendo a ; el !it de las que queramos que est0n activas y por Mltimo se 4a!ilitan todas las interrupciones del micro con las instrucci#n sei() que pone a ; el !it 9 (KIE) de SEK. En el programa principal se escri!e la pantalla de presentaci#n en el L+& y pasa a un !Mcle infnito del que s#lo se puede salir mediante una interrupci#n e2terna disparada por los !otones cuando ocurre la interrupci#n saltamos a su IS (aqu$ defnimos su c#digo) y 0sta se encarga de limpiar la pantalla y escri!ir un mensa1e en "unci#n del !ot#n pulsado y cuando fnali?a vuelve al !ucle principal. n e1emplo sencillo que sirve para compro!ar que las interrupciones se est%n produciendo de "orma correcta en este caso no estamos 4aciendo nada "uera de las interrupciones pero en un programa normal de!emos salvar todos los registros que se puedan modifcar dentro de la IS y usemos "uera de ella para luego restaurarlos y que el micro siga con su e1ecuci#n de instrucciones de "orma correcta. Jasta aqu$ con las interrupciones que aMn queda muc4o m%s de ellas...
Reo& Con'%uraci(n. Se tienen di"erentes "uentes para generar la seal de relo1 en el 5+ y a la ve? la seales de relo1 se distri!uyen por los di"erentes m#dulos.
La unidad de control del relo1 e encarga de generar di"erentes seales de relo1 y distri!uirlas a los di"erentes m#dulos las di"erentes seales de relo1 son' _ cl+P' uteado al nMcleo AH incluyendo al arc4ivo de registros registro de Estado 5emoria de datos apuntador de pila etc. _ clQLASJ' Seal de relo1 suministrada a las memorias QLASJ y EEPO5. _ clA&+' elo1 dedicado al A&+ el A&+ tra!a1a a una "recuencia menor que la +P con el o!1etivo de reducir el ruido generado por inter"erencia digital y me1orar las conversiones. _ clI/O' Es la seal de relo1 utili?ada por los principales m#dulos de recursos' empori?adores inter"a? SPI y SA. Adem%s de ser requerido por el m#dulo de interrupciones e2ternas. _ clAS`' Esta seal de relo1 es as$ncrona con respeto al resto del sistema y es empleada para sincroni?ar al tempori?ador - el m#dulo que genera esta seal est% optimi?ado para mane1arse con un cristal e2terno de ,-.9= J?. Qrecuencia que permite usar al tempori?ador como un contador de tiempo real aMn cuando el dispositivo est% en algMn modo de reposo. _ La "uente de relo1 se selecciona con N !its de confguraci#n internos (no corresponden a algMn registro). Se tienen las opciones'
_ Estos !its se de!en defnir durante el proceso de programaci#n del microcontrolador. _ E2isten otro par de !its (S Set up ime) que 1unto con los !its +XSEL defnen un retardo inicial en la operaci#n del oscilador despu0s de un reset
+ristal de *a1a Qrecuencia E2terno. _ Para usar un cristal de ,-.9= X4? el cual proporciona la !ase para un contador de tiempo real de!e usarse +XSEL C 6;88;7. _ Programando +XOP se utili?an los capacitores internos. En caso contrario se recomiendan capacitores con un valor nominal de ,= pQ. _ Los tiempos de esta!lecimiento para esta opci#n son'
)sciador RC E#terno. _ La "recuencia se determina como " C ;/(,+). _ + de!e ser al menos de -- pQ.
_ Los tiempos de esta!lecimiento !a1o estas opciones son'
Oscilador + +ali!rado Interno. _ Se considera un volta1e de @.8 volts y una temperatura de -@ +.
_ Sus tiempos de arranque'
&espu0s de algMn modo de !a1o consumo el retraso es de = ciclos de relo1. Sistema de elo1 (A5ega,-p). _ Similar a los otros dispositivos la selecci#n se reali?a con los "usi!les +XSEL teniendo las siguientes opciones'
_ El A5ega,- incorpora al "usi!le +LX&IH para dividir la "recuencia del oscilador entre . _ am!i0n se cuenta con los !its S (Set up ime) para el retardo despu0s de un reset. _ El dispositivo se vende con +XSEL C 688;87 S C 6;87 +X&IH C 687 (687 es programado). Por lo que inicia tra!a1ando a ; 5J? con un retardo inicial de ;N+X b =@ms. E1emplo de Keneracion de ; segundo de retardo en teimpo usando el I5E so!re el Arduino no con A5ega,-P.
+alculando los ciclos necesarios para ; segundo. Qrecuencia de elo1 del A5ega,-P C ;=5J?. Qrecuencia de elo1 con preescaler +LX/;8-NC ;=5J?/;8-N C ;@=-@ J?. Periodo del elo1 con el Preescaler +LX/;8-N C (;@=-@ J?)T;C=.N;8T@seg. +iclos necesarios para ; seg C;@=-@T;C;@=-N ciclos C82,&8. El c#digo es el siguiente' =C#A ? 6F3<4 // Cargar el "te alto de #9$2G en el registro de comparación de salida =C#A ? 6F684 // Cargar el "te aHo de #9$2G en el registro de comparación de salida TCC#A ? 6666666664 TCC#B ? 66666##6#4 // Poner en el modo CTC " el preescaler de CI/#62G +*ile!#% *ile !!TJK# L !#11=CK#A%% ?? 6%4 // Si =CK#A es puesto a # !TCT# ? =C#A%: se rompe TJK# ? !#11=CK#A%4 >
*e+pori,aci(n Introducci(n
// impiar el ,alor =CK#A para el siguiente retardo de tiempo.
Los AH tienen una gama amplia de recursos internos. Se mencionaron ya las interrupciones e2ternas interrupciones por cam!ios en los pines I/O (A5ega,-) y se ver%n los tempori?adores. Las seales P5 se generan con algunos de los modos de operaci#n de los tempori?adores. odos los recursos son mane1ados por medio de los egistros I/O o egistros I/O E2tendidos (A5ega,-). Los egistros I/O E2tendidos no pueden ser accesados con instrucciones I3 o O. Para su acceso se utili?a SS (almacenamiento directo) para escri!irlos o L&S (carga directa) para leerlos. En lengua1e + s#lo se 4ace la asignaci#n al registro y al ensam!lar se genera el c#digo que me1or convenga. I5Es/+ontadores.
• •
•
•
•
•
•
• •
•
•
•
•
na la!or 4a!itual de los controladores suele ser la determinaci#n de intervalos de tiempo concretos. Esto se 4ace a trav0s de un elemento denominado empori?ador (imer). n tempori?ador !%sicamente es un registro de nT!its que se incrementa de manera autom%tica en cada ciclo de instrucci#n o cuando ocurre un evento e2terno. Si la "uente de tempori?aci#n es e2terna se le conoce como contador de eventos. El registro puede ser preTcargado para iniciar su conteo a partir de un valor determinado. +uando ocurre un des!ordamiento en el registro (una transici#n de ;Vs a 8Vs) se genera alguna seali?aci#n. En el caso de los microcontroladores AH pueden generarse otros tipos de eventos relacionados con el tempori?ador.
El 5icrocontrolador A5ega,-P tiene tres tempori?adores y mane1an tres tipos de eventos. Los eventos quedan registrados en el registro IQ (imer Interrupt Qlag egistrer).
E-entos en os *e+pori,adores. (So!reWu1o o des!ordamiento). El evento ocurre cuando el timer alcan?a su m%2imo valor (5AHAL) y se reinicia en cero. Se muestra como con la puesta en alto la !andera OHn (imer/+ounter OverWo).
+3n puede ser preTcargado con un valor entre 8 y 5AHAL para que la !andera OHn se genere a intervalos de tiempo. E-entos en os *e+pori,adores. (+oincidencia de comparaci#n ]+ompare matc4^). n registro puede ser cargado con un valor entre 8 y 5AHAL (O+n T Output +ompare egister) y es comparado con el valor del timer en cada ciclo de relo1 una coincidencia produce un evento. El evento se indica con la !andera O+Qn (Output +ompare Qlag).
Se puede confgurar al tempori?ador para que se reinicie despu0s de una coincidencia y algunas terminales relacionadas pueden a1ustarse limpiarse o conmutarse autom%ticamente en cada evento.
E-entos en os *e+pori,adores. (+aptura de entrada ]Input +apture^). +on el empori?ador ; es posi!le capturar eventos e2ternos un cam!io en la terminal I+PI provocar% que el timer sea le$do y almacenado en el registro I+n (Input +apture egister). Indicando el evento en la !andera I+Qn (Input +apture Qlag) pueden ser Mtiles para medir el anc4o de pulsos e2ternos.
Respuesta a os e-entos de os te+pori,adores. E2isten , "ormas de detectar eventos y actuar ante ellos.
ondeo /poin%0.
El programa principal evalMa de manera "recuente el estado de las !anderas. equiere un so!re mane1o de instrucciones e implica tiempo de procesamiento. E1emplo' Se espera un evento por des!ordamiento del imer 8. •
*a1o este esquema las !anderas se de!en limpiar por so"tare reescri!i0ndoles un ; l#gico.
Uso de Interrupciones. Para que los eventos de los tempori?adores generen interrupciones 0stas se de!en 4a!ilitar en el registro I5SX (imer Interrupt 5as egister) adem%s del 4a!ilitador glo!al de interrupciones (!it ; en SEK). El programa principal se e1ecutar% de manera normal y cuando ocurra un evento se dar% paso a la IS correspondiente. E1emplo' +onfgurar el timer - para que pueda detectar eventos de comparaci#n. •
En este caso las !anderas son limpiadas autom%ticamente por 4ardare.
Reacci(n auto+1tica sobre e-entos. •
•
Los timers ; y - (y el timer 8 en el A5egaT;=) soportan la posi!ilidad de reaccionar s#lo con 4ardare ante eventos de comparaci#n. Al gunas terminales relacionadas pueden ponerse en alto en !a1o o conmutarse de manera autom%tica. La atenci#n a eventos se reali?a de manera paralela a la e1ecuci#n del programa principal.
Preescaador. A la entrada de los tempori?adores se incluye un preTescalador !%sicamente es un divisor de "recuencia con di"erentes salidas conectado a un multiple2or. Los tempori?adores 8 y ; comparten al preTescalador pero con selecci#n independiente.
El tempori?adores - tiene un preTescalador independiente con la posi!ilidad de ser mane1ado por un oscilador e2terno.
*e+pori,aci(n e#terna Los tempori?adores 8 y ; permiten el mane1o de una seal e2terna para su incremento (8 # ;). En estos casos se les denomina contadores de eventos. Se puede confgurar para detectar Wancos de !a1ada o su!ida. Los eventos e2ternos se sincroni?an con la seal de relo1 interna por lo que no pueden tener una "recuencia m%2ima de " +LXIO/-.
P5 (5odulaci#n por Anc4o de Pulso).
A&+ +onvertidor (Anal#gicoT&igital).