Sei sulla pagina 1di 37

UNIVERSIDAD NACIONAL DE HUANCAVELICA

FACULTAD DE INGENIERIA ELECTRONICA–SISTEMAS


ESCUELA ACADEMICO PROFESIONAL DE ELECTRONICA

Microcontrolador PIC18F2550

MG. ING. JAVIER CAMILO POMA PALACIOS


PAMPAS -2018
Microcontrolador PIC18F2550
Principales Características
Arquitectura RISC avanzada, hardware de 16 bits con 8 bits de datos.
77 instrucciones. Hasta 16 K x16 de memoria de programa.
Multiplicador Hardware 8x8.
16 KB de RAM y 256 Bytes de EEPROM.
Frecuencia máxima de reloj 48 MHz. Oscilador interno desde 31KHz hasta 8 MHz.
Pila de 32 niveles.
Temporizadores: TMR0, TMR1, TMR2 y TMR3.
Múltiples fuentes de interrupción.
Módulo de Captura/Comparacion/PWM.
Módulo ADC de 10-bits
Módulo comparador analógico
Periférico de comunicación serial: EUSART, I2C, SPI y
USB v 2.0.
Microcontrolador PIC18F2550
Configuración de pines
Microcontrolador PIC18F2550
Arquitectura
En la figura se muestra la arquitectura del microcontrolador PIC18F2550,
el cual dispone de buses diferentes para el acceso a la memoria de
programa y a la memoria de datos (arquitectura Harvard):
Bus de la memoria de programa: 21 líneas de dirección y 16 líneas
para instrucciones).
Bus de la memoria de datos: 12 líneas de dirección y 8 líneas de datos.

Esto permite acceder simultáneamente a la memoria de programa y a la


memoria de datos. Es decir, se puede ejecutar una instrucción (lo que
por lo general requiere acceso a la memoria de datos) mientras se lee de
la memoria de programa la siguiente instrucción (proceso pipeline).
Microcontrolador PIC18F2550
Arquitectura

(Opcional)
Microcontrolador PIC18F2550

Arquitectura
Microcontrolador PIC18F2550
Memoria de Programa
El PIC18F2550 dispone de una memoria de programa de 32.768 bytes (7FFFH - 0000H).
Las instrucciones ocupan 2 bytes (excepto las instrucciones CALL, MOVFF, GOTO y
LSFR que ocupan 4). Por lo tanto, la memoria de programa puede almacenar hasta
16.384 instrucciones.
Primero se almacena la parte baja de la instrucción y luego la parte alta (para las
instrucciones de 4 bytes primero los bytes menos significativos y luego los más
significativos). Las instrucciones siempre empiezan en direcciones pares. La operación
de lectura en la posición de memoria por encima de 7FFFH, equivalente a NOP.
Direcciones especiales de la memoria de programa:

Vectorización del Reset es 0000H.


Vectorización de las interrupciones de alta prioridad es la 0008H.
Vectorización de las interrupciones de baja prioridad es la 0018H.
Microcontrolador PIC18F2550

Memoria de Programa
Microcontrolador PIC18F2550
Memoria de Programa
Contador de Programa: El PC (contador de programa) tiene 21 bits (PCU, PCH y PCL). El bit
menos significativo del PC apunta a BYTEs, no a WORDs, por lo que es "0". El PC se
incrementa de dos en dos. Se dispone de los correspondientes registros auxiliares PCLATU
y PCLATH para actuar de forma combinada con el PC cuando éste se escribe o se lee.
Pila: La Pila es un bloque de memoria RAM independiente de 31 palabras de 21 bits y un
puntero de 5 bits, que sirve para almacenar temporalmente el valor del PC cuando se
produce una llamada a una subrutina o interrupción. El "Top Of Stack"" es accesible se
puede leer y escribir (será conveniente quitar previamente las interrupciones). El puntero de
pila (contenido en el registro STKPTR) es un contador de 5 bits que indica la posición actual
del final de pila. El contenido del final de pila es accesible mediante los registros TOSU,
TOSH, TQSL.
Microcontrolador PIC18F2550
Memoria de Datos
El microcontrolador PIC182550 tienen hasta un total de 4 KBytes agrupados en 16 bancos,
con 256 bytes cada uno. Como en el resto de las gamas, existen los registros de propósito
general (GPRs), los cuales pueden ser utilizados por el usuario; y registros de función
especial (SFRs), con los cuales se puede monitorizar y/o controlar el funcionamiento de la
CPU y de las unidades funcionales del PIC; éstos últimos se sitúan en la zona más alta
(desde F60h hasta FFFh). El PIC18F2550 dispone una memoria RAM de datos 1.536 bytes (6
bancos de 256 bytes). Además dispone de 126 bytes dedicados a los registros de función
especial (SFRs) situados en la parte alta del banco 15, como se muestra en la figura.
La memoria de datos tipo EEPROM del PIC18F2550 dispone una capacidad de 256 bytes. Al
ser una memoria no volátil, los datos almacenados en ella se mantienen en ausencia de
tensión de alimentación.
Microcontrolador PIC18F2550

Memoria de Datos
Microcontrolador PIC18F2550
Registros de Función Especial (SFR)
Microcontrolador PIC18F2550
Registros de Función Especial (SFR)
Microcontrolador PIC18F2550
Memoria de Datos
El microcontrolador PIC182550 tienen hasta un total de 4 KBytes agrupados en 16
bancos, con 256 bytes cada uno. Como en el resto de las gamas, existen los registros
de propósito general GPR y los registros especiales SFR; éstos últimos se sitúan en la
zona más alta (desde F00h hasta FFFh). El PIC18F2550 dispone una memoria RAM de
datos 1.536 bytes (6 bancos de 256 bytes). Además dispone de 126 bytes dedicados a
los registros de función especial (SFRs) situados en la parte alta del banco 15, como se
muestra en la figura.
La memoria RAM de datos se compone de registros de propósito general (GPRs), los
cuales pueden ser utilizados por el usuario y de registros de función especial (SFRs),
con los cuales se puede monitorizar y/o controlar el funcionamiento de la CPU y de las
unidades funcionales del PIC. En el PIC18F2550 la memoria RAM de datos se sitúa en el
bloque de memoria de 0xF60 a 0xFFF, como se observa en la figura.
Microcontrolador PIC18F2550
Interrupciones (En general)
Se dispone de dos niveles de prioridad: Nivel alto en la dirección 0008H y Nivel bajo en la
dirección 0018H.
Todas las interrupciones pueden ser programadas con cualquiera de las dos prioridades, salvo la
interrupción externa 0 (siempre tiene alta prioridad). Se puede forzar el modo compatible "sólo
alta prioridad", mediante el bit IPEN = 0. GIE/GIEH & PEIE/GIEL controlan los respectivos
permisos globales. El servicio de interrupción de alta prioridad impide el servicio de baja
prioridad. Cuando se ejecuta RETFIE se pone el permiso correspondiente al nivel que se está
sirviendo.
Todas las interrupciones disponen de 3 bits de configuración (excepto Ia 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. Debe ponerse a ‘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 prioridad (no
está disponible para la interrupción externa 0).
Microcontrolador PIC18F2550
Interrupciones (interrupciones validad según C de CCS)
Microcontrolador PIC18F2550
Oscilador
El microcontrolador necesita un reloj
estable para proporcionar una fuente
de reloj separada.
El oscilador se controla mediante dos
registros de configuración y otros dos
de control.
En CONFIG1L y CONFIG1H se elige el
oscilador y las opciones de los
escaladores del USB (prescaler y
postscaler).
El registro OSCCON selecciona el
modo activo de reloj.
El registro OSCTUNE se utiliza para
recortar frecuencia de la fuente INTRC.
Hay que programar los bits de
configuración FOSC3:FOSC0 para
seleccionar el tipo.
Microcontrolador PIC18F2550
Oscilador
Se presentan los modos de oscilador siguiente:
XT: XTAL/ circuito resonante.
XTPLL: XTAL/ circuito resonante con PLL activo.
HS: XTAL/ circuito resonante muy rápido.
HSPLL: XTAL/ circuito resonante muy rápido con PLL activo.
EC: Reloj externo con Fosc/4 como salida en RA6.
ECIO: Reloj externo con RA6 como E/S.
ECPLL: Reloj externo con Fosc/4 como salida en RA6 y PLL activo.
ECPIO: Reloj externo con RA6 como E/S y PLL activo.
INTHS: Oscilador interno usado como reloj del microcontrolador y HS como reloj del USB.
INTXT: Oscilador interno usado como reloj del microcontrolador y XT como reloj del USB.
INTCKO: Oscilador interno usado como reloj del microcontrolador y EC como reloj del USB con
Fosc/4 como salida en RA6.
Microcontrolador PIC18F2550

Escaladores para el Reloj del USB


Microcontrolador PIC18F2550
Oscilador de 48MHz
En OSC1 y OSC2 se conecta el cristal, pudiéndose conectar cualquiera de los siguientes cristales: 4MHz, 8MHz, 12MHz, 16MHz,
20MHz, 24MHz, 40MHz ó 48MHz, que son los cristales válidos compatibles para este PIC18F2550.
Existen varias formas de conseguir 48MHz necesarios para el USB 2.0 a partir del cristal de 20MHz. A partir del cristal se accede al
Primary Oscillator y en ese punto hay 3 rutas posibles.
La línea superior acaba directamente en el switch USBDIV que (seleccionando su “entrada 0”) comunica directamente la
frecuencia del oscilador de entrada con la salida. Este caso es el resultado de conectar directamente un cristal de 48MHz en el
oscilador inicial.
La segunda ruta obedece a la conexión en el oscilador de partida de un cristal compatible, pero de frecuencia diferente a 48MHz.
La frecuencia de oscilación, al llegar al PLL Prescaler, se divide entre 1, 2, 3, 4, 5, 6, 10 ó 12, de manera que a la salida del
multiplexor PLLDIV siempre haya 4MHz. Estos se convertirán en 96MHz a la salida de PLL. El switch USBDIV permite el paso de
la frecuencia dividida entre 2 (48MHz) seleccionando su “entrada 1” (USBDIV1). En particular, en este caso en que se parte de un
cristal de 20MHz, la frecuencia se divide entre 5 (PLL5), y da lugar a 4MHz a la salida del multiplexor.
Una ruta alternativa a la salida del 96 MHz PLL es dirigirse hacia el PLL Postscaler; allí, la frecuencia de oscilación de 96MHz se
puede dividir entre 2, 3, 4 ó 6 (CPUDIV X), obteniéndose frecuencias de reloj de 16MHz, 24MHz, 32MHz ó 48MHz.
Por la tercera ruta, la frecuencia del cristal llega al Oscilator Postscaler. En el diagrama vemos otro CPUDIV. ¿Por qué no es la
frecuencia de reloj para el procesador?. La respuesta es que al configurar el fuse HSPLL estamos indicando que hacemos uso de
un cristal con frecuencia superior a 4 MHz (HS) y que lo hacemos por mediación del PLL (HSPLL), por lo que CPUDIV queda
deshabilitado. En este nuevo divisor los cocientes pueden ser 1, 2, 3 ó 4. Una vez dividida la frecuencia, la señal accede hasta el
switch FOSC3:FOSC0. Finalmente, las frecuencias resultantes se usarán como reloj para el funcionamiento del procesador.
Microcontrolador PIC18F2550
Microcontrolador PIC18F2550
Microcontrolador PIC18F2550
Unidades funcionales
El PIC18F2550 dispone de una serie de Unidades Funcionales que:
Realiza tareas específicas especializadas (conversión A/D, transmisión/recepción de datos,
generación de señales digitales con temporizaciones programables, etc.).
Optimiza el rendimiento del PIC, ya que estas unidades trabajan en paralelo a la CPU
permitiendo que esta se centre en otras tareas como el procesado de datos, cálculos,
movimiento de datos, etc.

Unidades funcionales
Temporizador 0 Canal de comunicación serie EUSART
(RS232 mejorado)
Temporizador 1 Canal de comunicación serie MSSP (SPI, I2C)
Temporizador 2 Módulo analógico de comparación
Temporizador 3 Canal de transmisión de datos en paralelo
(SPP)
Conversor A/D Acceso a memoria externa (EMA)
Módulo USB Unidad de comparación/captura/PWM (CCP)
Microcontrolador PIC18F2550
Puertos de entrada/salida
El PIC18F2550 dispone de 4 puertos, que incluyen un total de 23 líneas digitales 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 el ‘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.

Puertos Líneas de entrada/salida


PORTA 7 Líneas de entrada/salida
PORTB 8 Líneas de entrada/salida
PORTC 7 Líneas de entrada/salida
PORTE 1 Línea de entrada
Entrada/Salida digital
La configuración como entrada o salida se hace a través del
registro TRISX (con bit 0 como salida y bit 1 como entrada)
correspondiente del banco 15 de la memoria.
- TRISA=0xF92 (Puerto A) - TRISB=0xF93 (Puerto B)
- TRISC=0xF94 (Puerto C) - TRISE=0xF96 (Puerto E)

Un valor 0 en los bits de estos registros configuran el pin del


puerto como salida y un 1 como entrada.
Para configurar los puertos se utiliza la función
set_tris_x(valor)
Se puede leer la configuración de los puertos con la función
get_tris_x(valor)
25
Entrada/Salida digital
Ejemplos:
set_tris_A (0x7F) // Puerto A como entradas
set_tris_B (0x00) // Puerto B como salidas
set_tris_C (0b11110000) //Pines RC0..RC3 salidas y RC4..RC7 entradas

La lectura o escritura de datos en los puertos se hace mediante


la lectura o escritura en el registro del banco 15 asociado a cada
puerto.
PORTA=0xF80 (Puerto A)
PORTB=0xF81 (Puerto B)
PORTC=0xF82 (Puerto C)
PORTE=0xF84 (Puerto E)
26
Entrada/Salida digital

En primer lugar se debe programar todas los pines del


microcontrolador si fuese posible con #USE fast_io (puerto).
La lectura y/o escritura se realiza directamente sobre los pines
del puerto.
CCS tiene funciones predefinidas para el uso de los puertos de
E/S digital.
Las funciones pueden tratar el puerto completo o un bit del
mismo.
Los parámetros de estas funciones están definidos en un fichero:
#INCLUDE <18F2550.h> con un formato PIN_Xn donde X es el
puerto y n el bit.
Funciones de salida digital (bit)
 output_low(PIN_Xn) //pone a 0.
 output_high(PIN_Xn) //pone a 1.
 output_bit(PIN_Xn,valor)
//pone el pin Xn a valor (0 ó 1)
 output_toggle (PIN_Xn)
//complementa el valor del pin
 output_float (PIN_Xn)
//pin como entrada
Funciones de entrada digital (bit)
input_state(PIN_Xn)
//Lee el valor del pin sin cambiar el sentido del terminal.
input(PIN_Xn) //Lee el valor del pin.

Ejemplos:
output_low(PIN_A0);
output_high(PIN_B1);
output_bit(PIN_B3,0);
output_toggle (PIN_C6);
output_float (PIN_A2);
valor=input_state (PIN_B7);
valor=input(PIN_C3);
29
Funciones de E/S digital (byte)

output_X(valor): input_X():
 X= puerto (A,B o C)  X= puerto (A,B o C)

 Valor= byte a escribir en  Lee el valor del puerto X

el puerto Ejemplo:
 Escribe valor en X valor = input_B();
Ejemplo: /*guarda en valor el
output_B(0xA5); contenido del puerto B*/
//PORTB=10100101
Funciones de E/S digital

 CCS provee directivas y funciones predefinidas para el


uso de los puertos de E/S digital.
 Las funciones output_X() e input_X() dependen de la
directiva de configuración que usemos. Se debe
configurar adecuadamente.
 Directivas:
 #USE fast_io (puerto)
 #USE standar_io (puerto)
 #use fixed_io (puerto)
31
Directivas del procesador

32
Directivas de gestión de puertos

• #use fast_io (puerto)


– No modifica el registro TRIS en lecturas y escrituras.
– Hay que asegurarse de que los pines está configurados
correctamente.
• #use standar_io (puerto)
– Modifica el registro TRIS correspondiente en lecturas y
escrituras. (Modo por defecto)
• #use fixed_io (puerto)
– Configura el puerto y no modifica el registro TRIS en lecturas
y escrituras.
33
Microcontrolador PIC18F2550
Aplicación a los puertos de entrada/salida
VDD
C1

15pF
RC0

R16
U1 X1 10k
4MHz
PIC18F2550
R15 D8 C2
2 9
220 D9 RA0/AN0 OSC1/CLKI
D10
3
RA1/AN1 RA6/OSC2/CLKO
10 D16
4
D11 5
RA2/AN2/VREF-/CVREF 1N914
D12 RA3/AN3/VREF+ 15pF R17
6 1
D13 RA4/T0CKI/C1OUT/RCV RE3/MCLR/VPP
7
D15 RA5/AN4/SS/LVDIN/C2OUT
11 RC0 10k
LED-YELLOW RC0/T1OSO/T1CKI
12
D0 RC1/T1OSI/CCP2/UOE
21 13
JP1 D1 RB0/AN12/INT0/FLT0/SDI/SDA RC2/CCP1
22 15
D2 RB1/AN10/INT1/SCK/SCL RC4/D-/VM
23 16
D3 RB2/AN8/INT2/VMO RC5/D+/VP
24 17
D4 RB3/AN9/CCP2/VPO RC6/TX/CK
25 18
D5 RB4/AN11/KBI0/CSSPP RC7/RX/DT/SDO
26
D6 RB5/KBI1/PGM
27 14
D7 RB6/KBI2/PGC VUSB
28
RB7/KBI3/PGD
D13

D12

D10
D11

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0
R14 R13 R12 R11 R10 R9 R8 R7 R6 R5 R4 R3 R2 R1
330 330 330 330 330 330 330 330 330 330 330 330 330 330

D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1


JP2 LED-Y LED-Y LED-Y LED-Y LED-Y LED-Y LED-Y LED-Y LED-Y LED-Y LED-Y LED-Y LED-Y LED-Y
Microcontrolador PIC18F2550
Programa en C de CCS WHILE(TRUE)
{
/* EJEM11.C LEDS=0x01;
******** //Iluminacion hacia la izquierda
Luces secuencialea de 14 bits ida/vuelta WHILE(bit_test(LEDS,7)==0)
Pampas, setiembre 2017. */ {
// Autor: Mg. Javier Camilo Poma Palacios output_b(LEDS);
rotate_left(&LEDS,1);
#INCLUDE <18F2550.h> delay_ms(50);
#FUSES HS,PUT,NOWDT,NOPBADEN,NOMCLR,NOLVP }
//configura PIC output_b(LEDS);
#USE DELAY(clock=10000000) //Reloj delay_ms(50);
output_b(0x00);
#USE fast_io(a) LEDS=0x01;
#USE fast_io(b)
WHILE(bit_test(LEDS,5)==0)
int8 LEDS; {
output_a(LEDS);
void main() rotate_left(&LEDS,1);
{ delay_ms(50);
set_tris_a(0x00); }
set_tris_b(0x00); output_a(LEDS);
output_a(0x00); delay_ms(50);
output_b(0x00); //Iluminacion hacia la derecha
LEDS=0x10;
Microcontrolador PIC18F2550
Programa en C de CCS

WHILE(bit_test(LEDS,0)==0)
{
output_a(LEDS);
rotate_right(&LEDS,1);
delay_ms(50);
}

output_a(LEDS);
delay_ms(50);
output_a(0x00);
LEDS=0x80;

WHILE(bit_test(LEDS,0)==0)
{
output_b(LEDS);
rotate_right(&LEDS,1);
delay_ms(50);
}
}
}
Ejercicios para los grupos N° 2
1. Encendido secuencial de los extremos al centro para 16 leds (controlado desde el puerto A) y
encendido secuencial del centro a los extremos para 16 leds (controlado desde el puerto B).
2. Encendido de 2 en 2 secuencial ida y vuelta para 24 leds.
3. Encendido de 4 en 4 secuencial ida y vuelta para 24 leds.
4. Realizar el control de encendido de 32 leds, utilizando dos pulsadores para las secuencias: auto
fantástico, y encendido secuencial de los extremos al centro y del centro a los extremos cada uno
se activa con su respectivo botón con lógica “1” e inactivos con “0”. Se debe visualizar en LabVIEW
2017 las secuencias luego de ser activado con su respectivo botón (se muestra diagrama de
bloques).

5. Y libre…; que espero nos sorprenda. 37