pic 18f45xx - iesluisdelucena.es€¦ · no pueden invocarse desde otros puntos del programa ......

12
PIC 18F45XX La Interrupción externa

Upload: vanhuong

Post on 28-Sep-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

PIC 18F45XX

La Interrupción externa

Page 2: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

1. Características generales sobre interrupciones (I)

La familia 18F45XX incorpora múltiples fuentes de interrupción.

Cuando se produce una interrupción se produce un salto hacia la dirección que indica el vector de interrupción.

Cada fuente de interrupción puede configurarse como:ALTA prioridad (vector: 000008h)BAJA prioridad (vector: 000018h)

Si no se utilizan las prioridades (RCON.SPEN=0) todas las interrupciones son consideradas de alta prioridad.

Cada fuente de interrupción tiene tres bits que configuran su funcionamiento: Bit de habilitación (Enable bit), permite/impide el “salto” al vector de interrupción.Bit de prioridad (Priority bit), configura el vector de salto ALTA o BAJA.Bit de bandera (Flag bit), se pone a uno cuando se produce la interrupción.

La interrupción externa está implementada en los pines RB0, RB1 y RB2.

Para habilitar la int. Externa en RB0 sin prioridad hay que poner a uno los bits GIE, y INT0IE del registro INTCON.

Page 3: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

1. Características generales sobre interrupciones (II)

Las rutinas de atención a las interrupciones tienen las siguientes limitaciones: No devuelven ni aceptan parámetros No pueden invocarse desde otros puntos del programa Las variables globales que se utilicen se deben declarar como volatile

La directiva : #pragma interruptlow nombre_interrupcion Define la rutina de servicio a la interrupción como de baja prioridad La directiva:

#pragma interrupt nombre_interrupcion Define la interrupción como alta prioridad Ejemplos de programación:#pragma interrupt UserHighPriorityISRCodevoid UserHighPriorityISRCode(){ }

#pragma interruptlow UserLowPriorityISRCodevoid UserLowPriorityISRCode() {}

Page 4: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

2. Hardware de interrupciones

Page 5: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

3. Registro de configuración INTCONPara deshabilitar el control de prioridades poner a cero el bit IPEN del registro RCON:RCONbits.IPEN=0;

Todas las interrupciones “saltan” al vector: 000008

Cuando se produce la int. Externa se pone a uno su bandera de interrupcion:INTCONbits.INT0IF=1

Para habilitar la int. Externa:INTCONbit.INT0IE=1;INTCONbits.GIE=1;

Page 6: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

4. Registro de configuración INTCON2

La int. Externa en RB0 puede configurarse para activarse con flanco de subida o de bajada.

Para configurar con cada flanco de bajada:INTCON2bits.INTEDG0=0;

Para configurar con cada flanco de subida:INTCON2bits.INTEDGE=1;

Page 7: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

5. Interrupciones en la placa de periféricos

Para poder generar una interrupción por flanco de bajada:a) Poner el jumper J2 en posición (B0-E)b) Pulsar RB0

Page 8: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

6. Programación en C18

Para configurar la interrupción externa RB0 sin prioridades se puede seguir el siguiente procedimiento:

En la función main()• Deshabilitar prioridades. RCONbits.IPEN=0;• Hablilitar todas las interrupciones. INTCONbits.GIE=1;• Habilitar interrupción en RB0. INTCONbits.INT0IE=1;• Configurar el tipo de flanco (subida/bajada). INTCON2bits.INTEDG0=1/0;• Poner a cero la bandera de control. INTCONbits.INT0IF=0;

En la función de interrupción• Deshabilitar todas las interrupciones. INTCONbits.GIE=0;• Guardar el estado del programa principal (si procede)• Programar la función según necesidades.• Recuperar el estado del programa principal (si procede)• Poner a cero la bandera de control. INTCONbits.INT0IF=0;• Habilitar todas las interrupciones. INTCONbits.GIE=1;

Page 9: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

7. Programa de ejemplo

Diseñar un programa que presente un segmento girando en la parte baja del display de la placa de periféricos a intervalos de 300ms. Configurar la interrupción externa en RB0, generada por flanco de bajada, para que cuando se produzca parpadee la parte baja del display tres veces a intervalos de 200ms. Cuando termine la interrupción el segmento debe seguir girando en la misma posición donde se encontraba.

Page 10: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

Solución (programa principal)

Page 11: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

Solución (función de interrupción)

Page 12: PIC 18F45XX - iesluisdelucena.es€¦ · No pueden invocarse desde otros puntos del programa ... Programación en C18 ... • Poner a cero la bandera de control

Simulación