Hola:
Acabo de encontrar este foro, me hubiera ayudado mucho descubrirlo antes, pero bueno, estoy muy contenta de haber dado con un lugar como este.
Tengo un problema para hacer una práctica. Básicamente es hacer un reloj con el timer0 del chip, pero no me sale. Tengo una rutina de interrupción, pero vamos, poco más, si alguien puede ayudarme se lo agradecería mucho, el tiempo es esencial, ya que debo entregarla el miércoles por la mañana. El programa es en .ams, lo estoy haciendo con el mplab.
Gracias de antemano por la ayuda.
Programar una rutina de servicio de interrupción cuyo objetivo sea actualizar correctamente tres variables en memoria: Horas, Minutos y Segundos. Para ello se usará el Timer0 del chip y se aprovechará su capacidad de provocar interrupciones. Suponer que la frecuencia del reloj a la que funciona el chip es de 10 MHz. Pondremos código de inicialización de esos recursos en el programa principal y en la dirección 0004h nuestra rutina de servicio de interrupción (lo adjunto más abajo). El algoritmo es muy simple, se trata de ir incrementando en la rutina de interrupción un contador (o varios contadores, de forma anidada). Conociendo el período de la interrupción compararemos la cuenta de nuestro último contador con la cuenta total más próxima a un segundo, momento en el borraremos el contador e incrementaremos nuestra variable de segundos. Comprobaremos si dicha variable llega a 60, momento en el que la pondremos a cero e incrementaremos nuestra variable de minutos. Igual haremos para incrementar las horas a partir de los minutos y para pasar de las 24h a las 00h.
list p=16F84
#include <p16F84.inc>
** Defino variables **
w_temp EQU 0x0C ; variable para preservar el acumulador durante las int
status_temp EQU 0x0D; igual para el registro de Status
; puede usarse la directiva CBLOCK para nuevas variables a
; partir de 0x0D
;*****
ORG 0x000 ; El procesador empieza a ejecutar aqui al arranque o reset
goto main ; ir a nuestro programa principal
;Rutina de Servicio de interrupción
ORG 0x004 ; Las interrupciones provocan la ejecucion de esta posición
movwf w_temp ; guardar el registro W del programa interrumpido
movf STATUS,w ; guardar ahora su registro de Status
movwf status_temp
; cuerpo de la rutina de interrupción
movf status_temp,w ; recuperamos el valor del registro de Status
;guardado antes
movwf STATUS ; y lo restauramos
swapf w_temp,f
swapf w_temp,w ; restauramos registro acumulador W
retfie ; retorno de la interrupción
main
;programa principal
END