You are on page 1of 31
os temporizadores — 189 6 — Lostemporizadores En muchas aplicaciones el microcontrolador debe trabajar con la varia- ble tiempo. Por ejemplo, para generar sefiales de una determinada frecuencia, para medir Ja duracién de una sefial, o simplemente para llevar la fecha y la hora, el microcontrolador necesita algtin recurso para contar el tiempo con precision, En los microcontroladores PIC de clase media hay hasta tres médulos Ibdsicos para temporizar, que se identifican con los nombres Timer0, Timerl y Timer2, Todos los PIC disponen al menos de! Timer0, Algunos PIC tienen ‘uno 0 dos médulos adicionales para temporizar, que amplian las posibilida- des de los médulos basicos. Son los denominados médulos de Comparacion, Captura y Modulacién Pulsos en Anchura, om6dulos CCP (Capture/Compare/ PWM), que comparten componentes y funciones con el Timerl y el Timer2. En este capitulo se estudia la estructura, funcionamiento y programa- cién de cada uno de los médulos disponibles en los microcontroladores PIC para trabajar directamente con la variable tiempo. El capitulo incluye varios ejemplos ilustrativos del funcionamiento y programacién de estos médulos. 6.41 Los temporizadores en los microcontroladores PIC Cada uno de los temporizadores disponibles en un PIC de clase media tiene, como elemento esencial, un contador sincronico ascendente de 8 6 16 bits. Estos contadores se pueden programar para contar pulsos intemnos 0 externos, segiin se expondra mas adelante al estudiar cada temporizador por separado. El nimero almacenado en cada contador (valor de la cuenta) se puede leer o modificar mediante la lectura o escritura de registros de fun- ciones especiales asociados al temporizador en cuestion. El desbordamiento de los contadores queda reportado en bits indicadores disponibles en esos registros, y puede generar también una solicitud de interrupcién al micro- controlador. Los temporizadores pueden disponer de un contador asiner6nico auxi- liar, Este contador auxiliar se inserta en el camino de los pulsos, antes del contador principal, en cuyo caso funciona como un pre-divisor (prescaler) © después del contador principal, funcionando entonces como post-divisor (postscaler). Los temporizadores Timer0 y Timerl tienen solamente un pre- divisor; el Timer2, en cambio, dispone de un pre-divisor y un post-divisor. La figura 6.1 muestra el esquema general de los médulos para temporizar 190 — Microcontroladores PIC ‘Timer, Timer] y Timer?, cuyas principales caracteristicas se resumen en la tabla 6.1 y se estudian a continuacion. ' RZ. l LY, Desborcemiento uso | ipl pn “| ron oe Seca ol ena Pra Figura 6.1 Esquema de bloques general de los temporizadores de los PIC de clase media. Todos tienen un coniador principal ascendente de 8 6 16 bits y un pre-divisor programable. El Timer2 tiene también un post-divisor. Los pulsos que se van a Conttar pueden ser internos o extermos. El desbordamiento se reporta en un bit de in rst de fcions species y pute generar una sali deinterapein al PIC, Tabla 6.1 Caracteristicas principales de los temporizadores de los PIC de clase media. Predivicr | Postdlvisor | SFR donde est Temerizador | Tamato | qvide ene: __| sivideentre:__| ta cuenta Desbordamlento Ted | apis | 2.4. 258 NO. "THRO BAT de OPTION, Timert | febis | 1.2.4.8 NO. TRI, TWRIL_[iUTHRIF de PRE Tine |“ sbts 148 12, 18 THR2 | BUTWRAIF de PIR 6.1.1 ElméduloTTimerd EI médulo Timer0 consta basicamente de un pre-divisor y un contador ascendente de 8 bits (figura 6.2). El pre-divisor es un contador asincrénico ascendente con factor de division programable cuyo conteo no es visible para el programador. El contador ascendente de 8 bits se puede leer o escribir a través del registro de funciones especiales TMRO. se} ee 4 Preece = . 2.408258 Tose Toes Pszpso PSA. Figura 6.2 Diagrama de bloques del Timer0, El TimerO puede trabajar como contador de ciclos de miquina (mado temporizador, TOCS = 0) 0 como contador de pulses externos (modo contador, TOCS = 1). TMRO es tn contador ascendente de 8 bits, ‘cuyo desbordamiento action el indicador TOIF del registro INTCON. Antes de egar « TMRO, los pulsos son sincromizados con el reloj del microcontrolador y pueden pasar 0 no por un pre-divisor cuyo factor de division es programable. Los temporizadores — 191 El Timer0 puede trabajar como contador de ciclos de maquina o como contador de pulsos externos. En el primer caso se dice que el médulo opera en el modo temporizador (timer). Si cuenta pulsos externos, el médulo ope- ra en el modo contador (counter). Los pulsos externos legan por el terminal TOCKI. ‘A su paso por el Timer0, los pulsos Hlegan al bloque de sincronizacién. En este bloque, los pulsos que entran son muestreados en dos instantes de tiempo dentro de cada ciclo de maquina, de lo que resulta una seftal cuyos flancos ocurren en fase con el reloj del microcontrolador. Con esta seftal sin- cronizada se excita el contador TMRO. Para que no se pierdan pulsos en la sincronizacién, es necesario que los pulsos que entran en el bloque de sin- cronizaci6n permanezcan en 1 0 en 0 al menos durante la mitad del tiempo que dura un ciclo de maquina. Cuando el Timer) trabaja en el modo conta- dor, el bloque de sincronizacién determina el valor minimo del periodo (0 la frecuencia maxima) de los pulsos que entran por el terminal TOCKI. Si Tose es el perfodo del oscilador principal del microcontrolador y P es el factor de ivision del pre-divisor, el perfodo Ti de los pulsos que entran por el terminal TOCKI debe cumplir og P (6.1) si nose usa el pre-divisor y P = 2, 4, .... 256 si se usa, Ti> donde P En el modo de bajo consumo, el oscilador de! microcontrolador se pa- raliza y por lo tanto no funciona el bloque de sincronizacién del Timer0, de manera que el Timer0 tampoco funciona mientras el microcontrolador esta en dicho modo. Hay tres registros de funciones especiales asociados al Timer0: TMR0, OPTION e INTCON. La figura 6.3 muestra los nombres de los bits de los re- gistros OPTION e INTCON. El registro TMRO almacena el valor que tiene el contador del Timer0. Este valor se puede leer o escribir en cualquier momen- to desde el programa que ejecuta el microcontrolador. Cuando se escribe un valor en TMRO, la cuenta del pre-divisor, si esta asignado al Timer0, se pone 0, Ademés, una escritura en el registro TMRO inhibe el conteo del Timer0 durante dos ciclos de maquina. Eldesbordamiento del Timer hace quel indicador TOIF (bitINTCON<2>) ppase a 1. Sila atencién al Timer0 se hace usando la técnica de E/S programada, entonces se debe consultar el bit TUIF para saber si el Timer0 se ha desbordado, 192 —Microcontroladores PIC Una vez comprobado el desbordamiento, este indicador debe ser puesto a 0 por software, OPTION 6 7 6 4 0 RBPU# | INTEDG [TOCST TOSE [ PSA T PS2 J PST T PSO) INTCON 7 6 so 43 1 0 (Gie“T_PEIE [TOE J INTE | RBIE [TOF] INTE [RBIE Figura 63. Registros de funciones especiales OPTION ¢ INTCON. En OPTION estén los bis de configuracin del TimerO: TOCS cinfigura al TimerO como temporizador o.como contador; TOSE configura el flanco de a seal externa com el que se incre- ‘menta el Timer0 si ha sido programado como contador; PSA asigna el pre-divisor Timer0 o al Perro Guartin y PS2, PS1 y PSO programan el factor de division del prestivisor. En INTCON esti el indicador de desbordamiento del Timer: TOI; com el bit TOIE se habitita la solcitud de interrupeién al microcontrolador por esta cms. Si la interrupcion del Timer0 esta habilitada, lo cual se hace poniendo a1 el bit TOIE (INTCON), cuando se desborda el Timer0 se produce una solicitud de interrupcion, Enel registro OPTION estan los bits de control del Timer0. La fuente de los pulsos de reloj se selecciona con el bit TOCS. Si se selecciona una fuente de reloj externa en el terminal TOCKI, el bit TOSE sirve para hacer que el conta- dor se incremente con los flancos de subida (con TOSE = 0) 0 de bajada (con ‘TOSE = 1) de los pulsos en TOCKL. EI Timer y ef WDT comparten el pre-divisor, en un esquema como el que se muestra en la figura 64. El pre-divisor, un contador asincrénico ascen- dente de 8 bits, puede ser asignado al Timer0 0 al WDT. Esta asignaci6n es excluyente, es decir, si el pre-divisor se asigna al WDT, el Timer) nolo puede usar y viceversa. Cuando esté asignado al WDT, el pre-divisor funciona como post-divisor del Perro Guardian. Elpre-divisorse asigna al Timer0 poniendoa 1 el bit PSA (OPTION<3>). Si PSA es puesto a 0, el pre-divisor queda asignado al WDT. El factor de di- vision del pre-divisor asignado al Timer0 se selecciona con los bits PS2, PSI y PSO del registro OPTION. Los temporizadores — 193 muro wore PA Figura 64 El pre-divisor se puede asignar al Timer0 oal Perro Guardin (WDT): con PSA = O se asigna al Timer0 y con PSA = 1 al WD Con et desbordamiento del TimerO (cuando éste pasa de FFI: a 00), se activa el bit TOIF del registro INTCON. TOSE, TOCS, PSA y PS2:PS0 son bits del registro OPTION. WDTE es uno de los bits de configuracign del PIC, con el que se hablita el funcionamiento del WDT. El factor de division P del pre-divisor asignado al Timer0 puede tomar los valores: P=2,4,8, (62) donde 1 = 0, 1, .., 7 es el valor situado en los bits PS2:PS0. Siel pre-divisor es asignado al WDT, el factor de division es entonces P £12,404, 2%, uy 128 (tabla 2.1). Para calcular el tiempo de desbordamiento del Timer0 se puede pro- ceder de la forma siguiente. Sea N la cantidad de pulsos que deben llegar al Timer0 para que se desborde, P el factor de division del pre-divisor y Ti el perfodo de los pulsos de entrada al pre-divisor. Si el Timer0 opera como tem- porizador, entonces Ti es la duracién de un ciclo de maquina; si opera como contador, Ti es el periodo de los pulsos externos. El tiempo Td que tarda en. desbordarse el Timer0 es Td=PXNX Ti (63) Debe tenerse en cuenta que el valor que se carga en el registro TMRO no es N, sino su complemento a 2en 8 bits, es decir, lo que le falta aN para llegar a 256. Por lo tanto, el valor que se carga en TMRO debe ser Nyygp = 256 — N (64) 194 — Microcontroladores PIC Si el Timer0 esta trabajando en el modo temporizador, es decir, como contador de ciclos de maquina, entonces hay que tener en cuenta que el con- teo se inhibe durante dos ciclos de maquina después de haber escrito un valor en el registro TMRO. Por lo tanto, para compensar esa demora, el valor que hay que depositar en TMRO en este caso debe ser Noga = 256 — N+ 2 (65) Obsérvese que si el valor Niygp Se carga en el registro TMRO cada vez que ocurre el desbordamiento, entonces el Timer0 trabaja como un contador/ temporizador con médulo N. Ejemplo 6.1 Uso del TimerO para programar demoras. En este caso el Timer opera en el modo “temporizador’, pues los puisos de relo|provienen del oscilador principal del microcontroladoryIegan al temporzador con una frecuencia Foscl4, donde Fosc es la frecuencia del osclador principal del PIC. E siguiente programa lustra obmo iiiar (rtina InicTime0) la operacion de Timer0 en este mado, asig- rndol ol pre-dvisor con un factor de dvsin de 8, La rutin Demtms crea una espera (aproximada) de ‘1ms, La rutna Dems realiza una espera de N mlsegundos (N 5 255) ; Uso del Timer y su pre-cvisor para lograr demoras. | Hardware Frecuenca del osclador del PIC: 4 MHz portant a dracon de un cio de {maquina (CM) es Tom = 1 ys. + Valores que hay que situar en el pre-dvisor y en TMRO para logrr una demora de 1 ms: ; 1 ms = 1000 41, pero 1000 = 8 x 125, y porlo tanto en el pre-divisor se puede ;siuar el valor P= 8 y en TMRO el complemento 2 de 125 mas 2. {Es decir ue TMRO = 256 - 125 + 2= 133, List F873 include "P16F873.INC™ AUX equ 0x20 + Variable aux, }Inicimer0: Rutina para programar el TimerO como temporizador con un i pre-visor de 8 InicTimera bef INTCON, TOIE —_; inhabilitarinterrupcion de Timer. bst STATUS, RPO; Seleccionar banco 1 de ia memoria de datos moviw OxC2 ¥ configurar el TimerO como temporizador con un Los temporizadores — 195 move! OPTION REG; pre-visor de 8. bof STATUS, RPO; Seleccionar banco 0 de la memoria de datos af = TMRO + Poner 0 en registto TMRO. bof INTCON, TOIF_—_; Poner en 0 el indicador de desbordamiento 5 sf INTCON, TOIE —_; Aqui se puede habiltar a interrupcién de Timerd + Si setrabaja por interupain. return :Demtms: Ruta para crear una demora de 1 ms. i Entadas: ninguna : Salidas: ninguna, Demtms: moviw 133 } Complemento 2 de 125, mas 2, valor con movet THRO el que se carga TMRO, Demtms_01 bliss INTCON, TOF ,TOF= 1? goto Demtms_01 No esperar. bof INTCON, TOF; Si-hacer TOI =0y retum $etomar pues ha ranscurido 1 ms ;DemS00ms: Runa para crear una demora de N milisegundos (N <= 5 Esta rtina lama N veces a larutina Demims. : Eniradas: en W el valor de N. : Salidas: ninguna, 55) DemNms: movwt AUX Poner en AUX la demora en miisegundos. Demis. 01 lamar a Demms N veces: cal Demis + Esperar 1 ms. decfsz AUX. Decrementar AUX. ,AUX = 0? goto DemNms.01 _; No- seguir esperando. retum + SI-retomar pues han ranscurrdo WN miisegundos, end 64.2 Emédulo Timert El Timerl es un segundo médulo disponible para temporizar en mu- chos microcontroladores PIC de clase media. Su estructura se muestra en la figura 6.5. El Timerl consta fundamentalmente de un contador ascendente de 16 bits precedido por un pre-divisor programable con factor de division de 1, 2, 4u8. TrewPst-T1CKeS0 Temnct ‘THoSceN ae a) SR ‘muri0n—| est el madi OOP) Figura 65 Diagrama de bloques del Timer El Timer] puede operar como temporizador (al contar ciclos de maqui- na) 0 como contador (si cuenta pulsos externos). Como contador, el Timer1 puede ser programado para que trabaje en modo sincronizado 0 en modo no sincronizado. Para ello se usa el bit TISYNC# del registro TICON. Si TISYNC¢# = 0, el Timer! trabaja como contador sincronizado, pues los pulsos de entrada al contador TMRI1 pasan por el bloque de sincronizacién. En este bloque se muestrea la sefial entrante y se sincroniza con el reloj interno del microcontrolador, de lo que resulta una sefial cuyos flancos ocurren en fase con el reloj principal del PIC. La sefial ya sincronizada excita el contador de 16 bits TMR1, formado por los registros TMRIL y TMRIH. Para que no se pierdan pulsos en la sincronizacién, es necesario que los pulsos que entran en el bloque de sincronizacién permanezcan en 1 0 en Oal ‘menos durante la mitad del tiempo que dura un ciclo de maquina, Ello deter- mina el valor minimo del periodo de los pulsos que entran en el Timerl en el modo contador sincronizado. Los modos sincronizado y no sincronizado se aplican sélo al trabajo del Timerl como contador, pues cuando este médulo opera como temporizador, Io hace obviamente en modo sincronizado. De hecho, el bit TISYNC# se ig- nora si el Timer] se programa como temporizado con TMRICS = 0. Si T,,.€s el periodo del oscilador principal del microcontrolador y P es el factor de division del pre-divisor (P = 1, 2, 4,8), entonces el periodo Ti de los pulsos en TICKI debe cumplir i> Tee (oo) Los temporizadores — 197 Siel Timer esta programado como contador nosincronizado (TISYNC# = 1), contintéa operando incluso cuando el microcontrolador esté en el modo de bajo consumo. Esta caracteristica del Timer1 lo hace apropiado para im- plementar con él un reloj de tiempo real (RTC: Real Time Clock). El valor del conteo se puede leer y/o escribir en los registros de fun- ciones especiales TMR1H y TMRIL. Cuando se escribe en estos registros, la cuenta del pre-divisor va a 0. En el registro TICON estan los bits de control del Timer1. La fuente de los pulsos de reloj se selecciona con el bit TMRICS y puede ser interna o externa. Si se selecciona el reloj externo, éste puede ser pulsos que entren por el terminal T1CKI/T10SO 0 también puede colocarse un cristal entre los ter- minales T10SO y T10SI. El bit TIOSCEN sirve para habilitar el oscilador si se usa un cristal. Con el bit TMRION se habilita el conteo. El valor 1 (7 = 0, 1, 2, 3)) de los bits TICKPS1 y TICKPSO del registro TICON fija el factor de division P (P = 1, 2, 4, 8 = 2") del pre-divisor del Ti- ‘mer1. Por ejemplo, si se quiere un factor de division de 8, hay que poner el valor 3 en los bits mencionados. El desbordamiento del Timer] hace que el bit TMRUIF pase a1. TMRUF es un bit del registro PIRI. Debe ser puesto a 0 por software. Si la interrup- cién del Timer! esta habilitada, lo cual se hace poniendo a 1 el bit TMR1E (PIE1), el desbordamiento genera una interrupcién. TICON 7 6 5 4 3 204 0 [ TiGRPSE | TEKPSD [ TIOSGEN | THSYNOH | THRICS | THRION Figura 66 TICON: registro de control del Timerl. El cdlculo del tiempo de desbordamiento del Timerl sigue un razona- miento semejante al utilizado en el Timer0.Si N es la cantidad de pulsos que deben llegar al contador de 16 bits (TMR1) para que éste se desborde, P el factor de division del pre-divisor y Ti el perfodo de los pulsos de entrada, el tiempo Td hasta que el Timer se desborda es Td=P x NX Ti (67) En la pareja de registros TMRIL y TMRIH se carga el complemento 2 de N en 16 bits, es decir, Nova _ N= 65536 ~ N (68) 198 — Microcontroladores PIC Si el Timerl se deja correr libremente, entonces, de modo natural, N 2! En este caso, Td=2%x PX Ti 69) Ejemplo 6.2 Programacién del Timer’. En este ejemplo se usta: -Cémo programar el Timert como contador asincrénico de pulsos externas. -Cémo escribir un rimero binaro de 16 bts en los registros TMRIL y TMRIH. -Cémo leer de forma segura los registros TMRL y TMRTH, List p=16F873, indude “P16F873.INC* AUX H equ 0x20 :Narabe auiier AUXL equ 0x21 :Narabe auiier InicTimert: Rutina para programar e!Timert 0 como contador asnerénico ‘de puisos externas con pre-divisor de 8. InicTimert af TICON + Timert como temporizador, detenido, pre-ivisor = 1. bsf STATUS, RPO; Seleccionar banco 1 bef PIE, TMRIE —_;Inhabiltarinterupciin del Timert bef STATUS, RPO; Seleccionar banco 0. crf TMRIH + Poner 0]en TMRIH, af TMRIL + Poner 0 en TMRIL, bef —PIR1, TMRIIF__; Indicador de desbordamiento en 0. movw 0136 + Timert como contador no sineronizado con P = 8, movwt TICON TIOSC inhabiltado, Timert detenido sf TICON, TMRION + Iniciar el conteo del Timert return | WR_TMRte: Rutina para escribir un nimero binario de 16 bits en el Timert N: mot NIL, W subwt CCPRIL,W moves NL. btiss STATUS,C goto Restat goto Restad Restat dec CCPRIH, Resta movt NIH, W subwt CCPRIH,W movi NH return end 6.2.2. Modo comparador La figura 6.12 muestra el esquema de bloques del médulo CCP ope- rando en el modo comparador. En este modo se esta comparando el valor cambiante del Timer] con el valor almacenado en los registros CCPxRH y CCPxRL; cuando ambos valores son iguales, el resultado de la comparacién ¢s positivo y se genera un determinado evento, que depende de lo que haya sido programado en los bits CCPxM3:CCPxM0 del registro CCPxCON, se- giin se muestra en la tabla 6.4 comet come | _coPRM ese Tart a Ter [ nm] ccraecome ates Figura 6.12. Médulo CCP como comparador. Si el valor en el registro CCPRx es igual al valor enel par TMRI, se genera un evento por el terminal CCPx. Las caraceristcas del evento se programan con los bits CCPxM3:CCPxMO del registro CCPxCON. Los temporizadores — 209 Los eventos que se pueden programar consisten en la puesta a00.a1 del terminal CCPx y el reset del Timer. Si se usa el terminal CCPx, entonces debe ser configurado como salida poniendo a 0 el bit correspondiente del registro TRIS del puerto paralelo donde se encuentra el terminal CCPx, que normalmente es el puerto C. En todos los casos, cuando el resultado de la comparacién es positivo, el bit CCPxIF del registro PIR es puesto a 1. Este bit puede ser consultado por programa. Si la interrupcién del médulo CCP esta habilitada (mediante la puesta a 1 del bit CCP2IE del registro PIE), se genera ‘una solicitud de interrupcién. Uno de los eventos que se puede generar cuando el resultado de la com- paracién es positivo es la puesta a 0 (reset) del Timerl. Esta opcion aumenta las posibilidades de ese temporizador, ya que entonces puede trabajar como un temporizador de 16 bits cuyo médulo de conteo es el valor de los registros CCPReH y CCPRxL del médulo CCP. Ejempl 6. Uso de Timert como temporizador de 16 bts empleando os registos CCPR1H y CCPRIL para almace- ta el médulo de conto. Para ello se programa el duo CCP en mado comparador, usando lavaian- te de generar un reset al Timer! cuando la comparacién entre los regisros CCPR1 (CCPRIH{CCPRIL) Y TMR# (TMR1H:TMRL) sea psiva. En est ejemplo, el Tert se programa como temporzado, con Un factor de division de 1 para su pre-visoc ‘Acontnvacin se da stad dela programacin en ensamblador. List p=16F873, inde “P16F873,INC* ‘ric. compara: Rutina para progremar el médulo CCP! en modo comparador + con al eset el Timer al ser posiva a comparacio, No se utiiza el :terminal CCP1.E1Timert se programa como temporizador, con pre-visor = 1. Ini compara cif TICON + Tmert como tempoizador,pre-divsor=1,detenido. cif CCPICON Reset al midulo COP bef STATUS, RPO; Seleccionar banco 1. bof PIE, TMRYIE inhabit interupeon dl Timer bof PIE, CCPIIE Inhabit interupcon del médulo COPY bof STATUS, RPO; Selecionar banca 0. of PIRT + Poner a Olas banderas de interupcion mow 0x08 + Seleccionar modo comparador, con reset al Timert, movt CCPICON sf TICON, TMRION : Iniciar conteo del Timert return ‘Compara: Esta rutina espera a que la comparaciin hecha en el médulo CCP 210-—Microcontroladores PIC + programado como comparador, sea postva. En este modo se comparan os registros SCCPR1 (CCPRIH y CCPRIL) y TMR® (TMRIH y TMRIL). Cuando CCPR1 = TMR', el resultado de le comparacin es postvo y termina larutina Entradas: En CCPR1H y CCPRIL, el médulo de conteo del Timer! Compara: bifss PIRI, CCPIIF ; {CCPRI = TRI? goto Compara No esperar. cf PIR', CCP1IF_—_ Si-poner a0 el indicador de comparacion. return Retomar. nd 623 Modo PWM En el modo PWM (Pulse Width Modulation), cada médulo CCP y el Ti- mer2 forman un modulador de pulsos en anchura con salida por el terminal CCPx del médulo. Una seftal PWM es un tren de pulsos de duracién T,., variable y perfo- do Tconstante (figura 6.13). Figura 6.13 Sefial PWM. La duracién de los pulsos es variable (TT) pero el periodo T es constante Para caracterizar un tren de pulsos periédicos se utilizan los términos Ciclo de trabajo, ciclo activo, o ciclo stil (duty cycle), que se define como el porcen- taje del perfodo durante el cual la seftal permanece en 1, es decir, Ciclo de trabaj (6.12) 7 Asi, por ejemplo, si los pulsos estan la mitad del tiempo en 1, el ciclo de trabajo es del 50 %; si los pulsos estan todo el tiempo en 1, el ciclo de trabajo es del 100 %, En una sefial PWM, el ciclo de trabajo varia de acuerdo con la sefial moduladora. Los temporizadores— 211 Otro parémetro utilizado para caracterizar una sefial PWM es la resolte- cin, En los sistemas digitales, el tiempo es normalmente una variable discre- ta, de modo que en una sefial PWM generada por un sistema digital, la du- racién T.,, de los pulsos no varia continuamente, sino a saltos, en intervalos discretos de tiempo AT.,),.. Sieste intervalo es un submiiltiplo del periodo T de la sefial, la duraci6n T,,. de los pulsos en una sefial PWM puede tomar s6lo los siguientes valores discretos: Toy = 0, AT oy 2AT oy SAT oy 04 T (6.13) La cantidad R de veces en que se puede subdividir el perfodo T define la resoluci6n de la sefial PWM, it Tow Si este cociente es una potencia de 2, es decir, R = resolucién expresada en bits, (6.14) ", entonces res la IgR Ig2 Laresolucién r de una sefal PWM da la cantidad de bits necesarios para determinar cualquier posible duracion T,,,. de la sefal. Es una medida de la cantidad de partes en que se puede dividir la duracion de los pulsos PWM. Por ejemplo, si R = 1024, la resolucién de la sefial PWM es de 10 bits. Esto significa que la duracién T,, de los pulsos PWM se puede variar a saltos, con un paso de T/R unidades de tiempo. En un médulo CCP programado como modulador de ancho de pulsos, el periodo T de la seal PWM esta determinado por el valor del registro PR2 del Timer2. Dentro de cada periodo, el tiempo T,,, durante el cual la seftal PWM permanece en 1, esta determinado por los bits DCxB9:DCxB0. Estos bits se distribuyen entre los registros CCPRrL y CCPxCON de la siguiente forma: del registro CCPRxL se toman sus 8 bits, para formar los 8 bits de mayor peso, nombrados DCxB9:DCxB2; del registro CCPxCON se toman los bits CCPrCON<5:6>, que entonces constituyen los dos bits de menor peso, nombrados DCxB1:DCxBO. La figura 6.14 muestra la configuracién que adquieren los médulos CCP junto al Timer? en el modo PWM. El funcionamiento es el siguiente. Se com- para el valor almacenado en el registro PR2 con el valor cambiante de TMR2. Cuando ambos valores son iguales, significa que ha transcurrido el tiempo (615) 2 Microcontroladores PIC correspondiente a un periodo T de la sefial PWM. Entonces se realizan varias acciones: + Blregistro TMR2 es puesto.a 0 en el siguiente ciclo de maquina, + Laentrada$ del biestable RS se activa y con ello su salida Q pasa a1. Por lo tanto, si el terminal CCPx esta programado como sali- da mediante el bit correspondiente del registro TRIS, pasa tam- biénal. * El valor situado en los bits DCxB9:DCxBO se carga en CCPRxH y en dos bits internos del médulo. Este valor es proporcional a la duraci6n Ty de los pulsos de la seftal PWM. pcre80c180 — coPxconcsit> conga Mt a _ ol, me ioe o Figura 6.14 Médulo CCP trabajando como modulador de pulsosen anchura, La seal PWM. ‘se puede obtener en el terminal CCPx del médulo, El periodo de la serial queda determinado por el valor N depositado en el registro PR2 del Timer2 y la duracion de ls pulsos la define el valor M formado por los bits DCxB9:DCxB0. Realizadas estas acciones, se inicia un nuevo perfodo de la sefial PWM. El valor DCxB9:DCxBO, proporcional al ciclo de trabajo de la seal PWM, es ‘comparado con el valor cambiante de TMR2 (més dos bits internos). Cuando Los temporizadores — 213 ambos valores son iguales, la entrada R del biestable RS se activa y con ello la salida Q pasa a 0. Si el terminal CPx ha sido programado como salida, pasa también a 0. La sefial PWM resultante y sus pardmetros se muestran en a figura 6.15. [tre 0 TwR2= Mt T~PRO+T de la sefial PWM generada por el meédulo CCP. El ciclo de trabajo de la senal PWM est determinado por el valor M de los bits DCxB9:DCxBO, mientras que el periodo de ta sei! lo determina el valor N almacenado en PR2. El registro TMR2 se incrementa, en cada ciclo de muquina, desde O a N; al alcan- zar este valor, es forzado a O/en el ciclo de maquina siguiente, com lo que se inicia tun nuevo periodo de la seal PWM, La serial inicia su ciclo de trabajo cuarsdo el TMR2 es puesto a0, y finaliza cuando TMR2 alaurza el valor M. El perfodo (1) y la duracién (T,,,) de los pulsos en la sefial PWM se pue- den calcular mediante T=(N+1) x PX 4X Toe (6.16a) Toy= M X PX Tose (6.16b) donde N es el valor depositado en el registro PR2, M es el nimero formado por los bits DCxB9:DCxBO, P= 1, 4, 16 es el factor de division del pre-divisor del Timer? y T,.,. es el perfodo del oscilador principal del microcontrolador. Dado que M es un nimero de 10 bits, se puede expresar como M=4x M,+M, (617) donde M, es el ntimero de 8 bits almacenado en CCPRxL-y M, es el ntimero de2 bits almacenado en CCPxCON<5:4>. Si, por comodidad, para variar la duracién de los pulsos de la seftal PWM se quiere manipular sélo el registro CCPRiL, en- tonces se pueden mantener los bits M, en 0. De esta forma, si M, encuenta (6.16b) y (6.17), la duracién de las pulsos es Tog 4 Mg X PX Tose (6.18) Para determinar la resolucién de la sefial PWM obtenida, obsérvese que el tiempo de duracion de los pulsos PWM se puede dividir en M partes. Dado que M es un ntimero de 10 bits, se podria pensar que la resolucién del mo- 214 — Microcontroladores PIC dulador PWM es de 10 bits. Sin embargo, la resoluci6n real es menor pues el mayor valor que puede alcanzar M esta limitado por el valor N depositado en PR2, Por ello, la resoluci6n queda determinada realmente por N. Para cal- cular la resolucién del médulo PWM se procede asf. El valor mas pequefto de Toy que se puede obtener es ATog PX Tose (6:19) Por tanto, la cantidad de veces que este valor cabe en el perfodo T es (N+1)xPx4xT, R PT = Av4T) (620) Como (N+) es un ntimero de n bits (n= 1, 2, ... ,8), teniendo en cuenta (6.15), Ia resoluci6n en bits que se puede alcanzar es ren42 (621) Ejemplo 6.6 Programacién del médulo CCP1 de un PIC16FE73 para generar una seal PWM. Se desea una serial PWM con un periodo constante de 1 ms y cio de trabajo variable. El osclador principal det microcon- trolador es de 4 MHZ (Toye = 0,25 us). Elperiodo Tde la seal PWM se fja mediante el valor N depositado en el registro PR2. La duracén T,, e los pulsos queda deterrinaca por el valor M de os 10 bits dstrbuidos entre los 8 bi del registro CCCPRIL (que constituyen los 8 bits mis signifcatvos de M, es deci, M,) ys 2 bits CCPICON<5:4>, {que forman los 2 bits menos signifcaivos de M, es deci, M,. En este ejemplo, se quiere utilizar soo e! regjstto CCPRIL para far el valor de T,,, Los bits CCPICON se mantendrén permanentemente en0. Teniendo en cuenta que Tose 25 bs y T= 4 ms, en (6.16a) se obtiene que (N+ 1) x P= 1000 donde P es el factor de dvisin del pre-ivsor del Timer2, €l valor que hay que colocar en el registro PR2 es N= 249, La duracién (variable) de los pulsos PWM se logra colocando un valor entre 0 y 249 en el registro COPRILL ‘Acontinuacion se muestra el istado del programa en lenguaje ensamblador. 4, 16. Se escoge P= 4, de modo que List p=16F873, include “P16F873INC* + rip: Rutina para programar el médulo CGPI en modo PWM “para generar una sefal PWM de perodo ims y cto de trabajo dl 50% + El valor del ciclo de trabajo se puede variar dndmicamente con posteronidad. Los temporizadores aes Inic_pwm: moviw 0x01 : Programar Timer? detenido movwt T2CON 5 pre-dvisor = 4, cif CCPICON Reset al modulo CPt. okt TMR2 Poner a0 el Timer2, moviw 124 j La sefal PWM saldré con movwt CCPRIL }cilode trabajo del 50 %, bst STATUS, RPO; Seleccionar banco 1 moviw 249 3 Médulo de conteo del Timer2 movwt PRO ; Que es el periado de la sefal PWM. bet PIE, TMR2IE —_; Inhabiltarintertupcin del Timer ‘bef PIE, CCPIE —_;Inhabiftar interrupcion del médulo CCP. bof TRISC,2 + Poner el terminal CCPI como sala, bef STATUS, RPO; Seleccionar el banco 0. cf PIRt + Poner a Olas banderas de interupcién, movi 0x0C } Elmédulo CCP1 en modo PWM, movwt CCPICON —_; conlosbits DC1B1:001B0 en 0 (M2 = 0), bsf —T2CON, TMRZON;; Iniciar conteo del Timer2 return + TON_pwm: Esta rutna varia el ciclo uti de la seal PWM : segiin el valor depositado en W. : Entradas: En W un nimero entre 0 y 249 TON_pum: movwt CCPRIL retuen end 218 — Microcontroladores PIC En unmicrocontrolador hay varias fuentes de interrupci6n, unas internas y otras externas. Las interrupciones internas tienen su origen en los médulos de entrada y salida del microcontrolador, la memoria o la CPU. Los temporizado- res y otros médulos de entrada y salida son fuentes de interrupcion comunes. ‘Menos comunes son las interrupciones causadas por algtin evento que tenga lugar en la memoria (por ejemplo, por escribir en la EEPROM de datos) o en la propia CPU (una divisi6n por cero). Las interrupciones externas se originan en ‘un periférico y legan al microcontrolador por alguno de sus terminales, Los microcontroladores tienen recursos para recibir y procesar las soli- citudes de interrupcién. Generalmente, cada dispositivo que es fuente de una posible interrupcién tiene asociados dos bits, que pueden estar en un mismo registro o en registros diferentes. El primer bit tiene una funcién informativa: es un indicador que es activado (es puesto a 1, por ejemplo) por el dispositivo que solicita la interrupcién. Este bit se puede consultar por programa si para atender al dispositivo se usa la técnica de consulta o espera. El otro bit tiene una funcién de control y se usa para permitir o impedir el paso de la solici- tud de interrupcién hacia la CPU, lo que equivale a habilitar o inhabilitar la generacién de interrupciones por la fuente en cuestién. Este bit de control se puede manejar por programa. Los microcontroladores disponen ademis de un bit para el control glo- bal del sistema de interrupci6n. Con este bit se permite o impide el paso de cualquier interrupcién hacia la CPU, lo cual equivale a habilitar o inhabilitar globalmente el sistema de interrupci6n. Para que una solicitud de interrup- cién llegue a la CPU y sea atendida, tanto el sistema en su conjunto como la interrupcion en particular deben estar habilitados. Los bits de control utilizados para permitir 0 no el paso de las solici- tudes de interrupcién hacia la CPU se denominan mascaras; de ahi que las interrupciones que se pueden habilitar o inhabilitar por programa se llamen interrupciones enmascarables (maskable interrupts) y las interrupciones que no se pueden inhabilitar por programa (es decir, que estan siempre habilitadas), si las hay, se denominan interrupciones no enmascarables (non-maskable inte- rrupls). La figura 7.2ilustra el camino que siguen las solicitudes de interrupcién, enmascarables 0 no, para llegar a la CPU. Las interrupciones enmascarables disponen de bits de control asociados a cada fuente de interrupcién y del bit para el control global del sistema, Para que una solicitud de interrupcién enmascarable progrese hacia la CPU, tanto el bit de control individual corres- Lasinterrupciones: 19 pondiente como el bit de control global deben estar en 1. Si la interrupcién es no enmascarable, llegara a la CPU con independencia del bit de control global, y seré atendida 0 ipo Trapani no ‘onmoccorste Solicitud de ilerupecn ‘anc. Dispostivo Indicador ) — conte 5 inerupcones crmaararslos postive | of inteasor —— [ (Cent (Ceomnar Inseadores Bis para contol St para et conta global Fuentes de ae Individual de cade Ge las interrupciones inerugeén _cadafueie de teruplon mascnsies inlerpesn enmascratla Figura 7.2. Camino que siguen las solicitudes de interrupcién en tun microcontrolador. Cada fuente de interrupcién tiene un indicador que se activa (pasa a 1) con la solictud de interrupcién. Las interrupciones enmascarables deben ser habiitadas para que las solicitudes leguen a la CPU. Para ello estin de control individual y ‘global correspondientes. Una solcitud de interrupcién no enmascarable siempre Tega a ta CPU para ser atendida, En general, cuando una solicitud de interrupcién que llega a la CPU es atendida, el sistema de interrupcién queda inhabilitado (el bit de control global es puesto a 0). Entonces, segtin el esquema de la figura 7.2, no llegar ala CPU ninguna nueva solicitud de interrupcién que se produzca. Para po- der atender otras solicitudes de interrupcion, el programador debe habilitar nuevamente el sistema; esto suele hacerlo el propio programa que atiende la interrupcién. 7.1.2 Atendénalas solidtudes deinterrupcén Atender una solicitud de interrupcion es interrumpir la ejecucion del programa en curso y pasar a ejecutar otro programa, tal como ilustra la figura 7.1. Cuando termina este segundo programa, hay que continuar con el pro- grama interrumpido. 20— controladores PIC La solicitud de interrupci6n que llega a la CPU (en el supuesto de que la interrupcién y el sistema estén habilitados), se atiende cuando termina la ejecucisn de la instruccién en curso. Como en general no se conoce de an- temano cual es esta instruccién, hay que encontrar Ia forma de recordar la direcci6n de la instrucci6n que le sigue, para regresar a ella cuando termine el programa que atiende a la interrupcién. Esa direccién esta en el contador de programa (PC). La forma de recordarla es guardar el contenido del PC en la pila, tal como lo hacen las instrucciones de llamada a una subrutina. Conviene por ello que e! programa de atenci6n a una interrupcién tenga la estructura de una subrutina, porque la instruccién de retomo que pone fin a la ejecuci6n de esta subrutina hard que se regrese satisfactoriamente al pro- grama interrumpido. El programa de atencién a una interrupci6n es, pues, una subrutina que se “llama” por interrupcién. También se puede decir que una solicitud de in- terrupcién equivale a insertar una instruccién de llamada a una subrutina (la que atiende a interrupcién) en algan lugar no previsible del programa. En principio, la estructura de la subrutina que atiende a una interrup- cién no es diferente de la de cualquier subrutina “convencional”. No obstan- te, dado que no es posible conocer de antemano el lugar del programa desde donde se producira la llamada a la subrutina, el programador debe tomar ciertas precauciones al escribirla. La ejecucién de la subrutina que atiende una interrupcién debe dejar intactos los valores de los registros y bits con los que el programa estaba trabajando. Por ejemplo, los valores que tienen el acu- mulador (0 el registro de trabajo) y el registro de estado u otro similar, como los indicadores aritméticos, no deben alterarse por la ejecucién de la subruti- na de atencién a una interrupci6n. Para preservar esos y otros registros que no deban ser alterados, hay que guardar sus valores al iniciar la subrutina, En muchos microcontroladores se usa la pila para esta acci6n. Antes de retornar al programa interrumpido, se restituyen los valores originales de esos regis- tros. Hay que desactivar el indicador de la interrupcién (es decir, ponerlo a 0) para que no se repita continuamente, pues, por lo general, el indicador no se desactiva autométicamente, y s6lo entonces habilitar el sistema de inte- rrupcién para retornar al programa interrumpido. La figura 7.3 muestra el diagrama de bloques de la estructura general de la subrutina de atencién a una interrupcién. Las etapas que transcurren al atender a una solicitud de interrupcion son las siguientes: 1. El microcontrolador completa la ejecuci6n de la instruccién en curso. Lasinterrupciones — 221 (Sapna a stoniona una _—s pi) ios valores det ‘Acumulador, Rogisto Figura 73 Estructura general de la subrutina de atenci6n a wna solcitud de interrupeién. 2. El valor del PC se guarda en la pila, para “recordar” la direccién de la instruccién a la que hay que regresar cuando termine la atencién a la in- terrupci6n, 3. La direccién de la subratina de atenci6n a la interrupcién se pone en el PC, con lo cual se salta a esa direccién y comienza Ia ejecucién de la su- bratina, 4. Se ejecuita la subrutina de atencién a la interrupcién. Como toda subruti- rna, termina (su gjecuci6n) con una instruccién de retorno. 5. Conla ejecucién de la instruccién de retorno, se regresa al programa inte- rrumpido, 7.1.3 Interrupciones fas y vectorizadas Para informar a la CPU de la direccién donde comienza la subrutina que atiende la interrupcién, hay dos alternativas 1. Lasubrutina que atiende a la interrupcién se coloca en un lugar fijo de la memoria de programa, conocido de antemano por la CPU.

You might also like