C++ para microcontroladores y aplicación práctica

144
UNIDAD 1. Microcontroladores Programables SISTEMAS EMBEBIDOS Y CONTROL POR: M.C. ANDRÉS GERARDO FUENTES COVARRUBIAS

description

Primera unidad del curso de Sistemas Embebidos y Control, Universidad de Colima, México

Transcript of C++ para microcontroladores y aplicación práctica

Page 1: C++ para microcontroladores y aplicación práctica

UNIDAD 1.

Microcontroladores

Programables

SISTEMAS EMBEBIDOS Y CONTROL

POR: M.C. ANDRÉS GERARDO FUENTES COVARRUBIAS

Page 2: C++ para microcontroladores y aplicación práctica

¿QUE ES UN PROCESADOR?

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 2

1.1. Conceptos básicos sobre

microcontroladores

Page 3: C++ para microcontroladores y aplicación práctica

¿DONDE ESTÁN LOS PROCESADORES?

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 3

Page 4: C++ para microcontroladores y aplicación práctica

¿QUE ES UN MICROCONTROLADOR?

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 4

Page 5: C++ para microcontroladores y aplicación práctica

MICROPROCESADORES VS

MICROCONTROLADORES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 5

Page 6: C++ para microcontroladores y aplicación práctica

HARDWARE

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 6

Page 7: C++ para microcontroladores y aplicación práctica

APLICACIONES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 7

Page 8: C++ para microcontroladores y aplicación práctica

REPERTORIO DE INSTRUCCIÓN

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 8

Page 9: C++ para microcontroladores y aplicación práctica

HARDWARE

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 9

Page 10: C++ para microcontroladores y aplicación práctica

HARDWARE DE UN MICROCONTROLADOR

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 10

Page 11: C++ para microcontroladores y aplicación práctica

UNIDAD CENTRAL DE PROCESO

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 11

Page 12: C++ para microcontroladores y aplicación práctica

CPU (ESQUEMA)

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 12

Page 13: C++ para microcontroladores y aplicación práctica

TAREAS DE UN CPU

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 13

Page 14: C++ para microcontroladores y aplicación práctica

TAREAS DEL CPU CONT…

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 14

Page 15: C++ para microcontroladores y aplicación práctica

TAREAS DE …

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 15

Page 16: C++ para microcontroladores y aplicación práctica

TIPOS DE CPU

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 16

Page 17: C++ para microcontroladores y aplicación práctica

SISTEMA DE MEMORIA

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 17

Page 18: C++ para microcontroladores y aplicación práctica

SISTEMA DE MEMORIA

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 18

Page 19: C++ para microcontroladores y aplicación práctica

LOS MICROCONTROLADORES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 19

Page 20: C++ para microcontroladores y aplicación práctica

APLICACIONES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 20

Page 21: C++ para microcontroladores y aplicación práctica

MICROCONTROLADORES COMUNES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 21

1.2. Los microcontroladores PIC y Atmel

Page 22: C++ para microcontroladores y aplicación práctica

ESCALABILIDAD EN MICROCHIP

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 22

Page 23: C++ para microcontroladores y aplicación práctica

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 23

Concepto

Circuito integrado que

incluye en su interior

las tres unidades

funcionales de un

ordenador: CPU,

Memoria y Unidades

de E/S, es decir, se

trata de un

computador completo

en un solo circuito

integrado.

Page 24: C++ para microcontroladores y aplicación práctica

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 24

Ciclo de vida de un software embebido

Page 25: C++ para microcontroladores y aplicación práctica

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 25

Técnica de desarrollo del software

embebido

Page 26: C++ para microcontroladores y aplicación práctica

• Modelo de programación del uC PIC18F4550

• Modelado de programas en Mplab

• Simulación de programas en Proteus VSM

1.3. EL ENTORNO DE DESARROLLO PARA

MICROCHIP

Page 27: C++ para microcontroladores y aplicación práctica

MODELO DE PROGRAMACIÓN CON EL PIC18F4550

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 27

• El PIC18F4550, pertenece a los microcontroladores PIC18 de gama alta. Posee una

arquitectura RISC (reduced instruction set computer) de 16 bits longitud de instrucciones y

8 bits de datos. La tabla muestra en resumen las características fundamentales de este

microcontrolador y de sus antecesores los PIC18F2455/2550/4455.

Page 28: C++ para microcontroladores y aplicación práctica

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 28

Page 29: C++ para microcontroladores y aplicación práctica

ORGANIZACIÓN DE LA MEMORIA EL UC PIC18F4550 DISPONE DE LAS SIGUIENTES MEMORIAS:

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 29

• 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 programa mediante unos punteros.

• 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.

• 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.

• 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.

Page 30: C++ para microcontroladores y aplicación práctica

ORGANIZACIÓN DE LA MEMORIA

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 30

• 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). 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:

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 circuitería de depuración y programación. - Opciones de protección contra lectura 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.

• 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.

Page 31: C++ para microcontroladores y aplicación práctica

MAPA DE MEMORIA

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 31

Page 32: C++ para microcontroladores y aplicación práctica

ARQUITECTURA HARVARD

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 32

El uC PIC18F4550 dispone buses diferentes para el acceso a memoria de programa y memoria de datos (arquitectura Harvard):

• Bus de la memoria de programa: - 21 líneas de dirección - 16/8 líneas de datos (16 líneas para instrucciones/8 líneas para datos)

• Bus de la memoria de datos: - 12 líneas de dirección - 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 memoria de datos) mientras se lee de la memoria de programa la siguiente instrucción (proceso pipeline).

Por tanto la ejecución completa de 1 instrucción (lectura instrucción +ejecución) se hace en un 1

ciclo de instrucción (4 Tosc). EXCEPCIÓN: las instrucciones que modifican el contenido del PC

requieren 2 ciclos de instrucción.

Page 33: C++ para microcontroladores y aplicación práctica

MODELADO DE PROGRAMAS EN

MPLAB

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 33

• Microchip provee una buena herramienta para el desarrollo de aplicaciones con microcontroladores PIC, esta es el MPLAB

• Con MPLAB se puede:

• Editar programas

• Ensamblarlos si están escritos en ensablador

• Compilarlos si están escritos en un lenguaje de alto nivel

• Depurarlos con el MPLAB Sim

Page 34: C++ para microcontroladores y aplicación práctica

SIMULACIÓN DE PROGRAMAS CON

PROTEUS VSM

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 34

Como una

funcionalidad

adicional, MPLAB

permite invocar al

Proteus desde el

entorno de desarrollo

para efectuar la

depuración

directamente en el

esquemático de la

aplicación Hardware.

Page 35: C++ para microcontroladores y aplicación práctica

• Repertorio de instrucciones

• Temporizadores, Puertos de E/S y manejo de datos

• Interrupciones

1.4. DISEÑO DE APLICACIONES CON PIC

(LENGUAJE ENSAMBLADOR)

Page 36: C++ para microcontroladores y aplicación práctica

FORMATO DE UN PROGRAMA EN

ENSAMBLADOR PIC18F4550(1)

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 36

LIST P=18F4550 ;Directiva para definir el procesador

#include "P18F4550.INC"

;******** Bits de configuracion **********

CONFIG PWRT = ON ;PWRT habilitado

CONFIG WDT = OFF ;Watchdog deshabilitado

CONFIG MCLRE = ON ;MCLR como entrada

CONFIG PBADEN = OFF ;Todos los pines del puerto B como entradas analogicas

CONFIG DEBUG = OFF ;Deshabilitar modo DEBUG

CONFIG LVP = OFF ;Deshabilitacion del modo programacion de bajo nivel

CONFIG FOSC = HSPLL_HS ;Oscilador de alta velocidad con PLL habilitado

;********* Bits de proteccion ******************

CONFIG CP0 = OFF ;los bloques del codigo de programa

CONFIG CP1 = OFF ;no estan protegidos

CONFIG CP2 = OFF

CONFIG CP3 = OFF

CONFIG CPB = OFF ;Sector Boot no esta protegido

CONFIG CPD = OFF ;La EEPROM no esta protegida

Page 37: C++ para microcontroladores y aplicación práctica

FORMATO DE UN PROGRAMA PIC18F4550(2)

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 37

CBLOCK 0x000 ;Variables en la ACCESS RAM (Banco 0) max 96 bytes

;Aqui va la declaracion de variables

ENDC

ORG 0xf00000 ;Area de definicion de variables de la EEPROM

;DE "Test Data",0,1,2,3,4,5

ORG 0x0000 ;vector de interrupcion del reset

goto main

ORG 0X0008 ;vector de interrupcion de baja prioridad

goto main

ORG 0X0018 ;vector de interrupcion de alta prioridad

goto main

main: ;Programa principal

fin: goto fin

end

Page 38: C++ para microcontroladores y aplicación práctica

REPERTORIO DE INSTRUCCIONES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 38

El juego de instrucciones es altamente ortogonal y esta dividido en 4 grupos:

• Operaciones orientadas al Byte

• Operaciones orientadas al Bit

• Operaciones con literales

• Operaciones de control

Page 39: C++ para microcontroladores y aplicación práctica

OPERACIONES ORIENTADAS AL BYTE

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 39

Page 40: C++ para microcontroladores y aplicación práctica

OPERACIONES ORIENTADAS AL BIT

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 40

Page 41: C++ para microcontroladores y aplicación práctica

OPERACIONES DE CONTROL

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 41

Page 42: C++ para microcontroladores y aplicación práctica

OPERACIONES CON LITERALES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 42

Page 43: C++ para microcontroladores y aplicación práctica

TEMPORIZADORES, PUERTOS DE

ENTRADA/SALIDA Y MANEJO DE DATOS

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 43

Los temporizadores son segmentos de código que permiten introducir

retardos de tiempo entre la ocurrencia de eventos o la ejecución cíclica de

segmentos de código. A saber, su implementación es de alguna de las dos

siguientes naturalezas:

• Temporizadores de retardo con ciclos anidados

Se construyen por medio de una estructura de ciclos anidados

calculando el tiempo que tarda en ejecutarse una instrucción “nop” (1

periodo de maquina o 4Tw) y ejecutando esta hasta conseguir el

tiempo requerido.

• Temporizadores con Timer en hardware

Se temporiza por medio del desbordamiento de alguno de los timers

de hardware con que cuenta el uC.

Page 44: C++ para microcontroladores y aplicación práctica

TEMPORIZADORES DE RETARDO CÍCLICO

• Sea la velocidad de reloj de 20Mhz, con un cristal de cuarzo HS conectado a las patillas

OSC1/OSC2:

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 44

Para lograr un retardo de 500 mS, por

ejemplo, tendríamos que saber cuantas veces

habría que ejecutar la instrucción “nop”.

Retardo = 500mS / 0.2 uS

= 0.500 / 0.0000002

= 2,500,000

veces la ejecución de nop

Tw = 1/20mHz = 50nS

La instrucción “nop” tarda en ejecutarse

un ciclo de reloj que son 4TW

Nop = 4 Tw = 0.2 uS

;Rutina de delay de 500ms Xtal=20Mzh

;-----------------------------------

delay:

movlw .40

movwf del500ms

cic500:

movlw .250

movwf externo

cic2:

movlw .250

movwf interno

cic1:

nop

decfsz interno

goto cic1

decfsz externo

goto cic2

decfsz del500ms

goto cic500

return

Page 45: C++ para microcontroladores y aplicación práctica

TEMPORIZADORES HARDWARE

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 45

• Los temporizadores son contadores que al activarlos empiezan una cuenta y cuando esta cuenta se acaba se activa el flanco de interrupción por el temporizador, entrando el micro en la rutina de interrupción del temporizador.

• El PIC18F4550 tiene 4 temporizadores, de los cuales 1 de ellos es de 8 bits y el resto de una precisión de 16 bits.

Page 46: C++ para microcontroladores y aplicación práctica

TIMER 0

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 46

Existe la posibilidad de activar un preescaler en los temporizadores de forma

que se pueda “alargar” la duración del temporizador, dependiendo del

temporizador puede ser de 2,4,8 e incluso 16.

Page 47: C++ para microcontroladores y aplicación práctica

TIMER 1

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 47

Resolución de los temporizadores:

Timer0 -> Temporizador configurable de 8 ó 16 bits.

Timer1 -> Temporizador de 16 bits.

Timer2 -> Temporizador de 8 bits.

Timer3 -> Temporizador de 16 bits.

Page 48: C++ para microcontroladores y aplicación práctica

RETARDOS CON EL TIMER0

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 48

Un retardo con un Timmer ofrece la posibilidad de operación independiente de la frecuencia de

reloj, ya que un Timmer hardware se basa en un conteo de un registro contador, lo cual da

robustez e independencia al software.

Proceso de Inicialización y uso del timmer0 como retardador sin

interrupciones:

1. Calcule el contador del timmer según la relación:

retardo = 4 * Prescaler * (65535 – valor cargado en timer0) * Fosc

Ejemplo:

TMR0 = 65535 – (retardo * Fosc) / (4 * prescaler)

Page 49: C++ para microcontroladores y aplicación práctica

PUERTOS DE ENTRADA/SALIDA Y MANEJO DE

DATOS

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 49

• El uC 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 uC. Cuando una línea trabaja en el

modo alternativo no puede ser utilizada como línea digital de E/S estándar.

Page 50: C++ para microcontroladores y aplicación práctica

PUERTOS DE ENTRADA/SALIDA

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 50

• 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.

Page 51: C++ para microcontroladores y aplicación práctica

PUERTOS DE ENTRADA/SALIDA

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 51

Page 52: C++ para microcontroladores y aplicación práctica

PUERTO A

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 52

• Dispone de 7 líneas de E/S. Las funciones alternativas son:

■ RAO: entrada analógica (ANO)/ entrada de comparación (C1IN-) ■ RAÍ: 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 (TOCKI)/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 (CLKO)

En el reset las líneas RAO, RAÍ, 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:

MOVLW 0FH ; Se desactiva la función de entrada analógica MOVWF ADCON1 ; para las líneas RAO, RA1, RA2, RA3 y RA4 MOVLW 07H ; Configura los comparadores para entrada digital. MOVWF CMCON ;para las líneas RAO, RA1, RA2 y RA3 MOVLW 3CH ; Se configuran RA5, RA4, RA3 y RA2 como entradas MOVWF TRISA ; y RA1 y RAO como salidas

Page 53: C++ para microcontroladores y aplicación práctica

REGISTRO ADCON1

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 53

– 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).

Page 54: C++ para microcontroladores y aplicación práctica

REGISTRO ADCON1

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 54

Page 55: C++ para microcontroladores y aplicación práctica

PUERTO B

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 55

• Dispone de 8 líneas de E/S. Las funciones alternativas son:

■ RBO: entrada analógica (AN12)/ interrupción externa 0 (INTO)/entrada de fallo del ECCP

(FLTO)/entrada de datos del SPI (SDI)/línea de datos del PC (SDA)

■ RB1: entrada analógica (AN10)/ interrupción externa 1 (INTl)/línea de reloj del SPI

(SDI)/línea de reloj del PC (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 (KBIO)/ 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)

Page 56: C++ para microcontroladores y aplicación práctica

PUERTO B

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 56

• 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=T 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='l' (valor por defecto) se pueden configurar RB4..RB0 como líneas el E/S digitales desactivando la función analógica:

MOVLW 0x07 ; Se desactiva la función de entrada analógica MOVWF ADCON1 ; para las líneas RBO, RB1, RB2, RB3 y RB4 MOVLW 0xF0 ; Se configuran RB7, RB6, RB5 y RB4 como entradas MOVWF TRISB ; y RB3, RB2, RB1 y RBO como salidas

Page 57: C++ para microcontroladores y aplicación práctica

PUERTO C

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 57

• Dispone de 5 líneas de E/S (RCO, RCl, RC2, RC6 y RC7) y 2 líneas de solo entrada (RC4 y

RC5). Las funciones alternativas son:

■ RCO: salida del oscilador del Temp. 1 (T1OSO)/ entrada de contador de los

temporizadores 1 y 3 (T13CKI)

■ RCl: entrada del oscilador del Temporizador 1 (TIOSI)/ 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 (PÍA)

■ 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

Page 58: C++ para microcontroladores y aplicación práctica

PUERTO D

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 58

• Dispone de 8 líneas de E/S. Las funciones alternativas son:

■ RDO: línea de datos del SPP (SPPO)

■ 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 pull.up: 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 T (RPDU='O' 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.

Page 59: C++ para microcontroladores y aplicación práctica

PUERTO E

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 59

• Dispone de 3 líneas de E/S (REO, RE1 y RE2) y 1 línea de solo entrada (RE3). Las funciones alternativas son:

■ REO: 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:

• MOVLW 0FH ; Se desactiva la función de entrada analógica MOVWF ADCON1 ; para las líneas REO, RE1 y RE2 MOVLW 06H ; Se configuran RE2 y RE1 como entradas MOVWF TRISE ; y RE0 como salida La línea RE3 por defecto tiene la función de Reset del uC. Si se desea desactivar la función de Reset y utilizar RE3 como línea de entrada digital hay que poner a '0' el bit MCLRE del registro de configuración CONFIG3H.

Page 60: C++ para microcontroladores y aplicación práctica

OSCILADOR

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 60

• El PIC18F4550, tiene un oscilador interno de 32 KHZ. Este PIC ejecuta una instrucción en un ciclo de máquina (4 periodos de reloj).

• Cuando se requiere aumentar la velocidad de procesamiento se debe conectar un oscilador externo con frecuencias de osciladores de 8, 10, 12, 16, 20, 32, 40 y 48 MHz.

• Los capacitores cerámicos entre 15 a 33 pF.

Page 61: C++ para microcontroladores y aplicación práctica

RESET

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 61

• Es la acción con la cual inicia el

trabajo del uC.

• Existe el pin 1 MCLR (masterclear)

que puede ser configurado como

RESET.

• Cuando se conecta a un nivel bajo

este pin, en el uC se produce un

reset. Para operación normal este

pin debe encontrarse a un nivel

alto.

Page 62: C++ para microcontroladores y aplicación práctica

ARMADO DEL SISTEMA MÍNIMO

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 62

Page 63: C++ para microcontroladores y aplicación práctica

¿QUÉ ES UN BOOTLOADER?

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 63

• El termino bootloader hace referencia a un pequeño programa

que se realiza para determinado microcontrolador, ya sea PIC,

Freescale, Atmel, etc. Este código lo que hace es tomar los

datos que se le enviaran por puerto serial (UART), USB,

Ethernet, el que sea que pueda enviar una cadena de Bytes al

microcontrolador. El microcontrolador va tomando esos datos

que le van llegando y los va "Programando" en su propia

memoria Flash.

Page 64: C++ para microcontroladores y aplicación práctica

¿QUÉ ES UN BOOTLOADER?

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 64

• Es necesario tener un programador para usarlo solo una vez y así grabarle el programa residente en memoria FLASH. Ya después de esto se usa el Bootloader para grabar la flash del micro.

• El programa residente ocupa memoria flash y por ende tienes un poco menos de memoria para la aplicación real del micro. No es mucha la que quita, pero hay que tener eso claro.

• Por ningún motivo se puede sobrescribir las posiciones de memoria FLASH en la que se encentra el programa residente Bootloader. Si se borra por algún error, pierdes el bootloader y toca nuevamente programarlo con un grabador externo.

• No todos los micros pueden soportar Bootloder, esto se limita a aquellos que tienen la capacidad de autograbar su memoria FlLASH. Por ejemplo el 16F84 no lo permite, por eso sacaron la versión PIC16F628A que si lo deja y además tiene mejores prestaciones.

Page 65: C++ para microcontroladores y aplicación práctica

CONFIGURACIÓN DEL HIDBOOTLOADER

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 65

• Microchip provee un Bootloader para agilizar el tiempo

de desarrollo de aplicaciones para Pic que cuentan con

interfaz USB

• Tan solo es necesario cargar el microcontrolador con el

firmware y proteger el área de booteo

• Adicionar los fuses convenientes en el código

• Relocalizar los vectores de interrupción para que no

toquen los vectores originales.

Page 66: C++ para microcontroladores y aplicación práctica

RELOCALIZACIÓN DE VECTORES DE INTERRUPCIÓN

• Los vectores originales situados en

la parte baja de la memoria son

asignados al BootLoader

• Los vectores relocalizados se

asignan al uso del programa de

usuario

• Es necesario escribir un script para

el linker (mplink) para que el

ensamblador “sepa” donde fueron

localizados los nuevos vectores y

donde se asigno el espacio de

memoria de programa para el

programa de usuario.

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 66

Page 67: C++ para microcontroladores y aplicación práctica

ESQUEMA DE ÁRBOL DE PROYECTO PARA USO CON

BOOTLOADER

• Programa principal con

vectores relocalizados

• Script para el linker

(MPLink)

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 67

Page 68: C++ para microcontroladores y aplicación práctica

FORMATO DEL LINKER SCRIPT

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 68

Page 69: C++ para microcontroladores y aplicación práctica

HIDBOOTLOADER

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 69

• El diagrama del sistema mínimo incluye la circuitería para sostener el HIDBootloader

• Para entrar en modo Bootloader, se debe presionar el botón conectado en RB4, manteniéndolo presionado, después se debe dar RESET al pic con otro pulsador en el pin MCLR. Al resetear el PIC, lo primero que hace el PIC es preguntar por el estado del PIN RB4 donde esta el pulsador. De estar presionado este botón, el PIC entra en modo Bootloader y si no ejecuta el código normal que le grabamos al PIC.

• El led conectado en el puerto RD1 se enciende y apaga cuando entra en modo Bootloader.

Page 70: C++ para microcontroladores y aplicación práctica

HIDBOOTLOADER SOFTWARE

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 70

Page 71: C++ para microcontroladores y aplicación práctica

FORMATO DE LOS FUSES EN ENSAMBLADOR

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 71

;--------------------------------------------------------------------------------------

;Bits de configuración

;----------------------------

CONFIG PWRT = ON ;PWRT habilitado

CONFIG WDT = OFF ;Watchdog deshabilitado

CONFIG MCLRE = ON ;MCLR como entrada

CONFIG PBADEN = OFF ;Todos los pines del puerto B como entradas ;analogicas

CONFIG DEBUG = OFF ;Deshabilitar modo DEBUG

CONFIG LVP = OFF ;Deshabilitacion del modo programacion de bajo nivel

CONFIG FOSC = HSPLL_HS ;Oscilador de alta velocidad con PLL habilitado

CONFIG BOR = OFF

CONFIG USBDIV = 1

CONFIG PLLDIV = 5

CONFIG CPUDIV = OSC1_PLL2

CONFIG VREGEN = ON

;********* Bits de protección ******************

CONFIG WRTB = ON ;bit de proteccion del area de booteo

CONFIG CP0 = OFF ;los bloques del codigo de programa

CONFIG CP1 = OFF ;no estan protegidos

CONFIG CP2 = OFF

CONFIG CP3 = OFF

CONFIG CPB = ON ;Sector Boot esta protegido

CONFIG CPD = ON ;La EEPROM esta protegida

Page 72: C++ para microcontroladores y aplicación práctica

FORMATO DE LLAMADAS EN ENSAMBLADOR

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 72

;------------------------------------------------------------------------------------

;vector de interrupcion del reset

;--------------------------------

ORG 0x1000

goto main

;-----------------------------------------------------------------------------------

;vector de interrupcion de alta prioridad

;----------------------------------------

ORG 0X1008

goto main

;-----------------------------------------------------------------------------------

;vector de interrupcion de baja prioridad

;----------------------------------------

ORG 0X1018

goto main

Page 73: C++ para microcontroladores y aplicación práctica

1.4. DISEÑO DE APLICACIONES CON PIC

(LENGUAJE C, C18)

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 73

• Repertorio de instrucciones

• Diseño de aplicaciones básicas en lenguaje C

• Puertos de E/S, temporizadores y manejo de datos

• Interrupciones

Page 74: C++ para microcontroladores y aplicación práctica

EL COMPILADOR MC18

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 74

• Si queremos realizar la programación de los microcontroladores

PIC en un lenguaje como el C, es preciso utilizar un compilador

de C.

• Dicho compilador nos genera ficheros en formato Intel-

hexadecimal, que es el necesario para programar (utilizando un

programador de PIC) un microcontrolador de 6, 8, 18 ó 40

patillas.

Page 75: C++ para microcontroladores y aplicación práctica

EL COMPILADOR MC18

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 75

• Mas productividad

• Permite codificado en línea de ASM

• Soporta compilado en línea con MPLAB

• Portabilidad de código en lenguaje C

• Soporta recursividad de funciones

• Amplia gama de microcontroladores

• Capacidad de relocalización de código y vectores de interrupción

Page 76: C++ para microcontroladores y aplicación práctica

FORMATO DE PROGRAMA (1)

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 76

#include <p18f4550.h>

#include <delays.h>

//Bits de configuracion

//--------------------------------------------------------------------

#pragma config PWRT = ON //PWRT habilitado

#pragma config WDT = OFF //Watchdog deshabilitado

#pragma config MCLRE = ON //MCLR como entrada

#pragma config PBADEN = OFF //Todos los pines del puerto B como entradas digitales

#pragma config DEBUG = OFF //Deshabilitar modo DEBUG

#pragma config LVP = OFF //Deshabilitacion del modo programacion de bajo nivel

#pragma config FOSC = HSPLL_HS //Oscilador de alta velocidad con PLL habilitado

#pragma config BOR = OFF //Brown out Voltage desactivado

#pragma config USBDIV = 1 //Divisor de FOSC para el puerto USB activado

#pragma config PLLDIV = 5 //Factor de division para el generador de señal de reloj (cristal de 20Mhz)

#pragma config CPUDIV = OSC1_PLL2

#pragma config VREGEN = ON

//Bits de proteccion

//-------------------------------------------------------------------

#pragma config WRTB = ON //bit de proteccion del area de booteo

#pragma config CP0 = OFF //los bloques del codigo de programa

#pragma config CP1 = OFF //no estan protegidos

#pragma config CP2 = OFF

#pragma config CP3 = OFF

#pragma config CPB = ON //Sector Boot esta protegido

#pragma config CPD = ON //La EEPROM esta protegida

Page 77: C++ para microcontroladores y aplicación práctica

FORMATO DE PROGRAMA (2)

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 77

/**VARIABLES **************************************************/

#pragma udata

/** FUNCIONES PROTOTIPO ***************************************/

/** VECTOR REMAPPING ******************************************/

extern void _startup (void);

#pragma code _RESET_INTERRUPT_VECTOR = 0x000800

void _reset (void)

{

_asm goto _startup _endasm

}

#pragma code

#pragma code _HIGH_INTERRUPT_VECTOR = 0x000808

void _high_ISR (void)

{

;

} #pragma code _LOW_INTERRUPT_VECTOR = 0x000818

void _low_ISR (void)

{

;

}

Page 78: C++ para microcontroladores y aplicación práctica

FORMATO DE PROGRAMA (3)

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 78

/** CODIGO DE LA FUNCION PRINCIPAL ***************************/

#pragma code

void main(void)

{

TRISD = 0; //TODOS LOS PINES DEL PUERTO B COMO SALIDA

LATD = 0; //TODOS LOS PINES DEL PUERTO B EN CERO

while(1)

{

LATDbits.LATD7 = !LATDbits.LATD7;

Delay10KTCYx(250);

}

}//end main()

Page 79: C++ para microcontroladores y aplicación práctica

OPERADORES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 79

• Asignación:

Page 80: C++ para microcontroladores y aplicación práctica

OPERADORES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 80

• Aritméticos

Page 81: C++ para microcontroladores y aplicación práctica

OPERADORES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 81

• Relacionales

Page 82: C++ para microcontroladores y aplicación práctica

OPERADORES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 82

• Lógicos

• De manejo de bits

Page 83: C++ para microcontroladores y aplicación práctica

OPERADORES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 83

• Incremento, decremento y desplazamiento de bits

Page 84: C++ para microcontroladores y aplicación práctica

OPERADORES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 84

• Dirección e Indirección

• Ejemplos:

• p = &contador; /* p apunta a la dirección de contador */

• El operador de indirección *, nos da el valor o contenido de la variable cuya dirección está

apuntada por el puntero.

• p = &contador; /* p apunta a la dirección de contador */

• a = *p; /* guarda en a el contenido de la var. apuntada por p */

Page 85: C++ para microcontroladores y aplicación práctica

EXPRESIONES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 85

Page 86: C++ para microcontroladores y aplicación práctica

MANEJO DE DATOS

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 86

• Tipos: El lenguaje C proporciona cinco

tipos básico de datos, con cuatro

modificadores posibles. Podemos utilizar

variables de cualquiera de esos tipos.

• La tabla siguiente muestra los tipos

disponibles:

• C18 permite una "forma corta" para

escribir algunos de los tipos.

Concretamente, podemos utilizar

unsigned, short, o long en lugar de

unsigned int, short int, o long int.

Page 87: C++ para microcontroladores y aplicación práctica

• Las variables deben ser

declaradas antes de ser

utilizadas en el programa. El

proceso de declaración de

variables le dice a C18 de que

tipo son y como se llaman. Al

igual que las demás

instrucciones de C18, deben

terminar con “;”.

• La forma en que se declara una

variable es la siguiente:

tipo nombre_de_la_variable;

Donde:

tipo es alguno de los enumerados en la

tabla anterior.

Unos ejemplo son:

int temperatura;

int a = 0;

signed long a = 125, b, c = -10;

char nombre = 'juan perez';

DECLARACIÓN DE VARIABLES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 87

Page 88: C++ para microcontroladores y aplicación práctica

• C18 nos permite mezclar diferentes tipos de variables dentro de una misma expresión. Y existen un conjunto de reglas que nos permiten saber de que tipo será el resultado de la misma.

• El C18 convertirá a int cualquier expresión que contenga variables char, short o int. Esta conversión solo tiene efecto mientras se realizan los cálculos. Las variables en sí mismas no cambian su tipo.

• Las reglas de conversión de tipos hacen que el resultado de una operación sea siempre el mismo que el de la variable más larga que intervenga en ella. Sin embargo, podemos forzar a que el resultado sea de un tipo en particular, de la siguiente forma:

• (tipo) valor

donde tipo es el tipo al que queremos que pertenezca valor. El siguiente ejemplo nos aclarará todo esto:

int a = 250, b = 10;

long c;

c = a * b;

CONVERSIONES ENTRE TIPOS

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 88

Page 89: C++ para microcontroladores y aplicación práctica

EJEMPLO 1

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 89

• “Hola Mundo” con un simple led

Page 90: C++ para microcontroladores y aplicación práctica

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 90

Page 91: C++ para microcontroladores y aplicación práctica

PODEMOS DEFINIR UN PUERTO EN C18

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 91

1. Por medio de una referencia simbólica

2. Por medio de comandos del C18

Page 92: C++ para microcontroladores y aplicación práctica

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 92

MAPA DE E/S

DEL

PIC18F4550

Page 93: C++ para microcontroladores y aplicación práctica

POR MEDIO DE UNA REFERENCIA SIMBÓLICA

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 93

• Siempre puede definirse un bit:

• #define <simbolo> <PORT>bits.#pin

• Ejemplo: #define Led PORTBbits.PORTB0

• Después ponerlo a un nivel:

• <simbolo>=[0|1]

• Ejemplo: Led=0;

• Obtener el nivel:

• <simbolo>)==[1|0]

• If(Led==0)

Nunca olvidar definir como va a usarse cada bit:

TRIS<port>(<estado de los bits>);

Page 94: C++ para microcontroladores y aplicación práctica

POR MEDIO DE COMANDOS C18

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 94

• Configuración de los pines de E/S

Cada puerto tiene vinculados determinados pines agrupados en forma

de un “Puerto”, los pines deben configurarse individualmente, los registros de

configuración siguen el estandar del Ensamblador.

TRIS<puerto> configura los bits vinculados con un puerto en particular

un bit en [1] define una entrada

un bit en [0] define una salida

Page 95: C++ para microcontroladores y aplicación práctica

PROGRAMAS EJEMPLO:

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 95

• Programa “hola mundo”

• Corrimientos a la derecha y a la izquierda

• Rotación de bits a la derecha y a la izquierda

• Contador binario de 8 bits(0-255)

• Pausas en milisegundos

• Detección de nivel con pushboton

Page 96: C++ para microcontroladores y aplicación práctica

INTERRUPCIONES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 96

• Las interrupciones son tareas programas que el micro

realiza cuando el flanco de interrupción se activa, con

lo que el micro deja el programa principal y accede a

una parte reservada de la memoria que se llama rutina

de interrupción, donde una vez acabada la rutina de

interrupción, se baja el flanco de interrupción que lo ha

provocado y el micro continua el programa principal

donde lo había dejado antes de ir a la rutina de

interrupción.

Page 97: C++ para microcontroladores y aplicación práctica

INTERRUPCIONES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 97

• Las interrupciones en el micro pueden darse de varios tipos:

• Interrupciones externas.

• Interrupciones por desbordamiento del contador.

• Interrupciones de EUSART.

• Interrupciones USB.

• Interrupciones del ADC.

• Interrupciones por periféricos externos.

Page 98: C++ para microcontroladores y aplicación práctica

INTERRUPCIONES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 98

• El micro puede tener varias interrupciones programadas a la vez, pero hay que tener en cuenta que una vez que el código entra en una rutina de interrupción, el micro no puede acceder a otra interrupción hasta que la rutina de interrupción que se está ejecutando finalice.

• En el caso de que saltasen a la vez 2 o más interrupciones, el micro accedería aleatoriamente a una de ellas, es por ello que suele darse prioridad a las interrupciones si tenemos alguna rutina de interrupción más importantes que otras.

Page 99: C++ para microcontroladores y aplicación práctica

INTERRUPCIONES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 99

• El Pic18F4550 cuenta con tres vectores de interrupcion, mismo que apuntan a las rutinas

de servicio correspondientes:

• Reset (0000h)

• Usuario alta prioridad (0008h)

• Usuario baja prioridad (0018h)

Page 100: C++ para microcontroladores y aplicación práctica

INTERRUPCIONES

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 100

• ¿Como se codifican las interrupciones?

;--------------------------------------------------------------------------

;vector de interrupción del reset

;--------------------------------

ORG 0x0000

goto main ;Etiqueta donde inicia la ISR

;--------------------------------------------------------------------------

;vector de interrupción de alta prioridad

;----------------------------------------

ORG 0X0008

goto main ;Etiqueta donde inicia la ISR

;--------------------------------------------------------------------------

;vector de interrupción de baja prioridad

;----------------------------------------

ORG 0X0018

goto main ;Etiqueta donde inicia la ISR

• Las instrucciones GOTO <label>,

transfieren el control a una parte

de nuestro programa donde reside

la ISR

• ISR significa Interrupt Service

Routine, es decir rutina de

servicio a interrupción y en pocas

palabras y lenguaje coloquial no

es otra cosa que el código que

deberá ejecutar el

microcontrolador cuando ocurra

el estímulo hardware que

desencadena la interrupción, por

ejemplo presionar el botón de

RESET.

Page 101: C++ para microcontroladores y aplicación práctica

EJEMPLO 2

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 101

• “Hola mundo” con LCD 16x2 alfanumérico

Page 102: C++ para microcontroladores y aplicación práctica

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 102

Page 103: C++ para microcontroladores y aplicación práctica

• Botones y Leds

• Teclado de matriz

• Display Led, Alfanumérico y Grafico

1.4. INTERCONEXIÓN DE PERIFÉRICOS

Page 104: C++ para microcontroladores y aplicación práctica

BOTONES Y LEDS

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 104

• Por lo general es necesario siempre agregar un botón para señalizar alguna acción que

debe lleva a cabo el usuario del sistema embebido, por ejemplo, el manejo de un menú

de opciones, la ocurrencia de un evento, el accionamiento de un actuador, etc.

• Los botones utilizados en los sistemas embebidos por lo general son microswitches como

los que a continuación se ilustra en la figura.

En Proteus Isis un botón se representa

como se muestra en la figura de la

derecha, por lo general el pin donde es

conectado un botón como entrada se

envía a Pull-Up con una resistencia de

4.7k a 10k y un capacitor en paralelo a

tierra con el pushBoton para eliminar los

rebotes provocados al presionar el botón.

Este circuito es con activación a 0, es

decir el pin lee 1 y al presionar el botón se

va a nivel 0.

Page 105: C++ para microcontroladores y aplicación práctica

BOTONES Y LEDS

• En el caso de los leds, estos tienen al menos tres presentaciones en encapsulado

through-Hole y se clasifican según el tamaño: 3, 5 y 10 milímetros respectivamente,

según el diámetro del capuchón y también la forma porque existen redondos, planos

y rectangulares.

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 105

Page 106: C++ para microcontroladores y aplicación práctica

TECLADO DE MATRIZ

• El teclado en un sistema embebido se implementa de diferentes formas, puede ser

implementado con una simple botonera con el circuito básico mostrado en el tema

de botones, cada uno con su resistencia de pull-up y capacitor antirrebote. Sin

embargo, este tipo de diseño para una botonera de mas de 3 botones suele ser

poco practica:

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 106

Para los casos en los cuales se requiere

una forma mas estilizada de teclado se

usa un formato matricial, ya sea en forma

de 4 renglones X 3 filas o de 4 x 4.

Page 107: C++ para microcontroladores y aplicación práctica

TECLADO DE MATRIZ

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 107

Page 108: C++ para microcontroladores y aplicación práctica

DISPLAY LED, ALFANUMERICO Y GRAFICO

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 108

• Los tipos de display interconectados a un microcontrolador tienen tres aplicaciones en particular:

• Display led de 7 segmentos, que se usa como señalizador de conteo o reloj, la particularidad de este tipo de configuración es el multiplexeo del canal de datos, ya que solo se usan 7 o 4 líneas de un puerto para enviar el código de despliegue y otras tantas líneas de salida para la polarización del display.

• Display alfanumérico LCD, por lo general el mas usado es el de 2 líneas x 16 caracteres o de 4 líneas x 20 caracteres.

• El display grafico mas ampliamente usado es el de 128x64 y en este tipo de display la unidad básica es el pixel.

Page 109: C++ para microcontroladores y aplicación práctica

DISPLAY LED DE 7 SEGMENTOS

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 109

• Display Led:

Page 110: C++ para microcontroladores y aplicación práctica

DISPLAY ALFANUMERICO

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 110

Page 111: C++ para microcontroladores y aplicación práctica

DISPLAY ALFANUMERICO

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 111

Page 112: C++ para microcontroladores y aplicación práctica

M.C. Andrés Gerardo

Fuentes Covarrubias

112

LCD 16X2

El LCD cuenta en sus señales de control de patillas para gobernar el intercambio de datos y comandos entre el microcontrolador y el LCD. Básicamente:

• E (Enable): Después de enviar un dato o comando al LCD un impulso positivo no menor de 450nS valida el bus de datos y hace que el LCD tome en consideración lo que este presente en el.

• R/W’ (Lectura/Escritura’): Si esta en nivel 1 pone el bus de datos en modo de lectura, si es 0 lo pone en modo de escritura, por lo general esta señal permanentemente se hace 0, a menos que el programador vaya a efectuar operaciones de lectura a la memoria del LCD.

• RS (Selección de Registro): Por medio de esta señal, el LCD discrimina si lo que esta presente en el bus de datos es un Comando (RS=0) o un código ASCII para desplegar en el display. (RS=1).

Page 113: C++ para microcontroladores y aplicación práctica

M.C. Andrés Gerardo

Fuentes Covarrubias

113

LCD 16X2

• Juego de señales

Page 114: C++ para microcontroladores y aplicación práctica

USO E INICIALIZACIÓN DEL LCD ALFANUMÉRICO

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 114

• Las funciones de manejo del LCD alfanumérico se encuentran en la librería XLCD.h

• El comando OpenXLCD(FOUR_BIT & LINES_5X7) ejecuta el proceso de inicialización

del LCD, indica al controlador de LCD HD44780 fabricado por Hitachi que inicialice el

LCD conectado al uC por medio de 4 líneas de control/datos y que el carácter formado

será de 5x7 pixeles con un display multilinea.

• La función putrsXLCD( “” ); envía datos hacia el LCD para su despliegue. Si fuese

necesario tener salida de datos formateada deberá antes usarse la funcion sprintf() y

posteriormente putsXLCD().

• Se puede redirigir la salida de consola por medio de printf() reenviándola al LCD

mediante printf(lcd_putc,…)

Page 115: C++ para microcontroladores y aplicación práctica

FUNCIONES RELACIONADAS CON EL LCD

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 115

Page 116: C++ para microcontroladores y aplicación práctica

DISPLAY GRAFICO

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 116

La resolución tradicional para

aplicaciones embebidas es

de 128 x 64 pixeles.

A diferencia del display

alfanumérico 16x2 es

necesario manejar los

pixeles individualmente y

crear las fuentes de texto con

algún editor de fuentes y

exportarlas como librerías al

proyecto del compilador.

El bus de datos es de 8 bits y

no es opcional manejar 4 bits

como los LCD 16x2.

Page 117: C++ para microcontroladores y aplicación práctica

DISPLAY GRAFICO

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 117

Page 118: C++ para microcontroladores y aplicación práctica

• El convertidor analógico – digital y medición de temperaturas

• El DAC con resistencias, Interconexión de un MC1408-0 y

control de potencia en DC

1.6. CONVERTIDORES DE DATOS Y

APLICACIONES BÁSICAS

Page 119: C++ para microcontroladores y aplicación práctica

CONVERTIDOR ANALÓGICO-DIGITAL

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 119

• Microchip PIC18F4550 contiene 13 convertidores analógicos digitales, los cuales pueden

ser seleccionados en modos de resolución de 8 ó 10 bits, para ello antes habrá que

configurar las entradas en modo ADC.

Page 120: C++ para microcontroladores y aplicación práctica

CONVERTIDOR ANALÓGICO-DIGITAL

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 120

Page 121: C++ para microcontroladores y aplicación práctica

CONVERTIDOR ANALÓGICO-DIGITAL

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 121

• Otra de sus características es que tiene dos patillas de referencia donde podemos dar la tensión de referencia para todas o algunas de las entradas del CAD.

• Otra posibilidad es configurar el tiempo de adquisición de datos, pues tiene un registro habilitado especialmente pare ello ya que en algunas ocasiones hay que esperar al interruptor de muestreo que se cierre y que el condensador (Chold) se descargue para poder hacer otra adquisición.

Page 122: C++ para microcontroladores y aplicación práctica

CONVERTIDOR ANALÓGICO-DIGITAL

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 122

Se recomienda que la máxima resistencia de entrada (Rs) sea de

2.5K, pues sino la conversión no sería del todo fiable, por lo que

habría que hacer una adaptación de impedancias entre las partes.

Page 123: C++ para microcontroladores y aplicación práctica

M.C. Andrés Gerardo

Fuentes Covarrubias

123

MODELO DE CONVERSIÓN

• El multiplexor.- El ADC es un convertidor de aproximaciones sucesivas de 10 bits, el cual puede realizar la conversión de una de las 8 entradas (o canales) analógicas AN0,...,AN7 multiplexadas por la lógica interna que utiliza como líneas de selección del canal los bits CHS2:CHS0, en donde se coloca el número en binario del canal a convertir.

• Voltajes de Referencia.- Todo convertidor ADC requiere voltajes de referencia que determinan el valor de mínima escala (VREF-) y el de plena escala (VREF+), de manera que la conversión de un valor de voltaje analógico Vin en el rango de VREF- a VREF+ producirá un valor equivalente binario D en el rango de 0 a 2n, donde n es la resolución del convertidor (n = 10).

Page 124: C++ para microcontroladores y aplicación práctica

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS 124

Page 125: C++ para microcontroladores y aplicación práctica

M.C. Andrés Gerardo

Fuentes Covarrubias

125

INICIALIZACIÓN DEL ADC • Encabezado

#include <18f4550.h>

#include <adc.h>

• Inicialización del ADC y el canal a muestrear

unsigned int ADCResult=0;

unsigned char config1=0x00,config2=0x00,portconfig=0x00;

//Inicializar ADC con los siguientes parámetros:

//----------------------------------------------

// FOSC/2 como reloj de conversion (ADC_FOSC_2)

// Resultado justificado a la derecha del registro de conversion (ADC_RIGHT_JUST)

// Tiempo de adquisicion de 2 Tad (ADC_2_TAD)

// Muestreo en el Canal 1 (ADC_CH0)

// Interrupciones del ADC habilitadas (ADC_INT_ON)

// Voltaje de referencia del ADC desde VDD a VSS (ADC_REF_VDD_VSS)

config1 = ADC_FOSC_2 | ADC_RIGHT_JUST | ADC_2_TAD ;

config2 = ADC_CH0 | ADC_INT_ON | ADC_REF_VDD_VSS ;

portconfig = ADC_0ANA ;

OpenADC(config1,config2,portconfig);

Page 126: C++ para microcontroladores y aplicación práctica

126

INICIALIZACIÓN DEL ADC

• Muestreo

// Habilitamos el ADC

ADC_INT_ENABLE();

for(;;)

{

// Toma una muestra y la convierte a voltaje

ConvertADC();

while(BusyADC());

ADCResult = (unsigned int) ReadADC();

//volts = (ADCResult*5.0)/1024.0; // convierte el valor del ADC a su equivalente en voltaje

printf("Dato=%u \r\n",ADCResult); //Lo despliega en la consola

Delay10KTCYx(retraso1s);

}

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 127: C++ para microcontroladores y aplicación práctica

127

APLICACIÓN PRÁCTICA

• Medición de temperatura

• Sensor LM35 grados centígrados

• Sensor lineal

• Necesidad de un Circuito Acondicionador de Señal (CAS)

• Regulación de la velocidad de muestreo

• Tipos de variables en control análogo

• Acciones de control según la variable controlada.

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 128: C++ para microcontroladores y aplicación práctica

128

EL SENSOR DE TEMPERATURA LM35Z

• Sensor en grados centígrados

• Escala de medición 10mV/°C

• Salida lineal

• Fuente de alimentación unipolar positiva

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 129: C++ para microcontroladores y aplicación práctica

129

COMPORTAMIENTO LINEAL

• Solo temperaturas positivas

• Resistencia única de

linealización

• Polarización totalmente positiva

• Sin CAS

• Interfaz directa con el

microcontrolador, entrada

analógica

M.C. ANDRÉS GERARDO

FUENTES COVARRUBIAS

Page 130: C++ para microcontroladores y aplicación práctica

M.C. Andrés Gerardo Fuentes

Covarrubias 130

¿PORQUÉ USAR UN CAS (CIRCUITO ACONDICIONADOR DE

SEÑAL)? •En la aplicación típica con

una fuente unipolar, la

salida de voltaje esta

autoelevada para permitir

la lectura de temperaturas

positivas y negativas.

•Rango de medición de

(-55) a (+150°C)

•Se usa una resistencia de

calibración de 18k

•La salida es la diferencia

de tensión entre las

terminales de salida del

sensor.

Page 131: C++ para microcontroladores y aplicación práctica

131

CIRCUITO DE ACONDICIONAMIENTO DE SEÑAL

24.0

3

1

VOUT2

U1

LM35

V15V

3

2

1

84

U2:A

LM358

U1(VOUT)

R2

10k

R1

10k

D11N4148

D21N4148

R318k

R410k

R5

10k

U2:A(OP)

R1(1)

LM35Z Comparador de

Ganancia unitaria

Salida

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 132: C++ para microcontroladores y aplicación práctica

132

EL AMPLIFICADOR OPERACIONAL

• LM358, OpAmp cuadruple unipolar

• Usado para CAS para uC unipolares

• Baja señal y bajo voltaje de conversión

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 133: C++ para microcontroladores y aplicación práctica

133

ACONDICIONAMIENTO LINEAL DE SEÑALES

EL AMPLIFICADOR DIFERENCIAL

• (V+) se obtiene de la división de voltajes: (V+) = [R2/(R2 + R1)]V2

• Las corrientes IA e IB se calculan usando la ley de Ohm.

• IA = IB y (V+) = (V-)

• Vo se obtiene de una sustitución sencilla.

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 134: C++ para microcontroladores y aplicación práctica

• SE ADELANTA EL TEMA DEL CAPITULO 3 POR

ASI REQUERIRLO LA APLICACIÓN PRACTICA.

3.2. COMUNICACIÓN SERIAL DE DATOS

MICROCONTROLADOR – PC

Page 135: C++ para microcontroladores y aplicación práctica

COMUNICACIONES SERIALES PIC18F4550

135

• Están reguladas por la USART del PIC

• Se utilizan pines particulares del PIC

• Pueden elegirse tres tipos de interfaz, a saber:

• SPI (Asíncrona), SCI (Sincrona), I2C (Sincrona)

• Este modulo de librería para periférico contiene:

• Soporta transmisión/recepción de bytes

• Incorpora funciones para transmisión/recepción multi BYTE

• Provee funciones para manejo de buffers

• Provee macros para habilitar/deshabilitar interrupciones

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 136: C++ para microcontroladores y aplicación práctica

INTERFAZ

136

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 137: C++ para microcontroladores y aplicación práctica

INSTRUCCIONES DEL C18

137

• FUNCIONES

• OPENUSART()

• WRITEUSART()

• baudUSART()

• getsUSART()

• putrsUSART()

• putsUSART()

• ReadUSART()

• MACROS

• DataRdyUSART

• CloseUSART

• BusyUSART

• putcUSART

• getcUSART

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 138: C++ para microcontroladores y aplicación práctica

INICIALIZACIÓN DE LA USART

138

• FUNCIONES

• OPENUSART(),

• sintaxis: OPENUSART(unsigned char config, unsigned int spbrg);

• Parámetros básicos:

• USART_TX_INT_OFF :Interrupción por transmisión=OFF

• USART_RX_INT_OFF :Interrupción por recepción=OFF

• USART_ASYNCH_MODE :Modo asíncrono típico de RS232C

• USART_EIGHT_BIT :Modo datos=8 bits

• USART_CONT_RX :Modo recepción continua de datos

• USART_BRGH_LOW :Palabra de configuración para velocidad baja

• Selección de velocidad de transmisión, velocidad baja: spbrg=X

• X=(Fosc/velocidad_transmision)/64)-1 Para 9600 X=77

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 139: C++ para microcontroladores y aplicación práctica

TRANSMISIÓN DE CARACTERES

139

Para la transmisión de caracteres se puede usar una función dedicada, o bien la

función de consola printf() con las opciones de formateo de salida:

Ejemplo: printf(“Contador=%u %u”,contador1, contador2);

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 140: C++ para microcontroladores y aplicación práctica

RECEPCIÓN DE CARACTERES (POLLING)

140

Para la recepción de caracteres se puede usar una función dedicada, o bien las funciones de consola con las opciones de formateo:

Ejemplo: getcUSART()

Es necesario escanear el valor de la bandera RCIF para saber en que momento la EUSART ha recibido un dato por el puerto serial si se trabaja en modo de polling de la interfaz serial, el código resultante es como el siguiente:

dato=0;

while(dato!=13) //Recibimos datos hasta que se reciba un \r

{

while(PIR1bits.RCIF==0); //Ciclar mientras no haya dato

dato=getcUSART(); //Leer dato recibido en el buffer

printf("%c",dato); //Retrasmitimos para depurar

}

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 141: C++ para microcontroladores y aplicación práctica

RECEPCIÓN DE CARACTERES (INTERRUPCIÓN)

141

Para la recepción de caracteres mediante el método de interrupciones es

necesario definir en ON la bandera de configuración correspondiente al

momento de configurar la EUSART mediante la función OpenUSART():

OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON &

USART_ASYNCH_MODE & USART_EIGHT_BIT &

USART_CONT_RX & USART_BRGH_LOW, 77);

Siguiendo la metodología de definición de interrupciones, asignar una función

de servicio a la interrupción en el vector de interrupción bajo 0008H.

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 142: C++ para microcontroladores y aplicación práctica

142

Siguiendo la metodología de definición de interrupciones, asignar una función de servicio a la interrupción en el vector de interrupción bajo 0008H. //** Seccion de interrupciones ************************** void ISRRecepcion (void); //Funcion prototipo para la interrupcion del RCIF volatile char dato, kbHit; //Variables utilizadas en el control de la interrupcion #pragma code Interrupcion = 0x0008 void VectorInterrupcion (void) { _asm goto ISRRecepcion _endasm } #pragma code //Se cierra seccion //Rutina de servicio a la interrupcion de recepcion serial #pragma interrupt ISRRecepcion void ISRRecepcion (void) { if (PIR1bits.RCIF==1) { dato=getcUSART(); //Se lee dato recibido kbHit=1; //Indica que se ha recibido un dato PIR1bits.RCIF=0; //Borramos bandera de interrupcion } }

M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 143: C++ para microcontroladores y aplicación práctica

143

Finalmente, inicializar las interrupciones por periféricos en el programa principal y atrapar la bandera de

recepción:

void main(void)

{

TRISB=0;

OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE &

USART_EIGHT_BIT &

USART_CONT_RX & USART_BRGH_LOW, 77);

RCONbits.IPEN =0;

//Deshabilitamos prioridades

INTCONbits.PEIE =1;

//Habilitamos la interrupcion de perifericos

INTCONbits.GIE =1;

//Habilitamos interrupcion global

kbHit =0;

//Inicializamos la bandera de recepcion de caracter

for(;;)

{

if(kbHit==1)

{

printf("%c",dato);

kbHit=0;

}

}

} M.C. ANDRÉS GERARDO FUENTES

COVARRUBIAS

Page 144: C++ para microcontroladores y aplicación práctica

144

DUDAS Y PREGUNTAS:

[email protected]

[email protected]

[email protected]

• FACEBOOK: /Andres.FuentesCovarrubias