23. 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.
24. M.C. ANDRÉS GERARDO FUENTES
COVARRUBIAS
24
Ciclo de vida de un software embebido
25. M.C. ANDRÉS GERARDO FUENTES
COVARRUBIAS
25
Técnica de desarrollo del software
embebido
26. • 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
27. 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.
29. 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.
30. 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.
32. 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.
33. 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
34. 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.
35. • Repertorio de instrucciones
• Temporizadores, Puertos de E/S y manejo de datos
• Interrupciones
1.4. DISEÑO DE APLICACIONES CON PIC
(LENGUAJE ENSAMBLADOR)
36. 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
37. 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
38. 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
43. 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.
44. 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
45. 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.
46. 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.
47. 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.
48. 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)
49. 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.
50. 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.
52. 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
53. 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).
55. 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)
56. 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
57. 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
58. 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.
59. 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.
60. 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.
61. 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.
63. ¿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.
64. ¿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.
65. 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.
66. 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
67. 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
69. 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.
71. 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
72. 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
73. 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
74. 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.
75. 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
76. 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
78. 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()
84. 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 */
86. 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.
87. • 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
88. • 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
89. EJEMPLO 1
M.C. ANDRÉS GERARDO FUENTES
COVARRUBIAS
89
• “Hola Mundo” con un simple led
91. 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
93. 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>);
94. 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
95. 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
96. 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.
97. 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.
98. 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.
99. 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)
100. 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.
103. • Botones y Leds
• Teclado de matriz
• Display Led, Alfanumérico y Grafico
1.4. INTERCONEXIÓN DE PERIFÉRICOS
104. 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.
105. 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
106. 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.
108. 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.
109. DISPLAY LED DE 7 SEGMENTOS
M.C. ANDRÉS GERARDO FUENTES
COVARRUBIAS
109
• Display Led:
112. 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).
114. 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,…)
116. 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.
118. • 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
119. 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.
121. 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.
122. 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.
123. 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).
125. 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);
126. 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 rn",ADCResult); //Lo despliega en la consola
Delay10KTCYx(retraso1s);
}
M.C. ANDRÉS GERARDO FUENTES
COVARRUBIAS
127. 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
128. 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
129. 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
130. 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.
132. 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
133. 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
134. • SE ADELANTA EL TEMA DEL CAPITULO 3 POR
ASI REQUERIRLO LA APLICACIÓN PRACTICA.
3.2. COMUNICACIÓN SERIAL DE DATOS
MICROCONTROLADOR – PC
135. 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
138. 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
139. 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
140. 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
141. 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
142. 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
143. 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