Saludo
un saludo compañero groudman. Cuando vas hablar de esto de los push y pop mas detenidamente es muy importante como tu dices ojala compartas tus conocimiento con los novatos
.
Bueno hoy les traigo la teoria DEL TIMER0 como hacer demoras y como manejar la interrupcion por desborde sin más chachara ahy le va lo que he preparado.
Registros de control de interrupciones del timer0
Antes que nada es importante aclarar algo
Antes del retorno conviene borrar el señalizador de la causa de la interrupción (es obligatorio) que se ha atendido, porque si bien los señalizadores se ponen automáticamente en 1 cuando se produce la causa que indica, la puesta a 0 se hace por SOFTWARE.
La mayor parte de los señalizadores y bits de permiso de las fuentes de interrupción en los PIC16X8X están implementados sobre los bits de registro INTCON (También hay otros importantes pero por ahora no concentraremos en este registro), que ocupa la dirección 0Bh del banco 0, hallándose duplicado en el banco 1
Bits del registro INTCON
GIE: permiso global de interrupciones :1 permite la ejecución de todo las interrupciones, cuyos bits de permiso individuales también las permitan.
TOIE : Permiso de interrupción de sobrepasamiento del TMR0
1: Permite la interrupción al desbordase el timer0
0: prohíbe esta interrupción
TOIF: Señalizador de sobrepasamiento del TMR0
1: hubo desborde del TMR0
0: indica que el TMR0 no se ha desbordado
Otro registro importante es el OPTION_REG el cual tiene como dirección 81h y esta ubicado en el banco 1 de la memoria
PSA: Bit de asignación del divisor de frecuencias
1: Divisor de frecuencia es asignado al WDT
0: Divisor de frecuencia es asignado al TMR0
Interrupción por desborde del TMR0
Cuando el TMR0 se desborda y pasa del valor 255 a 0, el señalizador TOIF se pone automáticamente a 1. Si, además, el bit de permiso de la interrupción del TMR0, TOIE = 1 y el bit de permiso global de interrupciones, se produce una interrupción.
Si no se recarga el TMR0 cuando se desborda, sigue contando desde 0 a 255. En cualquier momento se puede leer y escribir este registro, pero cada vez que se escribe se pierden dos ciclos de reloj para la sincronización.
Cuando se carga inicialmente el TMR0 con el valor N, cuenta 256 – N impulsos, siendo el tiempo que tarda en hacerlo el que expresa la siguiente ecuación
Temporización = 4*Tosc*(256 – TMR0)*Divisor de frecuencias
Con un cristal de 4MHz se puede contar como mínimo 256us y como máximo 65.536ms dato importante. Listo ya estamos preparados (por lo menos yo) para poner a contar nuestro TIMER0.
El PROGRAM
;************************************************************
;* Carlos Alberto Henao *
;* Interrupción por desborde del timer0 con el pic 16f877 *
;* Foro técnico de microcontroladores "todopic" *
;* 13 de julio del 2009 Pereira - Colombia *
;************************************************************
;******************** Declaración de registros especiales *********************************
tmr0 equ 01h
status equ 03h
porta equ 05h
portb equ 06h
portc equ 07h
portd equ 08h
porte equ 09h
intcon equ 0bh
option_reg equ 81h
trisa equ 85h
trisb equ 86h
trisc equ 87h
trisd equ 88h
trise equ 89h
adcon1 equ 9fh
;******************* registros de usuario *************************************************
cuenta equ 20h
list p = 16f877
;***************** va a empezar el programa ***********************************************
org 00
goto inicio
org 04
goto inter
;**************** Rutina de manejo de interrupción ****************************************
inter btfsc intcon,2 ; pregunto si hubo interrupción por timer0
goto timer0
retfie
timer0 incf portb,1 ; incremento el puerto b en 1
clrf timer0 ; inicializo de nuevo el timer para tiempo máximo
bcf intcon,2 ; borro el flag
retfie ; retorno al pcl+1
;*************** rutina de principal (main) ***********************************************
inicio bcf status,6
bsf status,5 ; banco 1
movlw b'11111111'
movwf trisa
movwf trisc
movwf trisd
movwf trise ; puerto A, C,D,E como entradas digitales
movlw b'00000000'
movwf trisb ; puerto B como salidas digitales
movlw b'11010111'
movwf option_reg ; configuro el timer a un predivisor de frecuancia de 1:256
movlw b'00000110'
movwf adcon1 ; configuro puerto A Y E como entradas digitales
bcf status,5 ; banco 0
clrf porta
clrf portb
clrf portc
clrf portd
clrf porte ; limpio todo los puertos
movlw b'10100000'
movwf intcon ; habilito la interrupcion global y por desborde del timer0
; ya estamos listos solo falta cargar el valor correspondiente
; en el registro tmro
clrf tmr0 ; limpio el timer para que me produsca un máximo valor de
; tiempo
nada goto nada ; bucle infinito esperando a que ocurra la interrupción
end
Bueno cualquier cosa me comentan. no vemos. Un saludo desde Pereira - Colombia