2.4.
Manejo de Puertos Digitales
PUERTOS DE ENTRADA-SALIDA
Dependiendo del dispositivo seleccionado y de las características permitidas,
hay hasta cinco puertos disponibles. Algunos pines de los puertos de entrada-salida se
multiplexan con una función alternativa de las características periféricas del dispositivo.
Generalmente cuando se activa un periférico, ese pin no se puede utilizar como pin de
entrada-salida.
PUERTOS DE E/S:
El µC PIC18F4550 dispone 5 puertos de E/S que incluyen un total de 35 líneas digitales
de E/S:
Todas las líneas digitales de E/S disponen de al menos una función alternativa
asociada a alguna circuitería especifica del µC. Cuando una línea trabaja en el modo
alternativo no puede ser utilizada como línea digital de E/S estándar.
2.4.1. Registros para el manejo de puertos digitales
REGISTROS DE UN PUERTO DE E/S:
Cada puerto de E/S tiene asociado 3 registros:
Registro TRIS: mediante este registro se configuran cada una de las líneas de E/S
del puerto como ENTRADA (bit correspondiente a ‘1’) o como SALIDA (bit
correspondiente a ‘0’).
Registro PORT: mediante este registro se puede leer el nivel de pin de E/S y se
puede establecer el valor del latch de salida.
Registro LAT: mediante este registro se puede leer o establecer el valor del latch
de salida
El registro del latch de datos (LATA) es útil para leer-modificar-escribir las
operaciones en el valor de los pines de entrada-salida.
FIGURA: PUERTO GENÉRICO DE OPERACIONES DE ENTRADA-SALIDA
Nota 1: Los puertos de E/S tienen un diodo de protección para VDD y VSS.
REGISTROS PORTA, TRISA Y LATA
El PORTA es un puerto bidireccional de 8bits de ancho. El registro de la
dirección de los datos es TRISA. Activar el bit TRISA (=1) hará que el pin
correspondiente de PORTA sea una entrada (es decir, pone el conductor
correspondiente de la salida en un modo alta impedancia). Borrar un bit de TRISA (=0)
hace que el pin correspondiente de PORTA sea una salida (es decir, pone el
contenido del latch de salida en el pin seleccionado).
Leyendo el registro PORTA se lee el estado de los pines; escribiendo en él, se
graba el latch.
El registro del latch de datos (LATA) sólo es memoria mapeada. Las
operaciones de lectura-modificación-escritura en el registro LATA lee y escribe el valor
del latch de salida del PORTA.
El pin RA4 se multiplexa con la entrada de reloj del módulo Timer0 para hacerse el
pin RA4/T0CKI. El pin RA6 se multiplexa con el pin principal del oscilador; se
permite como un oscilador o pin de entrada-salida al seleccionar el oscilador
principal en el registro 1H de la configuración. Cuando no está utilizado como un
puerto, RA6 y su TRIS asociado y los bits del LAT se leen como ‘0’.
El RA4 también se multiplexa con el módulo del USB; sirve como una entrada
receptora de un transmisor-receptor externo del USB.
Varios pines de PORTA se multiplexan con las entradas analógicas, las
entradas analógicas de VREF+ y de VREF- y la salida de referencia de la tensión del
comparador. La operación de los pines RA5 y RA3:RA0 como entradas del convertidor
A/D se seleccionan al borrar/activar los bits de control en el registro ADCON1 (registro
de control A/D1).
Nota: En un reset por subida de tensión, RA5 y RA3:RA0 se configuran como
entradas analógicas y se leen como ‘0’. RA4 se configura como entrada digital.
El resto de los pines de PORTA tienen niveles de introducción de datos de TTL
y drivers de salida de CMOS.
El registro TRISA controla la dirección de los pines RA, aun cuando se están
utilizando como entradas analógicas. El usuario debe asegurarse de que los bits del
registro TRISA son ‘1’ al usarlos como entradas analógicas.
PUERTO A:
Dispone de 7 líneas de E/S. Las funciones alternativas son:
● RA0: entrada analógica (AN0)/ entrada de comparación (C1IN-)
● RA1: entrada analógica (AN1)/ entrada de comparación (C2IN-)
● RA2: entrada analógica (AN2)/ entrada de comparación (C2IN+)
● RA3: entrada analógica (AN3)/ entrada de comparación (C1IN+)
● RA4: entrada de reloj del Temporizador 0 (T0CKI)/salida de comparación
(C1OUT)
● RA5: entrada analógica (AN4)/ salida de comparación (C2OUT)/HLVDIN entrada
de detección de tensión alta/baja
● RA6: entrada del oscilador principal (OSC2)/salida de señal de reloj (CLK0)
En el reset las líneas RA0, RA1, RA2, RA3 y RA5 se configuran como líneas de
entrada analógicas. Para poder utilizarlas como líneas digitales de E/S hay que
desactivar la función analógica:
EJEMPLO 1: INCIALIZACIÓN PORTA
CLRF PORTA ; Inicializar PORTA borrando los latch de
salida CLRF LATA ; Otro método para borrar los latch
MOVLW 0Fh ; Se desactiva la función de entrada analógica
MOVWF ADCON1 ; para activar las entradas digitales en las líneas RA0,
RA1,
; RA2, RA3 y RA4
MOVLW 07h ; Configurar los comparadores para entrada digital
MOVWF CMCON ; para las líneas RA0, RA1, RA2 y RA3
MOVLW 0CFh ; Valor usado para inicializar las direcciones de los datos
MOVWF TRISA ; Activar RA<3:0> como entradas y RA<5:4> como
salidas
REGISTRO ADCON1
– VCFG1: Bit de configuración de la tensión de referencia VREF-:
* VCFG1=‘0’: VREF- se conecta a VSS
* VCFG1=‘1’: VREF- se conecta a la línea física RA2
– VCFG0: Bit de configuración de la tensión de referencia VREF+:
* VCFG1=‘0’: VREF+ se conecta a VDD
* VCFG1=‘1’: VREF+ se conecta a la línea física RA2
– PCFG3..PCFG0: Bits configuración de los puertos de conversión A/D. Mediante
estos bits se establecen que líneas físicas (RA5..RA0, RB4..RB0, RE1 y RE0) van
a trabajar como entradas del convertidor A/D (Ver Tabla de configuración de líneas
de conversión A/D).
Tabla de configuración de líneas de conversión A/D:
REGISTRO CMCOM
– C2OUT: Bit de salida del comparador 2:
– Cuando C2INV=‘0’
→ Si C2_Vin+ > C2_Vin => C2OUT=‘1’
→ Si C2_Vin+ < C2_Vin => C2OUT=‘0’
– Cuando C2INV=‘1’
→ Si C2_Vin+ < C2_Vin => C2OUT=‘1’
→ Si C2_Vin+ > C2_Vin => C2OUT=‘0’
– C1OUT: Bit de salida del comparador 1:
– Cuando C1INV=‘0’
→ Si C1_Vin+ > C1_Vin => C1OUT=‘1’
→ Si C1_Vin+ < C1_Vin => C1OUT=‘0’
– Cuando C1INV=‘1’
→ Si C1_Vin+ < C1_Vin => C1OUT=‘1’
→ Si C1_Vin+ > C1_Vin => C1OUT=‘0’
– C2INV: Bit de inversión del comparador 2
* C2INV=‘0’: Comparador C2 NO invertido
* C2INV=‘1’: Comparador C2 invertido
– C2INV: Bit de inversión del comparador 2
* C2INV=‘0’: Comparador C2 NO invertido
* C2INV=‘1’: Comparador C2 invertido
– C1S: Bit de conmutación de la entrada del comparador (CM2..CM0=110).
* CIS=‘0’: Pin C1_Vin+ conectado a pin RA3/ Pin C2_Vin+ conectado a pin RA2
* CIS=‘1’: Pin C1_Vin+ conectado a pin RA0/ Pin C2_Vin+ conectado a pin RA1
– CM2..CM0: Bits de selección del modo de comparación
TABLA 10-1: RESUMEN DE ENTRADAS-SALIDAS DEL PORTA
Pin Función Configuración E/S Tipo de E/S Descripción
Del TRIS
0 salida salida digital LATA<0> salida de datos; no le afectan las entradas analógicas
Buffer de PORTA<0> entradas de datos; desactivada cuando se activen
RA0
1 entrada entrada TTL las entradas analógicas
RA0/AN0 Canal 0 de entrada A/D y entrada del comparador C1-.
AN0 1 entrada analógica Configuración por defecto en POR; no le afectan salidas
digitales.
0 salida salida digital LATA<1> salida de datos; no le afectan las entradas analógicas
RA1 Buffer de
1 entrada PORTA<1> entrada de datos; se lee ‘0’ en POR.
entrada TTL
RA1/AN1 Canal 1 de entrada A/D y entrada del comparador C2-.
AN1 1 entrada analógica Configuración por defecto en POR; no le afectan salidas
digitales.
LATA<2> salida de datos; no le afectan las entradas
0 salida salida digital analógicas. Desactivado cuando la salida CVREF esté activa.
RA2 Buffer de PORTA<2> entrada de datos. Desactivado cuando las
1 entrada entrada TTL funciones analógicas estén activas; desactivado cuando la
salida CVREF esté activa.
Canal 2 de entrada A/D y entrada del comparador C2+.
AN2 1 entrada analógica Configuración por defecto en un POR; no le afectan las salidas
RA2/AN2/ VREF- analógicas.
/CVREF Tensión baja de referencia de entrada para el A/D y el
VREF- 1 entrada analógica
comparador.
Tensión de referencia de salida. Activando esto se desactiva las
CVREF x salida analógica
E/S digitales.
0 salida salida digital LATA<3> salida de datos; no le afectan las entradas analógicas
Buffer de PORTA<3> entrada de datos; desactivado cuando las entradas
RA3 1 entrada entrada TTL analógicas estén activas.
RA3/AN3/ Canal 3 de entrada A/D y del comparador C1+. Configuración
AN3 1 entrada analógica
VREF+ por defecto en un POR.
VREF+ 1 entrada analógica Tensión de referencia alta de entrada para el A/D y el
comparador.
0 salida salida digital LATA<4> salida de datos; no le afectan las entradas analógicas
Buffer de PORTA<4> entrada de datos; desactivado cuando las entradas
RA4 1 entrada entrada analógicas estén activas.
Schmitt
Buffer de
T0CKI 1 entrada entrada Entrada del reloj Timer0.
RA4/T0CKI/ Schmitt
C1OUT/RCV C1OUT 0 salida salida digital Salida del comparador 1; tiene prioridad sobre el puerto de
datos.
RCV x entrada Buffer de Entrada externa del transmisor RCV del USB.
entrada TTL
RA5 0 salida salida digital LATA<5> salida de datos; no le afectan las entradas analógicas
1 entrada Buffer de PORTA<5> entrada de datos; desactivado cuando las entradas
entrada TTL analógicas estén activas.
AN4 1 entrada analógica Canal 4 de entrada A/D. Por defecto en un POR.
SS* 1 entrada Buffer de Entrada selectora de esclavo para SSP (Módulo MSSP).
RA5/AN4/SS*/ entrada TTL
HLVDIN/C2OUT HLVDIN 1 entrada analógica Detector de tensión Alta/Baja externa.
C2OUT 0 salida salida digital Salida del comparador 2; tiene prioridad sobre el puerto de
datos.
OSC2 x salida analógica Conexión de regreso del oscilador (todos los modos XT y HS).
CLKO x salida salida digital Salida del sistema del reloj (FOSC/4); disponible en los modos
EC, ECPLL e INTCKO.
LATA<6> salida de datos. Disponible en los modos ECIO,
0 salida salida digital
ECPIO e INTIO; en otro caso, se lee ‘0’.
OSC2/CLKO/RA6
RA6 Buffer de PORTA<6>entrada de datos. Disponible en los modos ECIO,
1 entrada
entrada TTL ECPIO e INTIO; en otro caso se lee ‘0’.
TABLA 10-2: SUMARIO DE REGISTROS ASOCIADOS AL PORTA
Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTA — RA6(1) RA5 RA4 RA3 RA2 RA1 RA0
(1)
LATA — LATA6 LATA5 LATA4 LATA3 LATA2 LATA1 LATA0
(1)
TRISA — TRISA6 TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0
ADCON1 — — VCFG1 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
CMCON C2OUT C1OUT C2INV C1INV CIS CM2 CM1 CM0
CVRCON CVREN CVROE CVRR CVRSS CVR3 CVR2 CVR1 CVR0
UCON — PPBRST SE0 PKTDIS USBEN RESUME SUSPN —
D
Leyenda: — = no implementado, se lee ‘0’. Las celdas sombreadas no las
usa el PORTA.
Nota 1: El RA6 y sus bits de direcciones y latch asociados se activan como
pines de E/S basándose en la configuración del oscilador; en otro caso, se leen como
‘0’.
REGISTROS PORTB, TRISB y LATB
El PORTB es un puerto bidireccional de 8bits de ancho. El registro de la
dirección de los datos es TRISB. Activar el bit TRISB (=1) hará que el pin
correspondiente de PORTB sea una entrada (es decir, pone el conductor
correspondiente de la salida en un modo alta impedancia). Borrar un bit de TRISB
(=0) hace que el pin correspondiente de PORTB sea una salida (es decir, pone el
contenido del latch de salida en el pin seleccionado).
El registro del latch de datos (LATB) sólo es memoria mapeada. Las
operaciones de lectura-modificación-escritura en el registro LATB lee y escribe el valor
del latch de salida del PORTB.
Cada uno de los pines de PORTB tiene un pull-up interno. Un solo bit de control
puede cambiar todo el pull-up. Esto se realiza borrando el bit, RBPU* (INTCON2<7>).
El pull-up cambia automáticamente cuando el pin se configura como salida. Se
inhabilita el pull-up en un reinicio.
Nota: En reinicio, RB4:RB0 se configuran como entradas analógicas por
defecto y se leen como ‘0’; Se configuran los bits RB7:RB5 como entradas digitales.
Programando el bit de configuración, PBADEN (CONFIG3H<1>), RB4:RB0 se
configuran alternativamente como entradas digitales en POR.
Cuatro de los pines de PORTB (RB7: RB4) tienen una interrupción “al cambiar”.
Solamente los pines configurados como entradas pueden provocar esta interrupción.
Cualquier pin RB7:RB4 configurado como salida se excluye de la interrupción “al
cambiar”. Los pines se comparan con el último valor leído en el PORTB.
La interrupción se puede utilizar para despertar al dispositivo del sleep. El
usuario, en la rutina del servicio de la interrupción, puede inhabilitar la interrupción de la
manera siguiente:
a) Una lectura o escritura en el PORTB (excepto con la instrucción MOVFF
x, PORTB). Esto terminará la condición de error de conexión.
b) Borrar el flag, RBIF.
Al leer el PORTB finalizará la condición de error de conexión y permitirá que el
flag, RBIF, sea borrado.
La interrupción “por cambio” se recomienda para despertar el dispositivo
cuando se presiona una tecla y operaciones en las que el PORTB se utiliza
solamente por su interrupción. No es recomendable interrogar el PORTB cuando
estamos usando la interrupción “por cambio”.
Los pines, RB2 y RB3, se multiplexan con el USB y sirven como las salidas para
un transmisor-receptor externo USB (configuración TRIS).
RB4 se multiplexa con CSSPP, el chip selecciona funcionar con puerto paralelo
(SPP) ajustando el TRIS.
PUERTO B:
Dispone de 8 líneas de E/S. Las funciones alternativas son:
● RB0: entrada analógica (AN12)/ interrupción externa 0 (INT0)/entrada de fallo
del ECCP (FLT0)/entrada de datos del SPI (SDI)/línea de datos del I2C (SDA)
● RB1: entrada analógica (AN10)/ interrupción externa 1 (INT1)/línea de reloj del
SPI (SDI)/línea de reloj del I2C (SDA)
● RB2: entrada analógica (AN8)/ interrupción externa 2 (INT2)/salida de datos del
USB (VCMO)
● RB3: entrada analógica (AN9)/ línea de E/S del CCP2 (CCP2)/salida de datos
del
USB (VPO)
● RB4: entrada analógica (AN11)/ interrupción por cambio en pin (KBI0)/ salida de
CS del SSP (CSSP)
● RB5: interrupción por cambio en pin (KBI1)/ línea de programación (PGM)
● RB6: interrupción por cambio en pin (KBI2)/ línea de programación (PGC)
● RB7: interrupción por cambio en pin (KBI3)/ línea de programación (PGD)
Resistencias de pull-up: Todas las líneas del puerto B disponen de resistencias de
pull-up internas que pueden ser activadas poniendo el bit RBPU del registro
INTCON2 a ‘0’ (RPBU=‘1’ después de un reset). Si una línea del puerto B se
configura como salida la resistencia de pull-up correspondiente se desactiva
automáticamente.
Por defecto, en el reset las líneas RB4..RB0 están programadas como entradas
analógicas. Existen dos formas de configurar RB4..RB0 como líneas de E/S
digitales:
● Poniendo a ‘0’ el bit PBADEN del registro de configuración CONFIG3H=> en el
reset RB4..RB0 se configuran como líneas de E/S digitales
● Si PBADEN=‘1’ (valor por defecto) se pueden configurar RB4..RB0 como líneas
del E/S digitales desactivando la función analógica:
EJEMPLO 10-2: INCIALIZACIÓN DE PORTB
CLRF PORTB ; Inicializar PORTB borrando los latch de salida de datos
CLRF LATB ; Otra método para borrar los latch de salida
MOVLW 0Eh ; Activar RB<4:0> como pines digitales de entrada-salida
MOVWF ADCON1 ; (requerido si el bit PBADEN está activo)
MOVLW 0CFh ; Valor usado para inicializar las direcciones de los datos
MOVWF TRISB ; Activa RB<3:0> como entradas
; RB<5:4> como salidas
; RB<7:6> como entrada
Otro ejemplo
MOVLW 0x07 ; Se desactiva la función de entrada analógica
MOVWF ADCON1 ; para las líneas RB0, RB1, RB2, RB3 y RB4
MOVLW 0xF0 ; Se configuran RB7, RB6, RB5 y RB4 como entradas
MOVWF TRISB ; y RB3, RB2, RB1 y RB0 como salidas
TABLA 10-3: RESUMEN DE ENTRADAS-SALIDAS DEL PORTB
Configuración Tipo
Pin Función Del TRIS E/S De E/S Descripción
0 salida salida digital LATB<0> salida de datos; no le afectan las entradas
analógicas
Buffer de PORTB<0> entrada de datos; cuando el bit RBPU
RB0 se borre, poca resistencia. Desactivada cuando se
1 entrada entrada TTL
activen las entradas analógicas(1)
AN12 1 entrada señal analógica Canal de entrada A/D 12.(1)
INT0 1 entrada Buffer de Entrada de interrupción externa 0
entrada Schmitt
FLT0 1 entrada Buffer de Entrada de PWM mejorado contra fallos (Módulo
entrada Schmitt ECCP1); activo por software
RB0/AN12/ Buffer de
INT0/FLT0/ SDI 1 entrada SPI entrada de datos (Módulo MSSP).
entrada Schmitt
SDI/SDA Salida de datos I2C (Módulo MSSP); tiene
1 salida salida digital
prioridad
Entrada de datos I2C (Módulo MSSP); el tipo de
SDA entrada depende de las características seleccionadas
1 entrada I2C/SMB
en el módulo.
0 salida salida digital LATB<1> salida de datos; no le afectan las entradas
analógicas
Buffer de PORTB<1> entrada de datos; cuando el bit RBPU
RB1 se borre, poca resistencia. Desactivada cuando se
1 entrada entrada TTL
activen las entradas analógicas(1)
AN10 1 entrada señal analógica Canal de entrada A/D 10.(1)
INT1 1 entrada Buffer de Entrada de interrupción externa 1
entrada Schmitt
0 salida salida digital Salida de reloj SPI (Módulo MSSP); tiene prioridad
sobre el puerto de datos.
RB1/AN10/ SCK Buffer de
INT1/SCK/ 1 entrada Entrada de reloj SPI (Módulo MSSP).
entrada Schmitt
SCL
0 salida salida digital Salida de reloj I2C (Módulo MSSP); tiene
prioridad
SCL 1 entrada I2C/SMB Entrada de reloj I2C (Módulo MSSP); el tipo de
entrada
0 salida salida digital LATB<2> salida de datos; no le afectan las entradas
analógicas
Buffer de PORTB<2> entrada de datos; cuando el bit RBPU
RB2 se borre, poca resistencia. Desactivada cuando se
1 entrada entrada TTL
activen las entradas analógicas(1)
AN8 1 entrada señal analógica Canal de entrada A/D 8.(1)
RB2/AN8/
INT2/VMO INT2 1 entrada Buffer de Entrada de interrupción externa 2
entrada Schmitt
VMO 0 salida salida digital Salida de datos del transmisor externo USB VMO.
0 salida salida digital LATB<3> salida de datos; no le afectan las entradas
analógicas
Buffer de PORTB<3> entrada de datos; cuando el bit RBPU
RB3 se borre, poca resistencia. Desactivada cuando se
1 entrada entrada TTL
activen las entradas analógicas(1)
AN9 1 entrada señal analógica Canal de entrada A/D 9.(1)
RB3/AN9/ 0 salida salida digital Salida del comparador CCP2 y del PWM.
CCP2/VPO
CCP2(2) 1 entrada Buffer de Capturador de entrada CCP2.
entrada Schmitt
VPO 0 salida salida digital Salida de datos del transmisor externo USB VPO.
0 salida salida digital LATB<4> salida de datos; no le afectan las entradas
analógicas
Buffer de PORTB<4> entrada de datos; cuando el bit RBPU
RB4 se borre, poca resistencia. Desactivada cuando se
1 entrada entrada TTL
activen las entradas analógicas(1)
AN11 1 entrada señal analógica Canal de entrada A/D 11.(1)
RB4/AN11/
KBI0/CSSPP KBI0 1 entrada Buffer de Interrupción al cambiar.
entrada TTL
(
CSSPP 0 salida salida digital Salida de control del chip select de SPP.
4)
0 salida salida digital LATB<5> salida de datos.
RB5 Buffer de PORTB<5> entrada de datos; cuando el bit RBPU se
1 entrada
entrada TTL borre, poca resistencia.
KBI1 1 entrada Buffer de Interrupción al cambiar.
RB5/KBI1/ entrada TTL
PGM Modo de programación de suministro único
Buffer de
PGM x entrada entrada Schmitt (ICSP™). Activo por el bit LVP; todas las funciones
de los demás pines desactivadas.
0 salida salida digital LATB<6> salida de datos.
RB6 Buffer de PORTB<6> entrada de datos; cuando el bit RBPU se
1 entrada
entrada TTL borre, poca resistencia.
Buffer de
RB6/KBI2/ KBI2 1 entrada Interrupción al cambiar.
entrada TTL
PGC
Buffer de
PGC x entrada Reloj de entrada serie para operaciones ICSP e ICD.
entrada Schmitt (3)
0 salida salida digital LATB<7> salida de datos.
RB7 Buffer de PORTB<7> entrada de datos; cuando el bit RBPU se
1 entrada
entrada TTL borre, poca resistencia.
Buffer de
KBI3 1 entrada Interrupción al cambiar.
entrada TTL
RB7/KBI3/
PGD x salida salida digital Salida serie de datos para operaciones ICSP e ICD.(3)
PGD Buffer de Entrada serie de datos para operaciones ICSP e ICD.
x entrada
entrada Schmitt (3)
Nota 1: Configuración en el POR determinada por el bit PBADEN. Los pines
se configuran como entradas analógicas cuando el bit PBADAN está activo y entradas
digitales cuando está borrado.
2: Selección de pin alternativo de CCP2 cuando CCP2MX = 0. La selección
natural es RC1.
3: Todas las funciones de los pines están desactivadas cuando ICSP o ICD se
activan.
4: Sólo en los dispositivos de 40/44-pines.
TABLA 10-4: EL RESUMEN DE REGISTROS ASOCIADOS AL PORTB
Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
LATB LATB7 LATB6 LATB5 LATB4 LATB3 LATB2 LATB1 LATB0
TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0
INTCON GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
INTCON2 RBPU* INTEDG0 INTEDG1 INTEDG2 — TMR0IP — RBIP
INTCON3 INT2IP INT1IP — INT2IE INT1IE — INT2IF INT1IF
ADCON1 — — VCFG1 VCFG0 PCFG3 PCFG2 PCFG1 PCFG0
SPPCON(1 — — — — — — SPPOWN SPPEN
)
SPPCFG(1 CLKCFG1 CLKCFG0 CSEN CLK1EN WS3 WS2 WS1 WS0
)
UCON — PPBRST SE0 PKTDIS USBEN RESUME SUSPND —
Leyenda: — = no implementado, se lee como ‘0’. Las celdas sombreadas no se
utilizan para el PORTB.
Nota: Estos registro son solo para los dispositivos de 28pines.
10.1 REGISTROS PORTC, TRISC Y LATC
El PORTC es un puerto bidireccional de 7bits de ancho. El registro de la
dirección de los datos es TRISC. Activar el bit TRISC (=1) hará que el pin
correspondiente de PORTC sea una entrada (es decir, pone el conductor
correspondiente de la salida en un modo alta impedancia). Borrar un bit de TRISC
(=0) hace que el pin correspondiente de PORTC sea una salida (es decir, pone el
contenido del latch de salida en el pin seleccionado).
En los dispositivos PIC18F2455/2550/4455/4550, el pin RC3 no está
implementado.
El registro del latch de datos (LATC) sólo es memoria mapeada. Las
operaciones de lectura-modificación-escritura en el registro LATC lee y escribe el valor
del latch de salida del PORTC.
PORTC se multiplexa sobre todo con los módulos de comunicación serie,
incluyendo el EUSART, el módulo MSSP y el módulo USB. A excepción de RC4 y
RC5, el PORTC utiliza buffer de disparo de entrada Schmitt.
Los pines RC4 y RC5 se multiplexan con el módulo USB. Dependiendo de la
configuración del módulo, pueden servir como las líneas de datos diferenciales para el
transmisor-receptor del USB del chip, o las entradas de datos del transmisor-receptor
del USB externo. RC4 y RC5, el PORTC tiene buffer de entrada TTL en lugar de los
buffer Schmitt de los otros pines.
RC4 y RC5 no tienen bits de TRISC asociados a ellos. Como puertos digitales,
sólo pueden funcionar como entradas digitales. Cuando se configura para operaciones
con USB, la dirección de los datos se determina por la configuración y el estado del
módulo USB en ese momento. Si se utiliza un transmisor-receptor externo, siempre
funcionarán RC4 y RC5 como entradas del transmisor-receptor. Si se utiliza el
transmisor-receptor del chip, la dirección de los datos se determina por la operación
que se realiza por el módulo en el momento.
Cuando se permite el transmisor-receptor externo, RC2 sirve como la salida de
control del transmisor-receptor.
Al permitir funciones periféricas en los pines de PORTC con excepción de RC4
y de RC5, hay que tener cuidado al definir los bits de TRIS. Algunos periféricos
eliminan el bit TRIS para configurar un pin como salida, mientras que otros periféricos
activan el bit TRIS para configurar un pin como entrada.
Nota: En un reset por subida de tensión, estos pines, excepto RC4 y RC5, se
configuran como entradas digitales. Para utilizar los pines RC4 y RC5 como entradas
digital, el módulo USB debe desactivarse (UCON<3>=0) y en el chip el transmisor-
receptor del USB debe desactivarse también (UCFG<3>=1).
El contenido del registro de TRISC afectado por el periférico se elimina. La
lectura de TRISC siempre devuelve el contenido actual, aun cuando un dispositivo
periférico puede eliminar uno o más pines.
PUERTO C:
Dispone de 5 líneas de E/S (RC0, RC1, RC2, RC6 y RC7) y 2 líneas de solo
entrada
(RC4 y RC5). Las funciones alternativas son:
● RC0: salida del oscilador del Temp. 1 (T1OSO)/ entrada de contador de los
Temp. 1 y 3 (T13CKI)
● RC1: entrada del oscilador del Temp. 1 (T1OSI)/ línea de E/S del CCP2 (CCP2)/
salida OE del transceiver del USB (UOE)
● RC2: línea de E/S del CCP1 (CCP1)/ salida PWM del ECCP1 (P1A)
● RC4: línea menos del bus USB (D-) / línea de entrada del USB (VM)
● RC5: línea más del bus USB (D-) / línea de entrada del USB (VP)
● RC6: salida de transmisión del EUSART (TX)/ línea de reloj del EUSART (CK)
● RC7: entrada de recepción del EUSART (RX)/ línea de datos síncrona del
EUSART (DT)/ salida de datos del SPI (SDO)
En el reset todas las líneas del puerto C quedan configuradas como entradas
digitales.
EJEMPLO 10-3: INCIALIZACIÓN DE PORTC
CLRF PORTC ;Inicializar PORTC borrando los latch de salida de
datos CLRF LATC ;Otra método para borrar los latch de salida
MOVLW 07h ;Valor usado para inicializar las direcciones de los
datos MOVWF TRISC ;Activa RC<5:0> como salidas
;RC<7:6> como entradas
TABLA 10-5: RESUMEN DE ENTRADAS-SALIDAS DEL PORTC
Ajustes
Pin Función del TRIS E/S Tipo de E/S Descripción
RC0 0 S salida digital LATC<0> salida de datos.
1 E Buffer de PORTC<0> entrada de datos.
entrada Schmitt
RC0/T1OS Salida del oscilador del Timer1; activo cuando se active el oscilador
O/ T1OSO x S señal analógica
del Timer1. Inhabilita las E/S digitales.
T13CKI
T13CKI 1 E Buffer de Entrada del contador Timer1/Timer3.
entrada Schmitt
0 S salida digital LATC<1> salida de datos.
RC1 1 E Buffer de PORTC<1> entrada de datos.
entrada Schmitt
Entrada del oscilador Timer1; activo cuando se active el oscilador
T1OSI x E señal analógica
Timer1. Desactiva las E/S digitales.
RC1/T1OSI
/ 0 S salida digital Salida del comparador CCP2 y del PWM output; tiene prioridad
CCP2/UOE (1) sobre el puerto de datos.
CCP2
* 1 E Buffer de Entrada de captura CCP2.
entrada Schmitt
UOE* 0 S salida digital Salida del transmisor OE externo del USB.
0 S salida digital LATC<2> salida de datos.
RC2 1 E Buffer de PORTC<2> entrada de datos.
entrada Schmitt
0 S salida digital Salida del comparador ECCP1 y del PWM output; tiene prioridad
sobre el puerto de datos.
CCP1 Buffer de
1 E Entrada de captura ECCP1.
RC2/CCP1/ entrada Schmitt
P1A Salida ECCP1 y PWM mejorado, canal A; tiene prioridad sobre el
0 S salida digital puerto de datos. Tiene que configurarse como tri-estado durante los
P1A(3)
eventos de caída del PWM mejorado.
Buffer de PORTC<4> entrada de datos; desactivado cuando el modulo
RC4 —(2) E
entrada TTL transmisor del USB del chip esté activo.
S transmisor USB Línea de salida del bus USB diferencial negativo USB (transmisor
—(2) interno).
RC4/D- D- Línea de entrada del bus USB diferencial negativo USB (transmisor
—(2) E transmisor USB
/VM interno).
VM E Buffer de Entrada del USB VM externo.
—(2) entrada TTL
Buffer de PORTC<5> entrada de datos; desactivado cuando el modulo
RC5 —(2) E
entrada TTL transmisor del USB del chip esté activo.
—(2) S transmisor USB Línea de salida del bus USB diferencial positivo USB (transmisor
D+ interno).
RC5/D+/V E transmisor USB Línea de entrada del bus USB diferencial positivo USB (transmisor
—(2) interno).
P
VP (2) E Buffer de Entrada del USB VP externo.
— entrada TTL
0 S salida digital LATC<6> salida de datos.
RC6 1 E Buffer de PORTC<6> entrada de datos.
entrada Schmitt
Salida de transmisión serie asíncrona (módulo EUSART); tiene
TX 0 S salida digital
prioridad sobre el puerto de datos. El usuario tiene que configurarla
RC6/TX/C como salid.
Salida de transmisión serie síncrona (módulo EUSART); tiene
K 0 S salida digital
prioridad sobre el puerto de datos.
CK Buffer de
1 E Entrada del reloj serie síncrono (Módulo EUSART).
entrada Schmitt
0 S salida digital PORTC<7> salida de datos
1 E Buffer de PORT<7> entrada de datos
RC7
entrada Schmitt
RX 1 E Buffer de Entrada de datos del receptor serie asíncrono (módulo EUSART).
entrada Schmitt
1 S salida digital Salida serie de datos síncrona (modulo EUSART); tiene prioridad
sobre SPI y el puerto de datos.
DT Buffer de Entrada de datos serie síncrona (módulo EUSART). El usuario tiene
1 E
entrada Schmitt que configurarla como entr.
SDO 0 S salida digital Salida de datos SPI (módulo MSSP); tiene prioridad sobre el puerto
de datos.
Nota 1: Asignación del pin por defecto. La asignación del pin alternativa es RB3 (cuando CCP2MX
= 0).
2: RC4 y RC5 no tienen bits correspondientes de TRISC. En el modo de puertos estos pines son
sólo entradas. La dirección de los datos del USB se determina por la configuración del USB.
3: Solamente dispositivos de 40/44pines.
TABLA 10-6: EL RESUMEN DE REGISTROS ASOCIADOS AL PORTC
Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
PORTC RC7 RC6 RC5(1) RC4(1) — RC2 RC1 RC0
LATC LATC7 LATC6 — — — LATC2 LATC1 LATC0
TRISC TRISC7 TRISC6 — — — TRISC2 TRISC1 TRISC0
UCON — PPBRS SE0 PKTDIS USBEN RESUME SUSPN —
T D
Leyenda: — = no implementado, se lee como ‘0’. Las celdas sombreadas no
se utilizan para el PORTC.
Nota 1: RC5 y RC4 están solamente disponibles como puertos cuando el
módulo del USB está desactivado (UCON<3> = 0).
10.1 REGISTROS PORTD, TRISD Y LATD
Nota: El PORTD solamente está disponible en dispositivos de 40/44pines.
El PORTD es un puerto bidireccional de 8bits de ancho. El registro de la
dirección de los datos es TRISD. Activar el bit TRISD (=1) hará que el pin
correspondiente de PORTD sea una entrada (es decir, pone el conductor
correspondiente de la salida en un modo alta impedancia). Borrar un bit de TRISD
(=0) hace que el pin correspondiente de PORTD sea una salida (es decir, pone el
contenido del latch de salida en el pin seleccionado).
El registro del latch de datos (LATD) sólo es memoria mapeada. Las
operaciones de lectura-modificación-escritura en el registro LATD lee y escribe el
valor del latch de salida del PORTD.
Todos los pines del PORTD están implementados con buffer de entrada de
disparadores Shmitt. Cada pin se puede configurar independientemente como
entrada o salida.
Cada uno de los pines de PORTD tiene un pull-up interno. Un solo bit de
control puede cambiar todo el pull-up. Esto se realiza borrando el bit, RDPU
(PORTE<7>). El pull-up cambia automáticamente cuando el pin se configura como
salida. Se inhabilita el pull-up en un reinicio.
Tres de los pines de PORTD se multiplexan con salidas, P1B, P1C y P1D, del
módulo CCP.
Nota: En un reset por subida de tensión estos pines se configuran como
entrada de datos digital.
El PORTD también se puede configurar como un puerto paralelo (SPP) de
8bits de ancho. En este modo, los Buffers de entrada son TTL.
Nota: Cuando se utiliza el modo PWM mejorado con salidas dobles o
cuádruples, las funciones del MSSP en el PORTD se desactivan automáticamente.
PUERTO D:
Dispone de 8 líneas de E/S. Las funciones alternativas son:
● RD0: línea de datos del SPP (SPP0)
● RD1: línea de datos del SPP (SPP1)
● RD2: línea de datos del SPP (SPP2)
● RD3: línea de datos del SPP (SPP3)
● RD4: línea de datos del SPP (SPP4)
● RD5: línea de datos del SPP (SPP5) / salida PWM del ECCP1 (P1B)
● RD6: línea de datos del SPP (SPP6) / salida PWM del ECCP1 (P1C)
● RD7: línea de datos del SPP (SPP7) / salida PWM del ECCP1 (P1D)
Resistencias de [Link]: Todas las líneas del puerto D disponen de resistencias de
pull-up internas que pueden ser activadas poniendo el bit RDPU del registro
PORTE a ‘1’ (RPDU=‘0’ después de un reset). Si una línea del puerto D se
configura como salida la resistencia de pull-up correspondiente se desactiva
automáticamente.
EJEMPLO 10-4: INCIALIZACIÓN DE PORTD
CLRF PORTD ;Inicializar PORTD borrando los latch de salida de datos
CLRF LATD ;Otro método para borrar los latch de salida
MOVLW 0C7h ;Valor usado para inicializar las direcciones de los datos
MOVWF TRISD ;Activa RD<3:0> como entradas
;RD<5:4> como salidas
;RD<7:6> como entradas
TABLA 10-7: RESUMEN DE ENTRADAS-SALIDAS DEL PORTD
Ajustes
Pin Función del TRIS E/S Tipo de E/S Descripción
0 salida Salida digital LATD<0> salida de datos.
RD0 1 entrad Buffer de PORTD<0> entrada de datos.
a entrada
1 salida Salida digital SPP<0> salida de datos; tiene prioridad sobre el puerto
RD0/SPP0 de datos.
SPP0 Buffer de
1 entrad SPP<0> entrada de datos.
a entrada
0 salida Salida digital LATD<1> salida de datos.
RD1 1 entrad Buffer de PORTD<1> entrada de datos.
a entrada
1 salida Salida digital SPP<1> salida de datos; tiene prioridad sobre el puerto
RD1/SPP1 de datos.
SPP1
1 entrad Buffer de SPP<1> entrada de datos.
a entrada
0 salida Salida digital LATD<2> salida de datos.
RD2 1 entrad Buffer de PORTD<2> entrada de datos.
a entrada
1 salida Salida digital SPP<2> salida de datos; tiene prioridad sobre el puerto
de datos.
SPP2 Buffer de
RD2/SPP2 1 entrad SPP<2> entrada de datos.
a entrada
0 salida Salida digital LATD<3> salida de datos.
RD3 1 entrad Buffer de PORTD<3> entrada de datos.
a entrada
1 salida Salida digital SPP<3> salida de datos; tiene prioridad sobre el puerto
RD3/SPP3 de datos.
SPP3 Buffer de
1 entrad SPP<3> entrada de datos.
a entrada
0 salida Salida digital LATD<4> salida de datos.
RD4 1 entrad Buffer de PORTD<4> entrada de datos.
a entrada
1 salida Salida digital SPP<4> salida de datos; tiene prioridad sobre el puerto
RD4/SPP4 de datos.
SPP4
1 entrad Buffer de SPP<4> entrada de datos.
a entrada
0 salida Salida digital LATD<5> salida de datos
RD5 1 entrad Buffer de PORTD<5> entrada de datos
a entrada
1 salida Salida digital SPP<5> salida de datos; tiene prioridad sobre el puerto
de datos.
SPP5 Buffer de
1 entrad SPP<5> entrada de datos.
RD5/SPP5/P1B entrada
a
Salida ECCP1 y PWM mejorado, canal B; tiene
P1B 0 salida Salida digital
prioridad sobre el puerto de datos. (1)
0 salida Salida digital LATD<6> salida de datos.
RD6 Buffer de
1 entrad PORTD<6> entrada de datos.
a entrada
1 salida Salida digital SPP<6> salida de datos; tiene prioridad sobre el puerto
SPP6 de datos.
1 entrad Buffer de SPP<6> entrada de datos.
RD6/SPP6/P1C entrada
a
Salida ECCP1 y PWM mejorado, canal C; tiene
P1C 0 salida Salida digital
prioridad sobre el puerto de datos. (1)
0 salida Salida LATD<7> salida de datos.
RD7 digital
1 entrad Buffer de PORTD<7> entrada de datos.
a entrada
1 salida Salida SPP<7> salida de datos; tiene prioridad sobre el puerto
digital de datos.
SPP7 Buffer de
1 entrad SPP<7> entrada de datos.
RD7/SPP7/P1D entrada
a
Salida ECCP1 y PWM mejorado, canal D; tiene prioridad
P1D 0 salida Salida
sobre el puerto de datos. (1)
digital
Nota 1: Puede que configurarse como tri-estado en los flancos de
bajada del PWM mejorado.
TABLA 10-8: RESUMEN DE REGISTROS ASOCIADOS AL PORTD
Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
(3)
PORTD RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0
(3)
LATD LATD7 LATD6 LATD5 LATD4 LATD3 LATD2 LATD1 LATD0
(3)
TRISD TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISD0
(3)
PORTE RDPU — — — RE3(1,2)
RE2 (3)
RE1(3)
RE0(3)
(3) (3)
CCP1CO P1M1 P1M0 DC1B1 DC1B0 CCP1M CCP1M2 CCP1M1 CCP1M
N (
— — — — 3
— — SPPOWN 0
SPPEN
SPPCON
3)
Leyenda: — = no implementado, se lee como ‘0’. Las celdas
sombreadas no se utilizan para el PORTD.
Nota 1: Implementado solamente cuando la función Master
Clean está desactivada (configuración del bit MCLRE=0).
2: RE3 es el único bit PORTE implementado en los dispositivos
de 28 y 40/44pines. El resto de los bits se implementan cuando lo está el
PORTE (es decir, en los dispositivos 40/44pines).
3: Estos registros y/o bits no están implementados en los
dispositivos de
28pines.
10.2 REGISTROS PORTE, TRISE Y LATE
Dependiendo del PIC18F2455/2550/4455/4550 seleccionado, el PORTE se
pone en ejecución en dos maneras diferentes.
Para los dispositivos 40/44pines, el PORTE es un puerto de 4bits de ancho.
Tres pines (RE0/AN5/CK1SPP, RE1/AN6/CK2SPP y RE2/AN7/OESPP) se configuran
individualmente como entradas o salidas. Estos pines tienen buffer de entrada tipo
disparador Shmitt. Cuando se seleccionan como entrada analógica, éstos pines se
leerán como ‘0’s.
El registro de dirección de los datos es TRISE. Activar el bit TRISE (=1) hará
que el pin correspondiente de PORTE sea una entrada (es decir, pone el conductor
correspondiente de la salida en un modo alta impedancia). Borrar un bit de TRISE (=0)
hace que el pin correspondiente de PORTE sea una salida (es decir, pone el contenido
del latch de salida en el pin seleccionado).
Además de los datos del puerto, el registro PORTE también contiene el bit de
control RDPU (PORTE<7>); esto permite o inhabilita el pull-up del PORTD.
TRISE controla la dirección de los pines RE, incluso cuando se utilizan como
entradas analógicas. El usuario debe cerciorarse de mantener los pines configurados
como entradas cuando use las analógicas.
Nota: En un reset por subida de tensión, RE2:RE0 se configuran como entradas
analógicas.
El registro del latch de datos (LATE) sólo es memoria mapeada. Las
operaciones de lectura-modificación-escritura en el registro LATE lee y escribe el valor
del latch de salida del PORTE.
El cuarto pin PORTE (MCLR*/VPP/RE3) sólo es un pin de entrada. Su operación
se controlada con el bit de configuración MCLRE. Cuando se selecciona como puerto
(MCLRE = 0), funciona como una entrada digital; como tal, no tiene bits TRIS o LAT
asociados. Si no, funciona como entrada Master Clear del dispositivo. En cualquier
configuración, RE3 también funciona como entrada de tensión de programación.
Nota: En un reset de subida de tensión, se activa RE3 como una entrada digital
solamente si la función de Master Clear está desactivada.
PUERTO E:
Dispone de 3 líneas de E/S (RE0, RE1 y RE2) y 1 línea de solo entrada (RE3). Las
funciones alternativas son:
● RE0: entrada analógica (AN5)/ salida de reloj 1 del SPP (CK1SPP)
● RE1: entrada analógica (AN6)/ salida de reloj 2 del SPP (CK2SPP)
● RE2: entrada analógica (AN7)/ salida de habilitación del SPP (OESPP)
● RE3: Línea de reset externo (MCLR) / línea de programación (VPP)
En el reset todas las líneas RE2..RE0 se configuran como entradas analógicas.
Para poder utilizarlas como líneas digitales de E/S hay que desactivar la función
analógica:
EJEMPLO 10-5: INCIALIZACIÓN DE PORTE
CLRF PORTE ; Inicializar PORTE borrando los latch de salida de
datos CLRF LATE ; Otra método para borrar los latch de salida
MOVLW 0Ah ; Configura A/D como entradas
MOVWF ADCON1 ; digitales
MOVLW 03h ; Valor usado para inicializar las direcciones de los
; datos
MOVLW 07h ; Desactiva los comparadores
MOVWF CMCON ;
MOVWF TRISE ; Activa RE<0> como entradas
; RE<1> como salidas
; RE<2> como entradas
Otra manera
MOVLW 0FH ; Se desactiva la función de entrada analógica
MOVWF ADCON1 ; para las líneas RE0, RE1 y RE2
MOVLW 06H ; Se configuran RE2 y RE1 como entradas
MOVWF TRISE ; y RE0 como salida
10.5.1 PORTE EN LOS DISPOSITIVOS DE 28-PIN
En los dispositivos de 28pines, el PORTE sólo está disponible cuando el Master
Clear está desactivado (MCLRE = 0). En éstos los casos, PORTE son de un solo bit,
puerto de entrada de RE3 solamente. El pin funciona según lo descrito previamente.
REGISTRO 10-1: REGISTRO PORTE
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
(3) - - - (1,2) (3) (3) (1)
RDPU RE3 RE2 RE1 RE0
R/W-0 U-0 U-0 U-0 R/W-x R/W-0 R/W-0 R/W-0
BIT 7 RDPU: Bit activador del pull-up del PORD:
1= Pull-up activado
0= Pull-up desactivado
BIT 3-0 RE3:RE0: Bits de entrada de datos del PORTE(1,2,3)
Nota 1: puesto en ejecución solamente cuando la funcionalidad clara principal
es lisiada (configuración de MCLRE mordida = 0); si no, leer como `0'.
2: RE3 es el único bit de PORTE implementado todos los dispositivos.
El resto de los bits sólo se implementan en los dispositivos de 40/44pines.
3: No implementado en los dispositivos de 28pines; se lee ‘0’.
TABLA 10-9: RESUMEN DE ENTRADAS-SALIDAS DEL PORTE
Ajustes
Pin Función del TRIS E/S Tipo de E/S Descripción
0 salida Salida digital LATE<0> salida de datos; no le afectan las entradas
analógicas.
Buffer de PORTE<0> entrada de datos; desactivado cuando se activan
RE0 entrada
1 entrada las entradas analógicas.
Schmitt
RE0/AN5/ Señal
AN5 1 entrada Entrada A/D canal 5; configuración por defecto en un POR.
CK1SPP analógica
CK1SPP 0 salida Salida digital Salida SPP reloj 1 (SPP activo).
0 salida Salida digital LATE<1> salida de datos; no le afectan las entradas
analógicas.
Buffer de PORTE<1> entrada de datos; desactivado cuando se activan
RE1 entrada
1 entrada las entradas analógicas.
Schmitt
RE1/AN6/ Señal
AN6 1 entrada A/D input channel 6; configuración por defecto en un POR.
CK2SPP analógica
CK2SPP 0 salida Salida digital Salida SPP reloj 2 (SPP activo).
0 salida Salida digital LATE<2> salida de datos; no le afectan las entradas
analógicas.
Buffer de PORTE<2> entrada de datos; desactivado cuando se activan
RE2 entrada
1 entrada las entradas analógicas.
Schmitt
RE2/AN7/ Señal
AN7 1 entrada Entrada A/D canal 7; configuración por defecto en un POR.
OESPP analógica
OESPP 0 salida Salida digital Salida active SPP (SPP activo).
Buffer de
MCLR* entrada entrada Entrada externa Clear; activa cuando el bit MCLRE esté activo.
—(1) Schmitt
Señal Detección de alta tensión, utilizado en el modo de detección de
VPP — (1) entrada
MCLR*/VPP/ analógica entrada ICSP. Siempre disponible sin importar el modo del pin.
RE3 Buffer de PORTE<3> entrada de datos; enabled when MCLRE
RE3 entrada entrada Configuration bit is clear.
— (1) Schmitt
Nota 1: RE3 no tiene un bit correspondiente TRISE<3>. Este pin
es siempre una entrada sin importar modo.
TABLA 10-10: EL RESUMEN DE REGISTROS ASOCIADOS AL PORTE
Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
(3)
PORTE RDPU — — — RE3(1,2) RE2(3) RE1(3) RE0(3)
(3)
LATE — — — — — LATE2 LATE1 LATE0
(3)
TRISE — — — — — TRISE TRISE1 TRISE0
ADCON1 — — VCFG1 VCFG0 PCFG3 2
PCFG2 PCFG1 PCFG0
CMCON C2OUT C1OUT C2INV C1INV CIS CM2 CM1 CM0
(3)
SPPCON — — — — — — SPPOWN SPPEN
(3)
SPPCFG CLKCFG1 CLKCFG0 CSEN CLK1EN WS3 WS2 WS1 WS0
Leyenda: — = no implementado, se lee como ‘0’. Las celdas sombreadas no se
utilizan para el PORTE.
Nota 1: Implementado sólo cuando la función Master Clear está
desactivada (configuración del bit MCLRE=0).
2: RE3 es el único bit de PORTE implementado en todos los
dispositivos. Se implementan el resto de los bits solamente cuando se pone en ejecución
PORTE (es decir, los dispositivos 40/44-pin).
3: Estos registros o bits no están implementados en los dispositivos de
28 el pin.
2.5. Manejo de Interrupciones.
SISTEMA DE INTERRUPCIONES:
→El µC PIC18F4550 dispone de 21 fuentes de interrupciones. Se distinguen dos
grupos de interrupciones:
Grupo general de interrupciones:
Grupo de interrupciones de periféricos
→Se dispone de dos niveles de prioridad:
Nivel alto vectorizado en la dirección 0008H
Nivel bajo, vectorizado en la dirección 0018H
Todas las interrupciones pueden ser programadas con cualquiera de las dos
prioridades, salvo la interrupción externa 0 (que siempre tiene alta prioridad).
→Todas las interrupciones disponen de 3 bits de configuración (excepto la
interrupción externa 0 que tiene dos):
Bit de habilitación de interrupción: permite habilitar a nivel individual la
interrupción.
Flag de interrupción: se pone a ‘1’ cuando se produce la condición de
interrupción independientemente de si la interrupción está habilitada o no.
Este flag debe ponerse ‘0’ por software cuando se procesa la interrupción.
Bit de prioridad de interrupción: establece si la interrupción es de alta o de
baja prioidad (este bit no está disponible para la interrupción externa 0).
Hay diez registros que se utilizan para controlar las operaciones de interrupción.
Estos registros son:
RCON
INTCON
INTCON2
INTCON3
PIR1, PIR2
PIE1, PIE2
IPR1, IPR2
REGISTRO RCON
– IPEN: Bit de habilitación de prioridades en las interrupciones * IPEN=‘0’: Sistema
de prioridad en las interrupciones deshabilitado
* IPEN=‘1’: Sistema de prioridad en las interrupciones habilitado
REGISTRO INTCON
– GIE/GIEH: Bit de habilitación global de las interrupciones. Su función depende
del valor de IPEN:
IPEN=‘0’:
* GIE=‘0’: Interrupciones deshabilitadas a nivel global
* GIE=‘1’: Interrupciones habilitadas a nivel global
IPEN=‘1’:
* GIEH=‘0’: Interrupciones de alta prioridad deshabilitadas a nivel global
* GIEH=‘1’: Interrupciones de alta prioridad habilitadas a nivel global
– PEIE/GIEL: Bit de habilitación global de las interrupciones de periféricos. Su
función depende del valor de IPEN:
IPEN=‘0’:
* PEIE=‘0’: Interrupciones de periféricos deshabilitadas a nivel global
* PEIE=‘1’: Interrupciones de periféricos habilitadas a nivel global
IPEN=‘1’:
* GIEL=‘0’: Interrupciones de baja prioridad deshabilitadas a nivel global
* GIEL=‘1’: Interrupciones de baja prioridad habilitadas a nivel global
– TMR0IE: Bit de habilitación de la interrupción de desbordamiento del
Temporizador 0
* TMR0IE=‘0’: Interrupción de desbordamiento del Temporizador 0
deshabilitada
* TMR0IE=‘1’: Interrupción de desbordamiento del Temporizador 0 habilitada
– INT0IE: Bit de habilitación de la interrupción externa 0
* INT0IE=‘0’: Interrupción externa 0 deshabilitada
* INT0IE=‘1’: Interrupción externa 0 habilitada
– RBIE: Bit de habilitación de la interrupción por cambio en el Puerto B
* RBIE=‘0’: Interrupción por cambio en el Puerto B deshabilitada
* RBIE=‘1’: Interrupción por cambio en el Puerto B habilitada
– TMR0IF: Flag de la interrupción de desbordamiento del Temporizador 0
* TMR0IF=‘0’: No se ha producido desbordamiento del Temporizador 0
* TMR0IF=‘1’: Se ha producido desbordamiento del Temporizador 0
– INT0IF: Flag de la interrupción externa 0
* INT0IF=‘0’: No se ha producido un flanco en la líneaRB0/INT0
* INT0IF=‘1’: Se ha producido un flanco en la línea RB0/INT0
– RBIF: Flag de la interrupción por cambio en el Puerto B
* RBIF=‘0’: No se ha producido ningún cambio en ninguna de las
líneasRB7..RB4
* RBIF=‘1’: Se ha producido cambio en alguna de las líneas RB7..RB4
REGISTRO INTCON2
– RBPU: Bit de habilitación de las resistencias de pull-up del Puerto B:
* RBPU=‘0’: Las resistencias de pull-up del Puerto B están activadas
* RBPU=‘1’: Las resistencias de pull-up del Puerto B están desactivadas
– INTEDG0: Bit de selección de flanco de la interrupción externa 0:
* INTEDG0=‘0’: La interrupción externa 0 se dispara por flanco de bajada
* INTEDG0=‘1’: La interrupción externa 0 se dispara por flanco de subida
– INTEDG1: Bit de selección de flanco de la interrupción externa 1:
* INTEDG1=‘0’: La interrupción externa 1 se dispara por flanco de bajada
* INTEDG1=‘1’: La interrupción externa 1 se dispara por flanco de subida
– INTEDG2: Bit de selección de flanco de la interrupción externa 2:
* INTEDG2=‘0’: La interrupción externa 2 se dispara por flanco de bajada
* INTEDG2=‘1’: La interrupción externa 2 se dispara por flanco de subida
– TMR0IP: Bit de selección de prioridad de la interrupción del Temporizador 0
* TMR0IP=‘0’: Prioridad baja para la interrupción del Temporizador0
* TMR0IP=‘1’: Prioridad alta para la interrupción del Temporizador 0
– RBIP: Bit de selección de prioridad de la interrupción por cambio en el Puerto B
* RBIP=‘0’: Prioridad baja para la interrupción por cambio en el PuertoB
* RBIP=‘1’: Prioridad alta para la interrupción por cambio en el PuertoB
REGISTRO INTCON3
– INT2IP: Bit de selección de prioridad de la interrupción externa 2
* INT2IP=‘0’: Prioridad baja para la interrupción externa 2
* INT2IP=‘1’: Prioridad alta para la interrupción externa 2
– INT1IP: Bit de selección de prioridad de la interrupción externa 1
* INT1IP=‘0’: Prioridad baja para la interrupción externa 1
* INT1IP=‘1’: Prioridad alta para la interrupción externa 1
– INT2IE: Bit de habilitación de la interrupción externa 2
* INT2IE=‘0’: Interrupción externa 2 deshabilitada
* INT2IE=‘1’: Interrupción externa 2 habilitada
– INT1IE: Bit de habilitación de la interrupción externa 1
* INT1IE=‘0’: Interrupción externa 1 deshabilitada
* INT1IE=‘1’: Interrupción externa 1 habilitada
– INT2IF: Flag de la interrupción externa 2
* INT2IF=‘0’: No se ha producido flanco en la líneaRB2/INT2
* INT2IF=‘1’: Se ha producido flanco en la línea RB2/INT2
– INT1IF: Flag de la interrupción externa 1
* INT1IF=‘0’: No se ha producido flanco en la líneaRB1/INT1
* INT1IF=‘1’: Se ha producido flanco en la línea RB1/INT1
REGISTRO PIR1
– SPPIF: Flag de la interrupción de lectura/escritura en el canal de transmisión de
datos en paralelo (SPP)
* SPPIF=‘0’: No se ha producido operación de lectura/escritura en el SPP
* SPPIF=‘1’: Se ha producido operación de lectura/escritura en el SPP
– ADIF: Flag de la interrupción del convertidor A/D
* ADIF=‘0’: No se ha completado la conversión A/D
* ADIF=‘1’: Se ha se ha completado una conversión
– RCIF: Flag de la interrupción de recepción del EUSART
* RCIF=‘0’: El búfer de recepción del EUSART (RCREG) está vacío
* RCIF=‘1’: El búfer de recepción del EUSART (RCREG) está lleno
– TXIF: Flag de la interrupción de transmisión del EUSART
* TXIF=‘0’: El búfer de recepción del EUSART (TXREG) está lleno
* TXIF=‘1’: El búfer de recepción del EUSART (RCREG) está vacío
– SSPIF: Flag de la interrupción del puerto serie síncrono (SSP)
* SSPIF=‘0’: A la espera de una recepción/transmisión
* SSPIF=‘1’: Se ha producido una transmisión/recepción
– CCP1IF: Flag de la interrupción del módulo 1 de Comparación/Captura/PWM
(CCP1)
Modo Captura:
* CCP1IF=‘0’: No se ha capturado el valor del Temporizador 1
* CCP1IF=‘1’: Se ha capturado el valor del Temporizador 1
Modo Comparación:
* CCP1IF=‘0’: No se ha producido igualdad con el valor del Temporizador 1
* CCP1IF=‘1’: Se ha producido igualdad con el valor del Temporizador 1
– TMR2IF: Flag de la interrupción de igualdad entre TMR2 y PR2
* TMR2IF=‘0’: No se ha producido igualdad con el valor del Temporizador 2 y el
valor del registro PR2
* TMR2IF=‘1’: Se ha producido igualdad con el valor del Temporizador 2 y el valor
del registro PR2
– TMR1IF: Flag de la interrupción de desbordamiento del Temporizador 1
* TMR1IF=‘0’: No se ha producido desbordamiento del Temporizador 1
* TMR1IF=‘1’: Se ha producido desbordamiento del Temporizador 1
REGISTRO PIR2
– OSCFIF: Flag de la interrupción de fallo en el oscilador
* OSCFIF=‘0’: El oscilador funciona correctamente
* OSCFIF=‘1’: Se ha producido un fallo en el oscilador. La señal de reloj ha sido
conmutada a INTOSC
– CMIF: Flag de la interrupción del comparador
* CMIF=‘0’: La entrada del comparador no ha cambiado
* CMIF=‘1’: La entrada del comparador ha cambiado
– USBIF: Flag de la interrupción del USB
* USBIF=‘0’: El módulo USB no ha generado una interrupción
* USBIF=‘0’: El módulo USB ha generado una interrupción
– EEIF: Flag de la interrupción de escritura en las memorias EEPROM/ Flash
* EEIF=‘0’: La operación de escritura en memoria EEPROM/Flash no se ha
iniciado o no ha concluido
* EEIF=‘1’: La operación de escritura en memoria EEPROM/Flash ha concluido
– BCLIF: Flag de la interrupción de colisión de bus en el SSP
* BCLIF=‘0’: No se ha producido colisión de bus en el SSP
* BCLIF=‘1’: Se ha producido colisión de bus en el SSP
– HLVIF: Flag de la interrupción de detección de tensión alta/baja
* HLVIF=‘0’: No se ha detectado ninguna condición de tensión alta o baja
* HLVIF=‘1’: Se ha detectado ninguna condición de tensión alta o baja
– TMR3IF: Flag de la interrupción de desbordamiento del Temporizador 3
* TMR3IF=‘0’: No se ha producido desbordamiento del Temporizador 3
* TMR3IF=‘1’: Se ha producido desbordamiento del Temporizador 3
– CCP2IF: Flag de la interrupción del módulo 2 de Comparación/Captura/PWM
(CCP2)
Modo Captura:
* CCP2IF=‘0’: No se ha capturado el valor del Temporizador 1 ni del Temporizador
3
* CCP2IF=‘1’: Se ha capturado el valor del Temporizador 1 o del Temporizador 3
Modo Comparación:
* CCP2IF=‘0’: No se ha producido igualdad con el valor del Temporizador 1 ni con
el Temporizador 3
* CCP2IF=‘1’: Se ha producido igualdad con el valor del Temporizador 1 o con el
Temporizador 3
REGISTRO PIE1
– SPPIE: Bit de habilitación de la interrupción de lectura/escritura en el canal de
transmisión de datos en paralelo (SPP)
* SPPIE=‘0’: Interrupción de lectura/escritura en el SPP no habilitada
* SPPIE=‘1’: Interrupción de lectura/escritura en el SPP habilitada
– ADIE: Bit de habilitación de la interrupción del convertidor A/D
* ADIE=‘0’: Interrupción del convertidor A/D no habilitada
* ADIE=‘1’: Interrupción del convertidor A/D habilitada
– RCIE: Bit de habilitación de la interrupción de recepción del EUSART
* RCIE=‘0’: Interrupción de recepción del EUSART no habilitada
* RCIE=‘1’: Interrupción de recepción del EUSART habilitada
– TXIE: Bit de habilitación de la interrupción de transmisión del EUSART
* TXIE=‘0’: Interrupción de transmisión del EUSART no habilitada
* TXIE=‘1’: Interrupción de transmisión del EUSART habilitada
– SSPIE: Bit de habilitación de la interrupción del puerto serie síncrono (SSP)
* SSPIE=‘0’: Interrupción del puerto serie síncrono (SSP) no habilitada
* SSPIE=‘1’: Interrupción del puerto serie síncrono (SSP) habilitada
– CCP1IE: Bit de habilitación de la interrupción del módulo 1 de
Comparación/Captura/PWM (CCP1)
* CCP1IE=‘0’: Interrupción del CCP1 no habilitada
* CCP1IE=‘1’: Interrupción del CCP1 habilitada
– TMR2IE: Bit de habilitación de la interrupción de igualdad entre TMR2 y PR2
* TMR2IE=‘0’: Interrupción de igualdad entre TMR2 y PR2 no habilitada
* TMR2IE=‘1’: Interrupción de igualdad entre TMR2 y PR2 habilitada
– TMR1IE: Bit de habilitación de la interrupción de desbordamiento del
Temporizador 1
* TMR1IE=‘0’: Interrupción de desbordamiento del Temporizador 1 no habilitada
* TMR1IE=‘1’: Interrupción de desbordamiento del Temporizador 1 habilitada
REGISTRO PIE2
– OSCFIE: Bit de habilitación de la interrupción de fallo en el oscilador
* OSCFIE=‘0’: Interrupción de fallo en el oscilador no habilitada
* OSCFIE=‘1’: Interrupción de fallo en el oscilador habilitada
– CMIE: Bit de habilitación de la interrupción del comparador
* CMIE=‘0’: Interrupción del comparador no habilitada
* CMIE=‘1’: Interrupción del comparador habilitada
– USBIE: Bit de habilitación de la interrupción del USB
* USBIE=‘0’: Interrupción del USB no habilitada
* USBIE=‘0’: Interrupción del USB habilitada
– EEIE: Bit de habilitación de la interrupción de escritura en las memorias
EEPROM/ Flash
* EEIE=‘0’: Interrupción de escritura en las memorias EEPROM/ Flash no
habilitada
* EEIE=‘1’: Interrupción de escritura en las memorias EEPROM/ Flash habilitada
– BCLIE: Bit de habilitación de la interrupción de colisión de bus en el SSP
* BCLIE=‘0’: Interrupción de colisión de bus en el SSP no habilitada
* BCLIE=‘1’: Interrupción de colisión de bus en el SSP habilitada
– HLVIE: Bit de habilitación de la interrupción de detección de tensión alta/baja
* HLVIE=‘0’: Interrupción de detección de tensión alta/baja no habilitada
* HLVIE=‘1’: Interrupción de detección de tensión alta/baja habilitada
– TMR3IE: Bit de habilitación de la interrupción de desbordamiento del
Temporizador 3
* TMR3IE=‘0’: Interrupción de desbordamiento del Temporizador 3 no habilitada
* TMR3IE=‘1’: Interrupción de desbordamiento del Temporizador 3 habilitada
– CCP2IE: Bit de habilitación de la interrupción del módulo 2 de
Comparación/Captura/PWM (CCP2)
* CCP2IE=‘0’: Interrupción del CCP2 no habilitada
* CCP2IE=‘1’: Interrupción del CCP2 habilitada
REGISTRO IPR1
– SPPIP: Bit de selección de prioridad de la interrupción de lectura/escritura en el
canal de transmisión de datos en paralelo (SPP)
* SPPIE=‘0’: Prioridad baja para la interrupción de lectura/escritura en el SPP
* SPPIE=‘1’: Prioridad alta para la interrupción de lectura/escritura en el SPP
– ADIP: Bit de selección de prioridad de la interrupción del convertidor A/D
* ADIE=‘0’: Prioridad baja para la interrupción del convertidor A/D
* ADIE=‘1’: Prioridad alta para la interrupción del convertidor A/D
– RCIP: Bit de selección de prioridad de la interrupción de recepción del EUSART
* RCIE=‘0’: Prioridad baja para la interrupción de recepción del EUSART
* RCIE=‘1’: Prioridad alta para la interrupción de recepción del EUSART
– TXIP: Bit de selección de prioridad de la interrupción de transmisión del
EUSART
* TXIE=‘0’: Prioridad baja para la interrupción de transmisión del EUSART
* TXIE=‘1’: Prioridad alta para la interrupción de transmisión del EUSART
– SSPIP: Bit de selección de prioridad de la interrupción del puerto serie síncrono
(SSP)
* SSPIE=‘0’: Prioridad baja para la interrupción del puerto serie síncrono (SSP)
* SSPIE=‘1’: Prioridad alta para la interrupción del puerto serie síncrono (SSP)
– CCP1IP: Bit de selección de prioridad de la interrupción del módulo 1 de
Comparación/Captura/PWM (CCP1)
* CCP1IE=‘0’: Prioridad baja para la interrupción del CCP1
* CCP1IE=‘1’: Prioridad alta para la interrupción del CCP1
– TMR2IP: Bit de selección de prioridad de la interrupción de igualdad entre TMR2
y PR2
* TMR2IE=‘0’: Prioridad baja para la interrupción de igualdad entre TMR2 y PR2
* TMR2IE=‘1’: Prioridad alta para la interrupción de igualdad entre TMR2 y PR2
– TMR1IP: Bit de selección de prioridad de la interrupción de desbordamiento del
Temporizador 1
* TMR1IE=‘0’: Prioridad baja para la interrupción de desbordamiento del
Temporizador 1
* TMR1IE=‘1’: Prioridad alta para la interrupción de desbordamiento del
Temporizador 1
REGISTRO IPR2
– OSCFIP: Bit de selección de prioridad de la interrupción de fallo en el oscilador
* OSCFIE=‘0’: Prioridad baja para la interrupción de fallo en el oscilador
* OSCFIE=‘1’: Prioridad alta para interrupción de fallo en el oscilador
– CMIP: Bit de selección de prioridad de la interrupción del comparador
* CMIE=‘0’: Prioridad baja para la interrupción del comparador
* CMIE=‘1’: Prioridad alta para la interrupción del comparador
– USBIP: Bit de selección de prioridad de la interrupción del USB
* USBIE=‘0’: Prioridad baja para la interrupción del USB
* USBIE=‘0’: Prioridad alta para la interrupción del USB
– EEIP: Bit de selección de prioridad de la interrupción de escritura en las
memorias
EEPROM/ Flash
* EEIE=‘0’: Prioridad baja para la interrupción de escritura en las memorias
EEPROM/ Flash
* EEIE=‘1’: Prioridad alta para la interrupción de escritura en las memorias
EEPROM/ Flash
– BCLIP: Bit de selección de prioridad de la interrupción de colisión de bus en el
SSP
* BCLIE=‘0’: Prioridad baja para la interrupción de colisión de bus en el SSP
* BCLIE=‘1’: Prioridad alta para la interrupción de colisión de bus en el SSP
– HLVIP: Bit de selección de prioridad de la interrupción de detección de tensión
alta/baja
* HLVIE=‘0’: Prioridad baja para la interrupción de detección de tensión alta/baja
* HLVIE=‘1’: Prioridad alta para la interrupción de detección de tensión alta/baja
– TMR3IP: Bit de selección de prioridad de la interrupción de desbordamiento del
Temporizador 3
* TMR3IE=‘0’: Prioridad baja para la interrupción de desbordamiento del
Temporizador 3
* TMR3IE=‘1’: Prioridad alta para la interrupción de desbordamiento del
Temporizador 3
– CCP2IP: Bit de selección de prioridad de la interrupción del módulo 2 de
Comparación/Captura/PWM (CCP2)
* CCP2IE=‘0’: Prioridad baja para la interrupción del CCP2
* CCP2IE=‘1’: Prioridad alta para la interrupción del CCP2
PRIORIDAD DE LAS INTERRUPCIONES:
→ El bit IPEN del registro RCON permite activar el sistema de prioridades:
→ IPEN a ‘0’: todas las interrupciones tienen la misma prioridad y se vectorizan en
la dirección 0008H. Para habilitar globalmente las interrupciones del grupo general
de interrupciones debe ponerse a ‘1’ el GIE del registro INTCON. Para habilitar
globalmente las interrupciones del bloque de interrupciones de periféricos deben
ponerse a ‘1’ los bits GIE y PEIE del registro INTCON. En este caso, ninguna
interrupción puede interrupción el tratamiento de otra interrupción
→ IPEN a ‘1’: las interrupciones pueden configurarse con dos niveles de prioridad
en función del bit de prioridad de interrupción (excepto la interrupción externa 0
que siempre tendrá nivel de prioridad alto):
– Bit de prioridad de interrupción a ‘0’ => Prioridad baja. Las interrupciones de
prioridad baja se vectorizan en la dirección 0018H. Para habilitar globalmente las
interrupciones de prioridad baja hay que poner a ‘1’ el bit GIEL del registro
INTCON.
– Bit de prioridad de interrupción a ‘1’ => Prioridad alta. Las interrupciones de
prioridad alta se vectorizan en la dirección 0008H. Para habilitar globalmente las
interrupciones de prioridad alta hay que poner a ‘1’ el bit GIEH del registro
INTCON.
Una interrupción de alta prioridad puede interrumpir el tratamiento de una
interrupción de baja prioridad. Sin embargo las interrupciones de baja prioridad no
pueden interrumpir a las interrupciones de alta prioridad. Por otra parte las
interrupciones de baja prioridad no pueden interrumpirse entre ellas. Lo mismo
ocurre con las interrupciones de alta prioridad.
NOTA: Además de ser habilitadas globalmente, las interrupciones deben ser
habilitadas a nivel particular mediante su bit de habilitación de interrupción.
PASOS A SEGUIR PARA TRABAJAR CON INTERRUPCIONES:
1. Configurar el dispositivo asociado a la interrupción (Temporizadores, EUSART,
convertidor A/D, etc..).
2. Habilitar a nivel global las interrupciones del grupo correspondiente mediante
los bits GIE/GIEH y PEIE/GIEL del registro INTCON
3. Habilitar a nivel individual la interrupción mediante el bit de habilitación.
4. Establecer la prioridad de la interrupción mediante el bit de prioridad (solo si
previamente se ha activado el sistema de prioridad de interrupciones, IPEN=‘1’)
5. En la dirección de vectorización correspondiente (0008H o 0018H, según el
caso) añadir el código de tratamiento de la interrupción que debe incluir:
→ Identificación de la interrupción: dado que varias interrupciones pueden
vectorizarse en la misma dirección, se deben comprobar los flags de las
interrupciones habilitadas para saber cuál de ellas ha provocado el salto a la
dirección de vectorización.
→ Borrado del flag de interrupción: el flag de interrupción debe ser borrado por
software una vez la interrupción ha sido identificada. De esta forma se evita que
cuando finalice la rutina de tratamiento se vuelva a procesar la misma interrupción.
→ Código de procesado de la interrupción: por último hay que escribir el código de
tratamiento de la interrupción que dependerá de cada aplicación.
El código de tratamiento de la interrupción siempre debe terminar con la
instrucción RETFIE.
PROCESO DE TRATAMIENTO DE UNA INTERRUPCION:
1. Se produce la condición de disparo de la interrupción (desbordamiento del
temporizador, recepción de un dato en la EUSART, etc...).
2. Si la interrupción está habilitada, el µC almacena en la pila la dirección de la
instrucción que debía haberse ejecutado a continuación y escribe en PC la
dirección de vectorización de la interrupción. Además el uC pone el bit de
habilitación global de interrupciones (GIE, GIEH o GIEL según corresponda) a ‘0’
para que ninguna interrupción del mismo nivel que la se está tratando puede
interrumpir el proceso.
3. Se ejecuta el código de tratamiento de la interrupción que deberá hallarse en la
dirección de la vectorización (se comprueba que interrupción ha generado el salto
a la dirección de vectorización, se borra el flag de interrupción correspondiente y
se ejecuta el código asociado a dicha interrupción.
4. La última instrucción del código de tratamiento de la interrupción es RETFIE.
Cuando se ejecuta esta instrucción, el µC vuelve a poner a ‘1’ el bit de habilitación
global de interrupciones (GIE, GIEH o GIEL) y escribe en el PC la dirección que
había almacenado en la pila de forma que se continué con la ejecución del
programa a partir del punto en el que había sido interrumpido.
EJEMPLO DE TRAMIENTO DE UNA INTERRUPCION:
El siguiente código ilustra cómo gestionar la interrupción mediante el
Temporizador 0. Se considera que no están activadas las prioridades (IPEN=’0’)
ORG 0x0000 ; Vectorización del reset
GOTO PPAL ; Cuando se produce el reset se salta al principio
; del programa principal
ORG 0x0008 ; Vectorizacion de las interrupciones
IT BTFSS INTCON,TMR0IF ; Se comprueba el flag de interrupción del
; Temporizador 0
GOTO FIN_IT ; Si no está a ‘1’ se salta al final
BCF INTCON,TMR0IF ; Si se ha producido interrupción del Temporizador
; 0 se pone a ‘0’ el flag
; y a continuación se ejecuta el código de
; procesado de la interrupción
; CODIGO CORRESPONDIENTE
; AL PROCESADO DE LA INTERRUPCION
FIN_IT
RETFIE ; Retorno de la interrupción
PPAL:
MOVLW 0xC0 ; Se configura el temporizador (modo
; temporizador de 8 bits) y
MOVWF T0CON ; se pone en marcha
BSF INTCON,GIE ; Se habilitan globalmente las interrupciones
BSF INTCON,TMR0IE ; Se habilita individualmente la interrupción del
; Temporizador 0
BUCLE
GOTO BUCLE
CONSERVACIÓN DEL VALOR DE LOS REGISTROS EN INTERRUPCIONES:
Las interrupciones se disparan durante la ejecución de código del programa
principal o de otra interrupción. Esto hace que durante la ejecución de la rutina de
tratamiento de la interrupción se pueda modificar el valor de registros que está
siendo utilizados por otras partes del código. Para evitar que estas modificaciones
alteren el correcto funcionamiento del sistema conviene almacenar los valores de
estos registros al inicio de la interrupción para recuperarlos al final
→ Mediante la pila rápida de registro (solo WREG, STATUS y BSR)
ORG 0x0008 ; Cuando se vectoriza la interrupción WREG, BSR y STATUS se almacenan
. ; CODIGO DE LA INTERRUPCION (los registros pueden ser modificados
. ; sin que eso afecte al resto del programa)
. ;
RETFIE FAST ; Al acabar se recuperan los valores de WREG, STATUS y BSR de la pila
; rápida de registro
→ Mediante variables auxiliares
ORG 0x0008 ; Vectorizacion de las interrupciones
MOVFF STATUS,STATUS_TEMP ; Se almacenan en variables auxiliares los valores de
MOVFF WREG,WREG_TEMP ; los registros cuya modificación durante la ejecución
; del código de la interrupción pueda afectar al resto
MOVFF BSR,BSR_TEMP ; del código
. ; CODIGO DE LA INTERRUPCION (los registros pueden
. ; ser modificados sin que eso afecte al resto del
. ; programa)
MOVFF BSR_TEMP,BSR ; Antes de acabar la interrupción se recuperan los
; valores
MOVFF WREG_TEMP,WREG ; de los registros almacenados temporalmente al inicio
MOVFF STATUS_TEMP,STATUS ; de la misma
RETFIE ; Retorno de la interrupción