Page 1


http://issuu.com/microprocesadores/ © 2013 Celestino Benítez Vázquez Todos los contenidos e imágenes publicados en la revista “microprocesadores” tienen los derechos reservados quedando prohibida la reproducción total o parcial de esta publicación sin el consentimiento expreso de su autor. http://celestinobenitez.wix.com/asturias

CELESTINO BENÍTEZ VÁZQUEZ 


1. INTRODUCCIÓN. Analizaremos en este tema los diferentes bloques que constituyen el microcontrolador y veremos la función o funciones asignadas a cada uno de los terminales del mismo. Así mismo, veremos diferentes formas de conexión y modos de trabajo y se visualizarán algunas opciones específicas de nuestros microcontroladores. Los componentes de la familia PIC18FXX8 a los que nos referimos son el PIC18F248, el PIC18F258, el PIC18F448 y el PIC18F458, que se presentan en encapsulados de 28, 40 y 44 terminales y todos ellos disponen de características similares, utilizando el mismo repertorio de instrucciones básico. Entre los componentes de esta familia existen algunas diferencias fundamentales: • • •

Los microcontroladores PIC18FX58 disponen del doble de capacidad de memoria RAM y de memoria de programa FLASH que los componentes PIC18Fx48. Los microcontroladores PIC18F2X8 disponen de 5 canales A/D y 3 puertos de E/S frente a los 8 canales A/D y 5 puertos de E/S de los PIC18F4X8. Únicamente los microcontroladores PIC18F4X8 disponen del módulo CCP, comparadores analógicos y un puerto esclavo paralelo.

El resto de características de los componentes de la familia PIC18FXX8, incluyendo los módulos de comunicaciones serie, son idénticas. Por tanto todo lo que estudiemos sobre cualquiera de ellos es aplicable al resto, respetando estas diferencias aquí enumeradas.

CELESTINO BENÍTEZ VÁZQUEZ 


2. DISTRIBUCIÓN DE TERMINALES. Los componentes de la familia PIC18FXX8 se presentan en diferentes tipos de encapsulados (PDIP, PLCC, TQFP, SPDIP, SOIC), con distinto número de terminales. En la FIG. 2.1 podemos ver el encapsulado PDIP y la distribución de terminales del PIC18F448 y del PIC18F458. En la FIG 2.2 tenemos información referida al PIC18F248 y al PIC18F258.

CELESTINO BENÍTEZ VÁZQUEZ 


Las funciones realizadas por cada terminal son las siguientes: MCLR/VPP RA0/AN0/CVREF

RA1/AN1 RA2/AN2/CVREF-

RA3/AN3/CVREF+

RA4/T0CKI

RA5/AN4/SS/LVDIN

VSS VDD OSC1/CLKI

OSC2/CLKO/RA6

RC0/T1OSO/T1CKI

RC1/T1OSI RC2/CCP1

Entrada Master Clear (borrado) activa a nivel lógico bajo. Como VPP es una entrada de tensión de programación. Como RA0 es una entrada-salida digital nivel TTL Como AN0 es la entrada 0 analógica. Como CVREF es la salida de tensión de referencia del comparador. Como RA1 es una entrada-salida digital nivel TTL. Como AN1 es la entrada 1 analógica. Como RA2 es una entrada-salida digital nivel TTL Como AN2 es la entrada 2 analógica. Como CVREF- es la entrada analógica (baja) de tensión de referencia para el convertidor A-D. Como RA3 es una entrada-salida digital nivel TTL Como AN3 es la entrada 3 analógica. Como CVREF+ es la entrada analógica (alta) de tensión de referencia para el convertidor A-D. Como RA4 es una entrada-salida digital. En drenador abierto cuando está configurado como salida. Como T0CKI es la entrada de reloj externa de Timer0. Como RA5 es una entrada-salida digital nivel TTL Como AN4 es la entrada 4 analógica. Como SS es la entrada de selección de esclavo SPI. Como LVDIN es la entrada de detección de baja tensión. Masa de referencia para las señales lógicas y las señales de entrada-salida. Tensión de alimentación positiva. Como OSC1 es la entrada del oscilador de cristal o bien la entrada de una señal de reloj exterior. Como CLKI es la entrada para una fuente de reloj exterior Como OSC2 es la salida del oscilador de cristal. Como CLKO, en modo RC, es una salida de reloj con una frecuencia igual a ¼ de la frecuencia de reloj y marca un ciclo de instrucción completo. Como RA6 es una entrada-salida digital nivel TTL. Como RC0 es una entrada-salida digital. Como T1OSO es una salida del oscilador Timer1. Como T1CKI es una entrada de reloj exterior para Timer1/Timer3. Como RC1 es una entrada-salida digital. Como T1OSI es una entrada para el oscilador Timer1. Como RC2 es una entrada-salida digital. Como CCP1 es: (entrada Captura1) / (salida Compara1) / (salida PWM1). CELESTINO BENÍTEZ VÁZQUEZ 


RC3/SCK/SCL

RC4/SDI/SDA

RC5/SDO RC6/TX/CK

RC7/RX/DT

RB0/INT0 RB1/INT1 RB2/CANTX/INT2

RB3/CANRX

RB4 RB5/PGM

RB6/PGC RB7/PGD RE0/AN5/RD

RE1/AN6/WR/C1OUT

Como RC3 es una entrada-salida digital. Como SCK es una entrada-salida de reloj de sincronismo serie para el modo SPI. Como SCL es una entrada-salida de reloj de sincronismo serie para el modo I2C. Como RC4 es una entrada-salida digital. Como SDI es una entrada de datos SPI. Como SDA es una entrada-salida de datos I2C. Como RC5 es una entrada-salida digital. Como SDO es una salida de datos SPI. Como RC6 es una entrada-salida digital. Como TX es la señal de transmisión asíncrona USART. Como CK es la señal de sincronismo USART. Como RC7 es una entrada-salida digital. Como RX es la señal de recepción asíncrona USART. Como DT es el dato síncrono USART. Como RB0 es una entrada-salida digital. Como INT0 es una señal externa de interrupción 0. Como RB1 es una entrada-salida digital. Como INT1 es una señal externa de interrupción 1. Como RB2 es una entrada-salida digital. Como CANTX es la señal de transmisión de datos para el bus CAN. Como INT2 es una señal externa de interrupción 2. Como RB3 es una entrada-salida digital. Como CANRX es la señal de recepción de datos para el bus CAN. Como RB4 es una entrada-salida digital. Como RB5 es una entrada-salida digital. Como PGM es la señal de habilitación para programación en baja tensión ICSP. Como RB6 es una entrada-salida digital. Como PGC es la señal de reloj de programación ICSP. Como RB7 es una entrada-salida digital. Como PGD es la señal de datos de programación ICSP. Como RE0 es una entrada-salida digital. Como AN5 es la entrada 5 analógica. Como RD es la señal de control de lectura para el puerto paralelo esclavo. Es activa a nivel lógico bajo y trabaja en unión con la señal CS y WR. Como RE1 es una entrada-salida digital. Como AN6 es la entrada 6 analógica. Como WR es la señal de control de escritura para el puerto paralelo esclavo. Es activa a nivel lógico bajo y trabaja en unión con la señal CS y RD. Como C1OUT es la señal de salida del comparador 1.

CELESTINO BENÍTEZ VÁZQUEZ 


RE2/AN7/CS/C2OUT

Como RE2 es una entrada-salida digital. Como AN7 es la entrada 7 analógica. Como CS es la señal de selección para el puerto paralelo esclavo. Es activa a nivel lógico bajo y trabaja en unión con la señal WR y RD. Como C2OUT es la señal de salida del comparador 2. RD0/PSP0/C1IN+ Como RD0 es una entrada-salida digital. Como PSP0 es ent-sal del puerto paralelo esclavo.. Como C1IN+ es la entrada analógica del comparador 1. RD1/PSP1/C1INComo RD1 es una entrada-salida digital. Como PSP1 es una entrada-salida de datos del puerto paralelo esclavo.. Como C1IN- es la entrada analógica del comparador 1. RD2/PSP2/C2IN+ Como RD2 es una entrada-salida digital. Como PSP2 es una entrada-salida de datos del puerto paralelo esclavo.. Como C2IN+ es la entrada analógica del comparador 2. RD3/PSP3/C2INComo RD3 es una entrada-salida digital. Como PSP3 es una entrada-salida de datos del puerto paralelo esclavo.. Como C2IN- es la entrada analógica del comparador 2. RD4/PSP4/ECCP1/P1A Como RD4 es una entrada-salida digital. Como PSP4 es una entrada-salida de datos del puerto paralelo esclavo.. Como ECCP1 es la entrada-salida de ECCP1 captura/comparación. Como P1A es la salida A ECCP1 de PWM. RD5/PSP5/P1B Como RD5 es una entrada-salida digital. Como PSP5 es una entrada-salida de datos del puerto paralelo esclavo.. Como P1B es la salida B ECCP1 de PWM. RD6/PSP6/P1C Como RD6 es una entrada-salida digital. Como PSP6 es una entrada-salida de datos del puerto paralelo esclavo.. Como P1C es la salida C ECCP1 de PWM. RD7/PSP7/P1D Como RD7 es una entrada-salida digital. Como PSP7 es una entrada-salida de datos del puerto paralelo esclavo.. Como P1D es la salida D ECCP1 de PWM.

CELESTINO BENÍTEZ VÁZQUEZ 


3. CONFIGURACIONES DEL OSCILADOR. La configuración del oscilador constituye la base de tiempos del sistema y debe ser precisa y suficientemente estable. Disponemos de tres bits (FOSC2, FOSC1, y FOSC0) programables que proporcionan hasta ocho modos de oscilador que son: 1. 2. 3. 4. 5. 6. 7. 8.

LP XT HS HS4 RC RCIO EC ECIO

Low Power Crystal. Crystal/Resonator. High Speed Crystal/Resonator. High Speed Crystal/Resonator with PLL enabled. External Resistor/Capacitor. External Resistor/Capacitor with I/O pin enabled. External Clock. External Clock with I/O pin enabled.

CELESTINO BENÍTEZ VÁZQUEZ 


Para los cuatro primeros modos de configuración puede efectuarse la conexión mostrada en la FIG 2.3, en la que se puede apreciar la forma de conectar un cristal de cuarzo entre los terminales OSC1 y OSC2 del microcontrolador con el que se consigue una frecuencia de oscilación estable. En nuestro caso esta será la solución adoptada para todos nuestros diseños, siendo el cristal de cuarzo de 12 MHz y los condensadores de 22 pF. Existen otros modos de conectar fuentes externas de oscilación que permiten también un modo correcto de funcionamiento de los microcontroladores, pero ahora no abundaremos en estos aspectos. Para más información se puede acudir a los manuales de Microchip.

4. LOS MODOS DE RESET. Cuando se produce un reset, se abandona el desarrollo normal del programa para reiniciar su ejecución desde el principio, partiendo de unos valores establecidos por defecto. En nuestro caso se puede provocar un reset de los modos siguientes: 1. Aplicando un cero en el terminal MCLR durante el desarrollo normal del programa, o durante un periodo de actividad en bajo consumo (SLEEP), o bien durante la conexión de la alimentación POR (Power-on Reset). 2. Mediante el Watchdog Timer (WDT). 3. Por medio de las instrucciones. 4. Con un Brown-out (BOR) programable. 5. Por desbordamientos de pila (Stack Full o Stack Underflow). El reset MCLR. Los PIC18FXX8 disponen en su interior además de un “filtro de ruido” en la entrada de la patilla MCLR, que hace que se puedan ignorar pequeños pulsos no deseados, de los circuitos lógicos necesarios para generar el reset cuando se

CELESTINO BENÍTEZ VÁZQUEZ 


produce la conexión del componente a la alimentación (POR). Este estado se detecta a través de la patilla MCLR (ver la FIG. 2.4).

La alimentación llega a MCLR a través de R1 y del circuito de carga formado por R2 y C1. El diodo D1 sirve para facilitar la descarga rápida del condensador cuando falta la alimentación. El circuito de carga R2-C1 debe proporcionar una constante de tiempo suficientemente elevada para que permita un retardo apreciable en la conexión, de modo que el microcontrolador entienda que tiene la tensión de alimentación completamente estabilizada. (R2 debe ser menor de 40 K ). Cuando la tensión en C1 ha alcanzado un nivel mínimo necesario, será detectada por el microcontrolador a través de R1 desapareciendo en ese instante el estado de reset. (R1 debe valer entre 100 y 1 K ). Al producirse un reset en la patilla MCLR se obtienen entre otros los siguientes efectos: • • • •

Se inicia el programa en la dirección señalada por el vector de reset. Las distintas posiciones de la memoria RAM no se alteran. Se inicializan algunos registros especiales (SFRs). No cambian los contenidos de TO, POR y BOR.

Podremos utilizar el bit PD para saber si se produce un reset MCLR durante una operación normal de trabajo o bien durante el estado sleep, ya que al ejecutar una instrucción sleep dicho bit se borra (0 lógico). El reset WDT El reset WDT se habilita mediante la configuración de bits adecuada y en estas condiciones se producirá el reset siempre que no se borre de forma periódica el Watchdog Timer (WDT). Además continúa en funcionamiento durante un periodo sleep. Después de producirse un reset WDT : • Se reinicia el programa desde la dirección marcada por el vector de reset. • No se cambia el contenido de la RAM de propósito general. • Cambian algunos de los contenidos de los registros especiales. • Borra el bit TO y permanecen inalterados los bits PD, POR y BOR.

CELESTINO BENÍTEZ VÁZQUEZ 


Reset mediante software. También podemos producir un reset en el componente mediante el software correspondiente utilizando la instrucción “reset” que tiene el mismo efecto que un reset MCLR. Reset por desbordamiento. Si durante la ejecución de un programa almacenamos datos en la pila de modo que llegamos a sobrepasar su capacidad, se producirá un reset por desbordamiento (stack full). Este reset queda marcado mediante el bit STKFUL del registro STKPTR. Por otro lado si tratamos de sacar de la pila más datos de los que hemos almacenado también se produce un reset por desbordamiento (stack underflow) viniendo señalado el mismo en el bit STKUNF del registro STKPTR. Reset por BOR. Cuando la alimentación del dispositivo cae por debajo de un valor mínimo sin llegar a ser cero y posteriormente se recupera, se produce el reset BOR (Brownout Reset). Disponemos de un bit de configuración (BOREN) del registro CONFIG2L para deshabilitar (0) o para habilitar (1) el circuito BOR. Cuando surge un reset Brown-Out se producen entre otros los siguientes efectos: CELESTINO BENÍTEZ VÁZQUEZ 


• • • • •

Se permite iniciar el PWRT. Se inician algunos registros especiales SFRs. Las posiciones de RAM adoptan valores desconocidos. El bit POR no cambia, el bit BOR se borra y el bit TO se activa. El bit PD indica si el componente se encuentra en modo sleep.

Como hemos podido apreciar, cada vez que se produce un determinado tipo de reset se activa un bit que nos señala dicho suceso. A continuación se presenta un resumen de los diferentes bits de señalización:

BIT POR BOR TO PD STKFUL STKUNF

REGISTRO PCON PCON STATUS STATUS STKPTR STKPTR

TIPO RESET Power on reset Brown out reset WDT Part was in sleep Stack full Stack underflow

5. MODO SLEEP. Otra de las características importantes de los PIC18FXX8, es la posibilidad de colocar al dispositivo en modo de bajo consumo (SLEEP) ejecutando la instrucción SLEEP. Si se entra en este modo de trabajo: 1. 2. 3. 4. 5. 6.

El Watchdog Timer se borra y continúa funcionando. El bit PD (RCON<3>) se borra. El bit TO (RCON<4>) se activa. El oscilador se bloquea. Los puertos de entrada-salida permanecen en el mismo estado. No existe consumo de corriente desde los terminales de entrada-salida hacia circuitos exteriores. 7. Se establece bajo consumo en el bloque A/D.

Se puede salir del estado SLEEP con alguna de las siguientes acciones: 1. Mediante un reset externo en la patilla MCLR. 2. Mediante la actuación del WDT (si está habilitado). 3. Mediante una interrupción en un terminal INT.

CELESTINO BENÍTEZ VÁZQUEZ 


También podemos sacar al microcontrolador del modo SLEEP mediante las siguientes interrupciones periféricas: 1. 2. 3. 4. 5. 6. 7. 8. 9.

Leer o escribir PSP. Interrupción TMR1. Interrupción TMR3. Interrupción de modo captura CCP. Bits detectores de interrupción MSSP. Por transmisión o recepción en modo esclavo MSSP. Por TX o RX USART. Por una operación completa de escritura en EEPROM. Interrupción LVD.

6. EL WDT. El WDT (también llamado perro guardián) es un circuito interno que dispone de un oscilador RC para funcionar libremente y no necesita ningún componente externo. Este oscilador interno continúa funcionando aunque el oscilador principal quede bloqueado, por ejemplo mediante una instrucción SLEEP. En realidad se trata de un contador o temporizador (de 8 bits) cuya misión es provocar el reset del microcontrolador cuando se alcanza un valor programado. Para evitar la generación del reset, es necesario reiniciar la temporización del WDT antes de que alcance el desbordamiento. Para ello se debe colocar en lugares apropiados del programa la instrucción CLRWDT o SLEEP, de modo que se reinicie el WDT cada cierto tiempo, antes de que se produzca el reset por desbordamiento. (CLRWDT borra el valor del WDT iniciándose la cuenta de nuevo y SLEEP además de lo anterior detiene el sistema entrando en un modo de trabajo de consumo mínimo). Si estamos trabajando en modo SLEEP y se produce un desbordamiento del WDT nos coloca en modo normal de trabajo (Watchdog Timer Wake-up) y se borra el bit TO del registro RCON. Podemos activar según nos interese el WDT mediante la programación del registro WDTCON (fig.2.5) en combinación con el bit de configuración WDTEN del registro CONFIG2H.

CELESTINO BENÍTEZ VÁZQUEZ 


Bit 7 –1 Bit 0

No implementados. Se leen como 0. SWDTEN es el bit de habilitación del WDT 1 = WDT activado. 0 = el WDT esta desactivado si el bit WDTEN es 0.

El WDT dispone de un divisor de frecuencia que permite ampliar el tiempo de la cuenta, de modo que podemos llegar a superar los 2 segundos. Cuando esta división de frecuencia se realiza sobre los impulsos de conteo después de pasar por el WDT, este divisor de frecuencia se denomina postscaler y se selecciona al mismo tiempo que se programa el microcontrolador mediante el valor escrito en registro de configuración CONFIG2H. En la FIG.2.6 podemos ver los registros que nos permiten programar el WDT.

CELESTINO BENÍTEZ VÁZQUEZ 


7. CONFIGURACIÓN DE BITS. Los registros de configuración nos permiten seleccionar diferentes posibilidades de trabajo. Están situados en la memoria de programa a partir de la dirección 300000h y se programan de modo similar a la memoria FLASH. Para ello podemos utilizar la instrucción TBLWT (para programar un determinado bit lo ponemos a “0”, mientras que si lo dejamos sin programar se lee como “1”). El bit WR de EECON1 inicia al mismo tiempo la escritura del registro de configuración. En modo de trabajo normal una instrucción TBLWT con TBLPTR apuntando al registro de configuración prepara la configuración del registro que deseamos escribir. Los registros de configuración se escriben de byte en byte. En la tabla de la FIG.2.7 podemos ver los diferentes registros y sus direcciones de memoria. A continuación se detalla la composición de cada uno de ellos:

CELESTINO BENÍTEZ VÁZQUEZ 


Registro CONFIG1H, situado en la dirección 300001h. bit 7-6 bit 5

bit 4-3 bit 2-0

No implementados. Se leen como ‘0’. OSCSEN: Bit de habilitación del reloj oscilador del sistema 1 = Deshabilita el reloj del oscilador del sistema 0 = Habilita el reloj del oscilador del sistema. No implementado. Se leen como ‘0’. FOSC2:FOSC0: bits de selección del oscilador. 111 = oscilador RC. OSC2 configurado como RA6 110 = oscilador HS con PLL habilitado. Frecuenc reloj = (4 x FOSC) 101 = oscilador EC. OSC2 configurado como RA6 100 = oscilador EC. OSC2 como divisor por 4 clock de salida 011 = oscilador RC. 010 = oscilador HS. 001 = oscilador XT. 000 = oscilador LP.

Registro CONFIG2L, situado en la dirección 300002h. bit 7-4 bit 3-2

bit 1

bit 0

No implementados. Se leen como ‘0’. BORV1:BORV0: bits de tensión Brown-out Reset (BOR). 11 = VBOR activo a 2.0V 10 = VBOR activo a 2.7V 01 = VBOR activo a 4.2V 00 = VBOR activo a 4.5V BOREN: bit de habilitación BOR. 1 = Habilita BOR. 0 = Deshabilita BOR. PWRTEN: bit habilitación Power-up Timer. 1 = Deshabilita PWRT. 0 = Habilita PWRT.

Registro CONFIG2H, situado en la dirección 300003h. bit 7-4 bit 3-1

bit 0

No implementados. Se leen como ‘0’. WDTPS2:WDTPS0: bits selección postscaler WDT. 111 = 1:128 110 = 1:64 101 = 1:32 100 = 1:16 011 = 1:8 010 = 1:4 001 = 1:2 000 = 1:1 WDTEN: bit de habilitación del WDT 1 = WDT habilitado. 0 = WDT deshabilitado. CELESTINO BENÍTEZ VÁZQUEZ 


Registro CONFIG4L, situado en la dirección 300006h. bit 7 bit 6-3 bit 2

bit 1 bit 0

DEBUG: Bit que habilita el Background Debugger No implementado: Se lee como ‘0’. LVP: Bit que habilita la baja tensión ICSP. 1 = habilitada baja tensión ICSP. 0 = deshabilitada baja tensión ICSP. No implementado: Se lee como ‘0’. STVREN: bit que habilita el reset de pila Full/Underflow. 1 = Provocará un reset de la pila. 0 = No causará un reset de la pila.

Registro CONFIG5L, situado en la dirección 300008h. bit 7-4 bit 3

bit 2

bit 1

bit 0

No implementados. Se leen como ‘0’. CP3: bit de código de protección. 1 = Bloque 3 (006000-007FFFh) sin código de protección. 0 = Bloque 3 (006000-007FFFh) con código de protección. CP2: bit de código de protección. 1 = Bloque 2 (004000-005FFFh) sin código de protección 0 = Bloque 2 (004000-005FFFh) con código de protección. CP1: bit de código de protección. 1 = Bloque 1 (002000-003FFFh) sin código de protección. 0 = Bloque 1 (002000-003FFFh) con código de protección. CP0: bit de código de protección. 1 = Bloque 0 (000200-001FFFh) sin código de protección. 0 = Bloque 0 (000200-001FFFh) con código de protección

Registro CONFIG5H, situado en la dirección 300009h. bit 7

bit 6

bit 5-0

CPD: bit de código de protección de datos EEPROM. 1 = sin código de protección EEPROM. 0 = con código de protección EEPROM. CPB: bit de código de protección Boot Block. 1 = Boot Block (000000-0001FFh) sin código de protección. 0 = Boot Block (000000-0001FFh) con código de protección. No implementados. Se leen como ‘0’.

CELESTINO BENÍTEZ VÁZQUEZ 


Registro CONFIG6L, situado en la dirección 30000Ah. bit 7-4 bit 3

bit 2

bit 1

bit 0

No implementados. Se leen como ‘0’ WRT3: bit de protección de escritura. 1 = Bloque 3 (006000-007FFFh) escritura no protegida 0 = Bloque 3 (006000-007FFFh) escritura protegida WRT2: bit de protección de escritura 1 = Bloque 2 (004000-005FFFh) escritura no protegida. 0 = Bloque 2 (004000-005FFFh) escritura protegida. WRT1: bit protección escritura. 1 = Bloque 1 (002000-003FFFh) escritura no protegida. 0 = Bloque 1 (002000-003FFFh) escritura protegida WRT0: bit protección escritura. 1 = Bloque 0 (000200-001FFFh) escritura no protegida. 0 = Bloque 0 (000200-001FFFh) escritura protegida

Registro CONFIG6H, situado en la dirección 30000Bh. bit 7

bit 6

bit 5

bit 4-0

WRTD: Bit de protección de escritura de datos EEPROM 1 = EEPROM no protegida contra escritura 0 = EEPROM protegida contra escritura. WRTB: Bit de protección de escritura Boot Block. 1 = Boot Block (000000-0001FFh) no protegido 0 = Boot Block (000000-0001FFh) protegido. WRTC: Bit de protección de escritura del registro de configuración. 0 = Protegida la escritura de registros de configuración (3000003000FFh) No implementados. Se leen como ‘0’

Registro CONFIG7L, situado en la dirección 30000Ch. bit 7-4 bit 3

bit 2

No implementados. Se leen como ‘0’ EBTR3: Bit de protección lectura de tabla 1 = Bloque 3 (006000-007FFFh) no protegido contra lectura de tablas ejecutada desde otros bloques. 0 = Block 3 (006000-007FFFh) protegido contra lectura de tablas ejecutada desde otros bloques. EBTR2: Bit de protección lectura de tabla 1 = Block 2 (004000-005FFFh) no protegido contra lectura de tablas ejecutada desde otros bloques. 0 = Block 2 (004000-005FFFh) protegido contra lectura de tablas ejecutada desde otros bloques. CELESTINO BENÍTEZ VÁZQUEZ 


bit 1

bit 0

EBTR1: Bit de protección lectura de tabla 1 = Block 1 (002000-003FFFh) no protegido contra lectura de tablas ejecutada desde otros bloques. 0 = Block 1 (002000-003FFFh) protegido contra lectura de tablas ejecutada desde otros bloques. EBTR0: Bit de protección lectura de tabla. 1 = Block 0 (000200-001FFFh) no protegido contra lectura de tablas ejecutada desde otros bloques. 0 = Block 0 (000200-001FFFh) protegido contra lectura de tablas ejecutada desde otros bloques.

Registro CONFIG7H, situado en la dirección 30000Dh. bit 7 bit 6

bit 5-0

No implementado. Se lee como ‘0’ EBTRB: Bit de protección contra lectura de tabla Boot Block 1 = Boot Block (000000-0001FFh) no protegido contra lectura de tablas ejecutada desde otros bloques. 0 = Boot Block (000000-0001FFh) protegido contra lectura de tablas ejecutada desde otros bloques No implementados. Se leen como ‘0’.

Registro DEVID1, situado en la dirección 3FFFFEh. bit 7-5

bit 4-0

DEV2:DEV0: Bits identificadores de componente. Estos bits se usan con los bits DEV<10:3> en el registro DEVID2 000 = PIC18F248 001 = PIC18F448 010 = PIC18F258 011 = PIC18F458 REV4:REV0: Bits de revisión ID Estos bits se utilizan para indicar la revisión del componente.

Registro DEVID2, situado en la dirección 3FFFFFh. bit 7-0

DEV10:DEV3: Bits identificadores de componente. Estos bits se usan con los bits DEV<2:0> del registro DEVID1 00001000 = PIC18FXX8

CELESTINO BENÍTEZ VÁZQUEZ 


8. VERIFICACIÓN DE PROGRAMA Y PROTECCIÓN. La memoria de usuario del programa se divide en 5 bloques (uno de ellos es un “boot block” de 512 bytes). Cada uno de estos 5 bloques tiene tres bits de código de protección asociados, que son: • • •

El bit de protección de código (CPn). El bit de protección de escritura (WRTn). Bit de lectura externa de bloque de tabla (EBTRn).

En la FIG.2.8 podemos ver la organización de la memoria de programa para componentes de 16 y 32 Kbytes y los bits de códigos específicos de protección asociados a cada bloque.

CELESTINO BENÍTEZ VÁZQUEZ 


La memoria de usuario puede leerse o escribirse en cualquier dirección con las instrucciones de lectura y de escritura de tabla. En modo Usuario, los bits CPn no tienen efecto directo, e inhiben lecturas y escrituras externas. Se puede proteger un bloque de memoria de usuario mediante las instrucciones de escritura de tabla si el bit de configuración WRTn se coloca a “0”. Los bits EBTRn controlan la lectura de tablas, así si tenemos el bit EBTRn a “0” para un determinado bloque de memoria, solo podrá ser leído mediante una lectura de tabla efectuada desde el mimo bloque, si intentamos leer desde el exterior solo obtendremos “0”. Los códigos de protección solo se pueden escribir como “0” desde el estado “1”; pero no se puede escribir un “1” partiendo de “0”. En las FIG.2.9A, FIG.2.9B y FIG.2.9C, escritura de memoria.

se ilustra la protección de lectura y

CELESTINO BENÍTEZ VÁZQUEZ 


CELESTINO BENÍTEZ VÁZQUEZ 


La totalidad de la memoria EEPROM se protege mediante dos bits de escrituras y lecturas exteriores: • •

CPD: inhibe lecturas y escrituras externas de los datos de la EEPROM. WRTD: inhibe escrituras externas de datos en la EEPROM.

El bit de control de protección WRTC del registro de protección solamente se puede leer, para escribirlo debe ser mediante programador externo o vía ICSP.

9. DIRECCIONES ID. El Identificador de Dispositivo (ID) está compuesto por ocho direcciones de memoria (desde 200000h hasta 200007h) en las que el usuario puede almacenar cualquier número de identificación que desee. Estas direcciones son accesibles mediante las instrucciones TBLRD y TBLWT o durante una verificación de programa.

CELESTINO BENÍTEZ VÁZQUEZ 


10. DETECCIÓN DE NIVEL DE TENSIÓN BAJO (LVD). Los microcontroladores PIC18FXXX disponen de un módulo de detección de baja tensión (LVD) que podemos programar por software indicándole el nivel mínimo de tensión de alimentación VDD que consideramos admisible. Cuando la tensión de alimentación es menor que el valor programado se activa una señal de interrupción que, en caso de estar habilitada, provoca el salto de ejecución del programa al vector de dirección correspondiente, ejecutándose ahora la subrutina de interrupción programada. Para indicar el nivel mínimo deseado de tensión utilizamos los bits LVDL3:LVDL0 del registro LVDCON. Este módulo dispone además de una característica añadida que nos permite tomar como tensión mínima de referencia una tensión externa aplicada al terminal de entrada LVDIN. Para conseguir este modo de trabajo tenemos que programar los bits LVDL3:LVDL0 como “1111”.

CELESTINO BENÍTEZ VÁZQUEZ 


A continuación se muestra la función de cada uno de los bits del registro de control del detector de bajo nivel de tensión: bit 7-6 bit 5

bit 4

bit 3-0

No utilizados. Se leen como “0”. IRVST: Bit señalizador interno de tensión de referencia estable. 1 = Indica que se genera la señal de interrupción en el rango de tensión especificado. 0 = Indica que no genera la señal de interrupción del rango de tensión especificado y la interrupción LVD no será habilitada. LVDEN: bit de habilitación y activación de alimentación del LVD 1 = Habilita el LVD, activa alimentación al circuito LVD. 0 = Deshabilita el LVD, desactiva alimentación al circuito LVD. LVDL3:LVDL0: bits limitadores del nivel de detección LVD. 1111 = Utiliza la entrada externa analógica en el pin LVDIN. 1110 = 4.45V min. - 4.83V max. 1101 = 4.16V min. - 4.5V max. 1100 = 3.96V min. - 4.2V max. 1011 = 3.76V min. - 4.08V max. 1010 = 3.57V min. - 3.87V max. 1001 = 3.47V min. - 3.75V max. 1000 = 3.27V min. - 3.55V max. 0111 = 2.98V min. - 3.22V max. 0110 = 2.77V min. - 3.01V max. 0101 = 2.67V min. - 2.89V max. 0100 = 2.48V min. - 2.68V max. 0011 = 2.37V min. - 2.57V max. 0010 = 2.18V min. - 2.36V max. 0001 = 1.98V min. - 2.14V max. 0000 = Reservado

No es necesario que el módulo LVD esté operativo de forma constante, sino que es suficiente que esté habilitado durante el chequeo de la tensión. Para activar el LVD deberemos seguir los siguientes pasos: • • • • • •

Escribir el valor deseado el los bits LVDL3:LVDL0 del registro LVDCON. Asegurarse que las interrupciones LVD están deshabilitadas, para lo cual el bit LVDIE o el bit GIE estarán borrados. Habilitar el módulo LVD activando el bit LVDEN del registro LVDCON. Esperar que el módulo LVD se estabilice activándose el bit IRVST. Borrar el flag de interrupción LVD. Habilitar la interrupción LVD activando los bits LVDIE y GIE.

CELESTINO BENÍTEZ VÁZQUEZ 


http://celestinobenitez.wix.com/asturias

CELESTINO BENÍTEZ VÁZQUEZ 


Gracias por vuestra visita

CELESTINO BENÍTEZ VÁZQUEZ 

PIC18FXX8(2)  

La familia de microcontroladores 18FXX8