Paso 3: Una mirada interior sobre las tareas de PIC16F727
FOSC = 16000000 Hz
FINST = 4000000 Hz
Tinst = 1 / Finst = 250 ns
Una instrucción toma 250 nanosegundos, este es el mismo ritmo el temporizador cuenta con. Si necesitamos un tiempo de 1 milisegundos, deje el temporizador para 4000 instrucciones, entonces la señal, que 1 ms ha transcurrido.
Para hacer esto muy precisa, vamos a utilizar interrupciones. Una interrupción a un microcontrolador es como un golpecito en el hombro para ti. Sólo está ocupándose su propio negocio, entonces alguien viene, golpeando su hombro para decir algo. Dejar de hacer su negocio y prestar atención a la interrupción que se produjo. Después de que termines escuchando, reaccionan de cierta manera, a continuación, volver a las cosas que has estado haciendo antes de que alguien le interrumpiera. Diciendo esto la manera PIC, sólo mantenimiento una interrupción.
El PIC no hace lo que quiere, lo hace, qué dice. Esto es una cosa muy importante memorizar: un error de silicio rara vez es la razón por qué su proyecto no arranca. Es 99.9% de las veces fallas de programación.
Lo que tenemos que decir el PIC para conseguir lo que queremos:
Configuración del oscilador:
Necesitamos configurar el oscilador interno para ser la fuente de reloj principal para este proyecto, para ello, poner 0 x 30 en el registro OSCCON.
Habilitación de interrupciones:
En primer lugar, tenemos que activar el sistema de interrupción. Esto se hace mediante la manipulación de los bits en el registro INTCON.
Necesitamos activar interrupciones globales y la interrupción de Timer0. Mirando la hoja de datos, vemos bit 7 que la interrupción global activar bit, bit 5 que la interrupción de Timer0 activar bit. El resto de los bits son ceros, no es necesario cambiarlos. Esto da un valor binario de b10100000, que en hexadecimal es 0xA0. Ponemos en el registro INTCON.
Prescalers:
Un prescaler es un contador de sí mismo, que incrementos en cada instrucción del ciclo. Estos - por defecto - se fijan a 1:1 para que no interfieran con la operación normal de temporizador. La salida del divisor es conectada a la entrada del contador de tiempo, como podemos ver en el diagrama. Si establecemos un prescaler de 1:2, su salida pondrá a '1' sólo después de han completado 2 ciclos de instrucción. Esto significa que el temporizador no incrementa en cada ciclo de instrucción, pero en cada 2ª. Similar a ésta, estableciendo el prescaler para dividir por 4, el TMR0 es que se incrementa cada ciclo de instrucción 4-th, y así sucesivamente.
Configuración del Timer0 a interrumpir cada milisegundo:
Timer0 cuenta las instrucciones incrementando el valor en el registro TMR0. que valor es amplia, lo que significa, 8 bits no podemos contar más de 255. Si el contador es de 255, y se produce un incremento, el registro se desbordará y empezar a contar otra vez desde 0.
Este es el punto, cuando un temporizador puede señalar una interrupción. Pero si esto ocurre cada ciclo 256-th, ¿cómo podemos nosotros para contar a 4000? A través de la ayuda de las prescalers.
4000 / 256 = 15.625
Así que necesitamos una división por 16 (el más cercano y más grande valor divisor) para que esto suceda.
4000 / 16 = 250;
Puesto que el temporizador da interrupción en rollover de 255 -> 0, solo pondremos un desplazamiento de 256-250 = 6 en el registro TMR0. Este valor debe actualizarse cada vez que la interrupción es atendida. También tenemos claro la bandera, que fue fijada en 1, cuando se produjo el vuelco de Timer0.
Habiendo dicho que, ahora tenemos una interrupción exacta, eso ocurre cada milisegundo. Suele llevar a la práctica un contador en la rutina de servicio de interrupción, cuento 1000 interrupciones, construcción de una segunda señal. Contando los segundos debe ser hecho en el bucle principal, hay simples contadores que contar 60 segundos, luego desbordan para incrementar la variable "minutos". Entonces, del mismo modo, las "horas", "días", "meses" variable se incrementa.
Los dígitos
Si el proyecto es bastante simple y tiene algunos displays de 7 segmentos en el esquema, no cuido para localizar los pines del controlador de segmento uno al lado del otro. Este proyecto no fue una excepción, el fuzzy define le puede ver al principio del programa en lugar de simplificar las formas de visualizar los dígitos. Si usted toma el tiempo suficiente para tratar de entenderlos, verás qué fácil esta parte muestra realmente es.