Sunteți pe pagina 1din 6

Si no se intenta, ...

no se hace

lmarte
Miembro activo

Mensajes: 73
Registrado: Lun Ene 19, 2004 3:46 pm
Arriba

Re: Uso De Interrupciones Con Pic 16f877


por javierv » Lun Abr 26, 2004 4:44 pm

Tambien las interrupciones de timers envia al vector de interrupcion.

[CODE]
;***************************************************************
org 0x00
goto inicio
;***************************************************************
; programacion de interrupcion
org 0x04 ; vector de interrupcion
btfss INTCON, T0IF ;checar si es interrupcion de timer0
retfie ; si no lo es regresar
; aqui va el codigo de la interrupcion
;...
;...
retfie ; fin de la interrupcion

inicio
; ACTIVACION DEL TIMER0 COMO INTERRUPCION
bsf STATUS, RP0
movlw 0xD6
movwf OPTION_REG
bcf STATUS, RP0
bsf INTCON, T0IE
bsf INTCON,GIE
; aqui va el codigo del programa
;...
;...
end
javierv
Miembro activo

Mensajes: 25
Registrado: Mié Feb 18, 2004 8:17 am

Uso del Timer 0 del PIC 16F877A

El Timer 0 del PIC 16F877A, es un Temporizador/Contador de 8-bit.


Para trabajar con este Timer hay varios parametros de configuracion
como lo son (abajo):
- Fuente de conteo o tiempo, interna o externa
- Prescaler 1:2, 1:4, 1:8 hasta 1:256
- Uso de las interrupciones del timer cada desbordamiento
- Trancisiones, (0 a 1) o (1 a 0)

El prescaler es como un contador mas, es decir si no usaramos


prescaler la interrupcion o desbordamiento del timer tiene lugar cada
vez que el registro de conteo pase de FFh a 00h. Pero con el uso de
prescaler a por ej. 1:256, estariamos hablando de una interrupcion
cada vez que el timer se desborde 256 veces (FFh*FFh).

En el programa presentado hoy, se usan dos fuentes de interrupcion


la del timer y la interrupcion externa por lo cual el programa debe
identificar cual es la rutina adecuada para cada una de las
interrupciones, eso se logra comparando las banderas de cada
interrupcion. Adicionalmente las banderas deben ser borradas en
Software para evitar falsos disparos de rutina.

En la etiqueta INICIO del programa, se observa que simplemente


siempre esta poniendo en 1 y en 0 a dos pines del Puerto B, pero
cada vez que hay interrupcion del timer, pondra en 0 al pin que
estaba en 1 y en 1 al que estaba en 0, de esa manera se crea una
forma de onda y es complementaria por ser simetrica una de la otra.

La funcion de la interrupcion externa es simplemente cambiar la


velocidad del conteo, ¿como se logra? cambiando el prescaler del
Timer 0.

En el video de arriba se puede observar el cambio de velocidad al


presionar el SW de interrupcion.

Este es el Esquematico, el programa ASM lo encuentras aqui, y el


HEX esta mas abajo.

Programa HEX

:020000040000FA
:040000003120412842
:080008008312031320202820BD
:080010008B0170308B00090028
:100040000B1D08008312031306138617880A08285D
:100050008B1C0800831603130111811083120313F4
:10006000080083120313F0308B0086018801831689
:1000700003130730810007308600880183120313C1
:08008000080006178613422850
:00000001FF

Lo interesante de este programa es el uso del Timer con Prescaler y


la manipulacion de su velocidad mediante la interrupcion externa, lo
cual puede ser cambiado a por ejemplo contador de eventos y una
interrupcion para el reinicio del contador o cualquier otra combinacion
de caracteristicas, se puede hacer modificaciones para que cada que
se presione el SW, incremente la velocidad a cada cambio de
Prescaler.

Saludos.

Interrupciones con pic 16F877A


por Gainza » Sab Jul 18, 2009 7:02 pm

Hola, que tal..... Tengo una duda, quiero hacer lo siguiente:

tengo un Boton(pulsador) A y un Boton EXIT

En una pantalla LCD va a aparecer por defecto "HOLA" , cuando presiono el Boton A debería quitarse "HOLA" y entonces aparecer
"COMO ESTAS" indefinidamente, luego, cuando presiono el Boton EXIT, entonces debera aparecer nuevamente "HOLA"..... Bien la duda
es, puedo hacer esto con interrupciones?

Ya hice una vez un pulsador, pero solo actuaba si lo mantenia presionado..

if(input(PIN_B0)==1)
{
output_high(PIN_B1); encendia un led
}

Si suelto el pulsador se apaga el led y eso es lo que no quiero..

Programo en PIC C, compilador C CSC.........Gracias


Gainza
Nuevo miembro

Mensajes: 3
Registrado: Dom Jul 05, 2009 4:52 pm

• Email

Uso De Interrupciones Con Pic 16f877


por karen81 » Sab Jun 05, 2004 10:04 pm

Las interrupciones son un conjunto de excepciones asincrónicas que permite el microprocesador para alterar la ejecución secuencial normal
de instrucciones; estas se manejan a través de vectores que contienen la dirección física de la memoria donde se encuentra la rutina de
servicio a la excepción solicitada.

es decir hacemos un programa que acepta interrupciones por lo que cada vez que se da una interrupcion el programa se interrumpe el micro
guarda la direccion donde se interrumpio el programa y otras cosas en la pila (depende de que microcontrolador estemos usando) luego se va
al vector de interrupcion donde esta la direccion de la rutina de servicio (que es la rutina que queremos que haga cuando se da la
interrupcion) luego de realizarla saca lo que guardo en la pila y retorna a la direccion donde se dio la interrupcion y continua.
La diferencia entre las interrupciones enmascarables y las noenmascarables es que las enmascarables se pueden evitar, es decir si no
queremos que se den las enmascaramos poniendo a uno o a cero una bandera (depende del micro) y aunque se de la condicion no se da la
interrupcion. En cambio las noenmascarables no se puede evitar que se den ejemplo los RESET no se pueden evitar.
En cuanto a la interrupcion NMI e IRQ tendrias que especificar a que micro te refieres.

Espero que esto te ayude, si algo no te queda claro avisame ya que es un tema que recien acabo de pasar por lo que lo recuerdo muy bien

Uso De Interrupciones Con Pic 16f877


por SinChip » Jue Oct 14, 2004 11:15 am

Hola , yo también soy nuevo en el foro. He leído y releído vuestras respuestas ya que las necesito para solucionar un problema, pero aún no
lo he conseguido. Se trata de hacer saltar al pic 16f877 a cualquier interrupción (estoy mosca porque esto se supone que es algo básico

).

Es la primera vez que trabajo con estos pics, y me parecen bastante potentes y sencillos de manejar, pero aquí hay algo que se me escapa.

Estoy usando las directivas de código relocalizable (CODE, IDATA, UDATA), aunque he usado las mismas estructuras de programa Imarte
o Javierv para el uso de interrupciones viendo que no hay ninguna diferencia entre poner un ORG o un CODE 0x... cuando quieres que un
bloque empiece desde una direccion concreta. Es decir, estas directivas no creo que me estén planteando problemas, ya que estoy depurando
con ICD2 otros programas que he hecho (sin interrupciones) y van bien.

La interrupción que quiero activar es la de RB0 (es decir, INTE dentro de INTCON). Por cierto Imarte, ¿Qué quieres decir con?:

Ahhh... se me olvidaba, OJO con INTCON.

precisamente a mí me está dando problemas, ya que intento poner a 0 el bit INTF para que vuelva a interrumpir, pero siempre está a 1, y en
el 877 no hace falta seleccionar el banco de memoria que contiene a INTCON ya que está reflejado en los 4 bancos.

Os dejo el codiguito que me trae de cabeza, ya estoy empezando a desconfiar en la placa que he hecho, incluso en el icd2

1. ;***** DEFINICIÓN DE VARIABLES ****************************************


2.
3. variables UDATA 0x110
4. w_temp RES 1; Variables para la salvaguarda del contexto
5. pclath_temp RES 1
6. status_temp RES 1
7. reg_temp RES 1
8.
9.
10. ;******** VECTORES DE INTERRUPCIÓN *************************************
11.
12. RESET_VECT CODE 0x000 ; Vector de reset del procesador
13. nop ; "nop"
14. pagesel inicio ;
15. goto inicio ; Salto al inicio del programa
16.
17. ;*******************************************************************
18.
19. INT_VECTOR CODE 0x004 ; Zona del vector de interrupción
20. goto ServInt ;
21.
22. ISR CODE 0x005
23. ServInt:
24. banksel w_temp
25. movwf w_temp
26. movf STATUS,w
27. movwf status_temp ;hasta aquí guarda de registros
28.
29. btfsc INTCON,INTF ;¿ocurrió flanco en rb0?
30. goto noint
31. movlw b'00110100' ; indicar interrupción
32. banksel PORTB
33. movwf PORTB
34. bcf INTCON,INTF
35. ; Limpia las interrupciones pendientes
36.
37. noint
38. banksel status_temp ; recupera lo guardado
39. movf status_temp,w
40. movwf STATUS
41. swapf w_temp,f
42. swapf w_temp,w
43.
44. retfie ;
45.
46.
47.
48. ;***** PROGRAMA PRINCIPAL *********************************************
49.
50. MAIN CODE ; Zona de Programa
51.
52. inicio:
53.
54. bcf INTCON,GIE ;Deshabilito por si acaso
55. movlw b'00001001' ;
56. banksel TRISB ; configurando el puerto B
57. movwf TRISB
58. movlw b'00000000' ;
59. banksel PORTB
60. movwf PORTB
61.
62. bsf INTCON,INTE ;
63. banksel OPTION_REG ;
64. bsf OPTION_REG,INTEDG;
65. bsf INTCON,GIE ;
66.
67. bcf INTCON,1; Limpia las interrupciones pendientes
68.
69. goto $ ; espera interrupciones
70. fin
71. END

S-ar putea să vă placă și