Página de inicio Mi Correo






   » Foro
   » Nuevo Foro
   » Mi Correo
   » Mis Actividades...


--- Novedades ---



    
  » Microcontroladores » Interrupciones y Temporizaciones (6 de 15)  

.: Interrupciones Internas y Temporizaciones

Lo que hicimos anteriormente fue trabajar con interrupciones externas aunque no tocamos aquello de las interrupciones por los pines RB4 a RB7, el procedimiento es muy similar sólo debes tener en cuenta la bandera que informa el estado de las interrupciones y estudiarlas para saber por cual de esos pines se produjo.

Lo que veremos ahora será como trabajar con una interrupción interna, algo no muy distinto a lo anterior pero que lo vale, ya que haremos uso de algo que fue pedido en el foro por César Bonavides, a quien envío mis cordiales saludos allá en méxico.

Antes de entrar en materia, debo confesar que lo fuerte de esta sección serán las Temporizaciones, aunque obviamente haremos uso de interrupciones, de acuerdo...???

Desde mis inicios con los microcontroladores, temporizar fue algo que me trajo grandes dolores de cabeza, y aunque me las arreglaba como podía, me quedaba siempre con la duda, que hago cuando quiero temporizar sólo un segundo...???, supongo que a muchos les suele pasar, hasta que finalmente no lo pude evitar y comencé a escarbar en cuanto tutorial caía en mis manos, y de ello surgió lo que describiré aquí, y trataré de explicarlo lo mejor posible, espero no meter la pata...!!!

Como siempre... un poco de teoría no viene mal no crees...???

Bien, a prepararse que comenzamos...

.: Temporizaciones

Algunas de las cosas que deberemos tener en cuenta son...

Por un lado, el oscilador externo, y yo lo haré con un XT de 4 Mhz es decir 4 millones de ciclos por segundo, y por otro lado un registro llamado TMR0, este registro es un Temporizador/Contador de 8 bits, que como es lógico cuenta en binario y en forma ascendente es decir... de 0x00 a 0xFF, lo interesante de este registro es que cuando ocurre un desbordamiento, es decir pasa de 0xFF a 0x00 hecha sus alaridos en el registro INTCON modificando la bandera T0IF, es decir, produce una interrupción.

Veamos ahora como está conformada la estructura del micro para trabajar con este registro, y quienes están involucrados en ello.

Diagrama de bloques para el TMR0

Creo que ahora se van a entender un poco mejor las cosas...

Aquello que está en rojo son Bit's configurables en el Registro OPTION, lo que está en verde Bit T0IF es el Bit2 del registro INTCON (la bandera que se altera cuando el TMR0 se desborda), y lo que está en rosado... bueno, hablemos de ello...

El registro TMR0 puede trabajar de dos modos distintos, ya sea como temporizador o bien como contador el cual seleccionarás en T0CS (Bit5 del registro OPTION)

En modo Temporizador: El TMR0 se incrementa con cada Ciclo de Instrucción (Fosc/4) y cuando el registro se desborde provocará una interrupción.

En modo Contador: El TMR0 se incrementará con cada pulso que ingrese por el pin RA4/T0CKI, y por supuesto... cuando se desborde producirá la interrupción. T0SE es el Bit4 del Registro OPTION, en él seleccionas el flanco con el cual se incrementará el TMR0 cuando haya un pulso por RA4.

Algo que quería mencionar es que el micro dispone de dos temporizadores, el TMR0 y WDT (Watchdog). El primero es el que estamos tratando en esta sección, el segundo es el perro guardián, lo que hace es vigilar cada cierto tiempo que el micro no se quede colgado, por ejemplo cuando se queda detenido en un bucle infinito o en una larga espera de un acontecimiento que no se produce, entonces actúa reseteando al micro, en otro momento hablaremos más de él...

El Prescaler es un predivisor de frecuencia que se utiliza comúnmente para programar tiempos largos y puedes aplicarlo al TMR0 o al WDT, esto lo configuras en PSA Bit3 del registro OPTION.

Hablamos tanto del Registro OPTION que decidí traértelo nuevamente pero marcando con color aquello que acabamos de mencionar, y aquí está...

REGISTRO OPTION
RBPU INTDEG T0CS T0SE PSA PS2 PS1 PS0

Y para refrescar...

Bit 5: T0CS: Selecciona la fuente de Reloj para TMR0
1 = Pulsos por el pin RA4/T0CKI (contador)
0 = Ciclo de instrucción interno (temporizador)
Bit 4: T0SE: Flanco de incremento para RA4/T0CKI
1 = Incrementa TMR0 en flanco descendente
0 = Incremento en flanco ascendente
Bit 3: PSA: Bit de asignación del Prescaler
1 = Divisor asignado al WDT
0 = Divisor asignado al TMR0
Bit 2-0:   PS2, PS1, PS0: Selección del prescaler (divisor de frecuencia)

El prescaler debe tener algún valor, y si bien no puedes cargarle un valor cualquiera, tienes la posibilidad de seleccionarlo según la combinación de PS2, PS1 y PS0.

En la siguiente tabla puedes ver estos posibles valores...

PS2 PS1 PS0 División del TMR0 División del WDT
0 0 0 1/2 1/1
0 0 1 1/4 1/2
0 1 0 1/8 1/4
0 1 1 1/16 1/8
1 0 0 1/32 1/16
1 0 1 1/64 1/32
1 1 0 1/128 1/64
1 1 1 1/256 1/128

Algo que me estaba quedando pendiente es la Sincronización de Reloj interno, por lo visto, según la hoja de datos, el micro genera un pequeño retraso de 2 ciclos de instrucción mientras sincroniza el prescaler con el reloj interno.

Bien, ahora veremos para que nos sirve toda esta información...



R-Luis...

<-- Anterior   Introducción   Siguiente -->
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15
Tabla de Referencias


    
--| |--