MICROPROCESADORES II
ING. JULIAN GIRALDO
EL
MICROCONTROLADOR
PIC 18F4550
1
EL uC 18F4550 (I)
El uC 18F4550 es un microcontrolador de la gama alta de Microchip. Sus principales
características se mencionan a continuación:
Puerto serial USB
• Cumple el estándar USB V2.0 (Baja velocidad hasta 1.5 Mb/s y alta velocidad hasta 12
Mb/s
• Memoria RAM dedicada de 1 Kbyte para la USB
• Transceptor interno con regulador de voltaje incorporado
Modos de energía:
• Run: CPU on, periféricos on
• Idle: CPU off, periféricos on
• Sleep: CPU off, periféricos off
Oscilador:
• Cuatro modos de cristal (incluye PLL de alta precisión para la USB)
• Dos modos de reloj externo (hasta 48 MHz)
• Bloque oscilador interno (8 frecuencias seleccionables desde 31 kHz hasta 8 MHz)
Microprocesadores II Ing. Julián Giraldo
2
EL uC 18F4550 (II)
Periféricos:
• Alta capacidad de manejo de corriente (Sink/Source : 25 mA/25 mA)
• Tres fuentes de interrupción externas
• Cuatro módulos temporizadores/contadores (Timer0 a Timer3)
• Hasta dos módulos 2 Captura/Comparación/PWM (CCP):
• Módulo transmisor USART
• Puerto serial maestro síncrono (MSSP): Soporta comunicación a 3 cables SPI e I2C
• Conversor A/D de 10 bits y hasta 13 canales análogos
• Comparadores análogos duales con multiplexación de entrada
Microprocesadores II Ing. Julián Giraldo
3
Resúmen características 18F4550
Microprocesadores II Ing. Julián Giraldo
4
Diagrama de pines 18F4550
Microprocesadores II Ing. Julián Giraldo
5
Estructura interna del 18F4550
6
Organización de memoria del 18F4550
El PIC 18F4550 dispone de las siguientes memorias:
1. Memoria de programa: memoria flash interna de 32.768 bytes
• Almacena instrucciones y constantes/datos
• Puede ser escrita/leída mediante un programador externo o durante la ejecución del
programa mediante unos punteros
2. Memoria RAM de datos: memoria SRAM interna de 2048 bytes en la que están
incluidos los registros de función especial
• Almacena datos de forma temporal durante la ejecución del programa
• Puede ser escrita/leída en tiempo de ejecución mediante diversas instrucciones
3. Memoria EEPROM de datos: memoria no volátil de 256 bytes
• Almacena datos que se deben conservar aun en ausencia de tensión de alimentación
• Puede ser escrita/leída en tiempo de ejecución a través de registros
4. Pila: bloque de 31 palabras de 21 bits
• Almacena la dirección de la instrucción que debe ser ejecutada después de una interrupción
o subrutina
5. Memoria de configuración: memoria en la que se incluyen los bits de
configuración (12 bytes de memoria flash) y los registros de identificación (2 bytes
de memoria de solo lectura)
Microprocesadores II Ing. Julián Giraldo
7
Memoria de configuración del 18F4550
Se trata de un bloque de memoria situado a partir de la posición 30000H de memoria
de programa (más allá de la zona de memoria de programa de usuario). En esta
memoria de configuración se incluyen:
1. Bits de configuración: contenidos en 12 bytes de memoria flash permiten la
configuración de algunas opciones del uC como:
• Opciones del oscilador
• Opciones de reset
• Opciones del watchdog
• Opciones de la circuiteria de depuración y programación
• Opciones de protección contra escritura de memoria de programa y memoria EEPROM de
datos
Estos bits se configuran generalmente durante la programación del uC, aunque también
pueden ser leídos y modificados durante la ejecución del programa.
2. Registros de identificación: se trata de dos registros situados en las direcciones
3FFFFEH y 3FFFFFH que contienen información del modelo y revisión del dispositivo.
Son registros de solo lectura y no pueden ser modificados por el usuario.
Microprocesadores II Ing. Julián Giraldo
8
Memoria EEPROM de datos del 18F4550
El PIC18F4550 dispone una memoria EEPROM de datos de 256 bytes. Al ser una
memoria no volátil los datos almacenados en ella se mantienen aún en ausencia de
tensión de alimentación.
• El acceso a esta memoria se realiza mediante los SFR’s: EECON1, EECON2, EEDATA,
EEADR
• Esta memoria permite hasta 1.000.000 de ciclos de borrado/escritura
• Se puede leer/escribir de forma individual en cada una de las 256 posiciones de
memoria
• Cuando se realiza una operación de escritura la circuiteria interna del uC se encarga
de borrar previamente la posición en la que se desea escribir. La duración de un ciclo
completo de borrado/escritura de un byte en la memoria EEPROM suele ser de unos
4ms
Microprocesadores II Ing. Julián Giraldo
9
Pines de control 18F4550
Microprocesadores II Ing. Julián Giraldo
10
Puertos de E/S del 18F4550
El 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 circuiteria especifica del uC. Cuando una línea trabaja en el modo alternativo no
puede ser utilizada como línea digital de E/S estándar.
Microprocesadores II Ing. Julián Giraldo
11
Puerto A (18F4550)
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)
Microprocesadores II Ing. Julián Giraldo
12
Puerto B (18F4550)
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 hacia
+Vdd internas que pueden ser activadas (solo si el pin funciona como entrada)
Microprocesadores II Ing. Julián Giraldo
13
Puerto C (18F4550)
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)
Microprocesadores II Ing. Julián Giraldo
14
Puerto D (18F4550)
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)
Microprocesadores II Ing. Julián Giraldo
15
Puerto E (18F4550)
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)
Microprocesadores II Ing. Julián Giraldo
16
Puerto genérico de operaciones (E/S)
Microprocesadores II Ing. Julián Giraldo
17
Registros asociados a puertos 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 el valor del latch de salida
Microprocesadores II Ing. Julián Giraldo
18
Manejo de E/S digitales
usando CCS para PIC (I)
1. Configurar en el main las entradas (1) y salidas digitales (0) usando la
función set_tris_x(valor).
Si en el puerto A se tienen dos pulsadores en A3 y A1, en el puerto B se tienen 4
LEDs en B3, B2, B1 y B0, y finalmente en el puerto D se tiene un interruptor en D7.
Entonces debe configurarse así:
//Es importante recordar que son 8 bits en un puerto, identificados de 7 a 0.
//Igualmente si queda un pin libre o sin usar, debe configurarse como salida.
set_tris_a(0b00001010);
set_tris_b(0b00000000);
set_tris_d(0b10000000);
Microprocesadores II Ing. Julián Giraldo
19
Manejo de E/S digitales
usando CCS para PIC (II)
2. Si se necesita encender o apagar un LED se usan las funciones
output_high(pin) y output_low(pin).
Suponiendo que quiero encender el LED del pin B2 y apagar el LED del pin B0:
output_high(PIN_B2);
output_low(PIN_B0);
3. Si se quieren manejar 8 salidas en forma simultánea en un mismo puerto,
puede usarse la función output_x(valor)
Suponiendo que quiero encender el LED del pin B2 y apagar el LED del pin B0:
//El valor puede ser en formato binario, decimal o hexadecimal.
output_b(0b00000100); //solo en uno el bit 2 del puerto B.
output_b(0x04); //para enviar hexadecimal se usa 0x (es equis no es asterisco).
output_b(4); //para enviar decimal se escribe el número sin prefijo.
Microprocesadores II Ing. Julián Giraldo
20
Manejo de E/S digitales
usando CCS para PIC (III)
4. Cuando se va leer una entrada se usa una variable tipo int1, la función
input(pin), y luego se verifica con la condición if.
Suponiendo que con el interruptor conectado en D7 quiere encenderse o apagarse
el LED conectado en B1.
int1 pulsador1 = input(PIN_D7);
if (pulsador1 == 0)
{
output_high(PIN_B1);
}
else
{
output_low(PIN_B1);
}
Microprocesadores II Ing. Julián Giraldo
21
Manejo de E/S digitales
usando CCS para PIC (IV)
5. Cuando la entrada son varios pines de un mismo puerto, puede usarse una
variable int8, la función input_x(), y finalmente acoplar el dato para hacer
comparaciones
Si deseo leer los pines C2, C1 y C0 a la misma vez:
int8 entradaC = input_c();
entradaC &= 0b00000111; //acople por máscara AND con los bits de interés.
Si los pines son de mayor peso, como C4, C5 y C6, se debe hacer un corrimiento de
bits.
int8 entradaC = input_c();
entradaC &= 0b01110000; //acople por máscara AND con los bits de interés
entradaC >>= 4; //desplazo la cantidad de ceros que hay a la derecha en la máscara
Microprocesadores II Ing. Julián Giraldo
22
Estructura de un programa en CCS
La estructura básica de un programa en CCS para PIC, es muy similar a la de un
programa en lenguaje C estándar:
#Directivas del preprocesador
//Declaración de prototipos de funciones
//Declaración de variables globales
//Programa principal
main()
{
Variables locales;
Bloque de sentencias;
Llamadas a las funciones;
}
// Definición de funciones
Funcion_1()
{
Variables locales a funcion_1;
Bloque de sentencias;
Llamada a otra/s funciones;
}
//Otras funciones
Microprocesadores II Ing. Julián Giraldo
23
Directivas del preprocesador
Una directiva de preprocesador es un comando para el preprocesador de C (Es el primer
paso en la elaboración de un programa). Indican al compilador cómo debe generar el
código máquina.
Ejemplo:
#include <18F4550.h> //PIC utilizado en la programación
#fuses XT,NOWDT,NOPROTECT,NOLVP //Configuración de fusibles
#use delay (clock=4000000) //Definición de frecuencia de oscilación (4Mhz)
Microprocesadores II Ing. Julián Giraldo
24
Declaraciones
Establece los nombres y los atributos de las variables globales, prototipos de las
funciones y tipos de variables utilizados en el programa.
Ejemplo:
//Prototipos de funciones
void lcd_saludo_inicial(void);
//Declaración de variables
int a;
char b;
Microprocesadores II Ing. Julián Giraldo
25
Funciones
Es un colección de declaraciones locales, definiciones, expresiones y sentencias para
realizar una determinada tarea que se puede colocar antes o después de la función
principal main.
Ejemplo:
void lcd_saludo_inicial(void)
{
lcd_putc ("Iván Martínez"); //Escribo en la primera fila
delay_ms(2000); //Espero dos segundos
lcd_gotoxy(4,2); //columna 4, fila 2
lcd_putc( " LCD en CCS"); //Escribo en la segunda fila
delay_ms(3000); //Espero tres segundos
lcd_putc( "\f"); //Limpio pantalla
}
Microprocesadores II Ing. Julián Giraldo
26
Función principal
Todos los programas en C deben contener una función principal llamada main, desde la
cual, el programa empieza la ejecución. Las llaves indican el inicio y el punto final del
programa.
Ejemplo:
void main(void)
{
//Puertos y pines
config();
//Inicializo el LCD y muestro el saludo inicial
lcd_init();
lcd_saludo_inicial();
}
Microprocesadores II Ing. Julián Giraldo
27
Comentarios
Imprescindibles como documentación del código fuente.
Ejemplo:
void main(void)
{
//Puertos y pines
config();
//Inicializo el LCD y muestro el saludo inicial
lcd_init();
lcd_saludo_inicial();
}
Microprocesadores II Ing. Julián Giraldo
28