You are on page 1of 105

MICROPROCESADORES MICROPROCESADORES

MlC8CCCn18CLAuC8LS lC
lnLroduccln
Leandro Leandro FI FIrez rez AristizbaI AristizbaI
Orden deI da
Frase del da
Presentacin
Expectativas
Plan de curso
Acuerdo pedaggico
Diagnstico Acadmico
Diagramas de flujo
ulAC8AMAS uL lLu!C
8CCLSC
S1A81
uLClSlCn
An1ALLA
Lnu
ulAC8AMAS uL lLu!C
8eallzar un programa en dlagrama de flu[o que descrlba el proceso
para reallzar una llamada
8eallzar un programa en dlagrama de flu[o que descrlba el proceso
para lr a esLudlar
8eallzar un programa en dlagrama de flu[o que descrlba el proceso
de una lavadora que Llene dos clclos de lavado (fuerLe y suave) sl se
escoge fuerLe se llena el Lanque de agua el lavado durar 3
mlnuLos se deLlene por 30 segundos y expulsa el agua Sl el clclo es
suave se llena el Lanque a la mlLad el lavado durar 1 mlnuLo se
deLlene por 10 segundos y expulsa el agua Ln ambos clclos cuando
Lermlne de expulsar el agua volver al esLado lnlclal
MICROPROCESADOR
(SISTEMA ABIERTO)
uC
ALu
8LCS
8uS uA1CS
8uS ul8LCClCnLS
SISTEMA
MICROPROCESADO
I]C
UNI1
MLMCkILS
UNI1
8US DLL SIS1LMA
uC
ALu
8LCS
MICROCONTROLADOR
uC
ALu
8LCS
I]C
MLMCk
ARQUITECTURAS
ICN NLUMANN
nAkIAkD
PIC 16F877A
CARACTERSTICAS
Cu 8lSC de alLo desempeno
33 lnsLrucclones
velocldad de operacln de 20 MPz
Memorla de programa lLASP de 8k
Memorla de daLos de 368 byLes
Memorla de daLos LL8CM de 236 byLes
14 fuenLes de lnLerrupcln
lla de 8 nlveles
3 Lemporlzadores
WM
AuC de 10 blLs
Mdulo serlal uSA81
REQUERIMIENTOS MNIMOS
PARA FUNCIONAMIENTO
AllmenLacln (+3v)
lnes 11 y 32 (vcc)
lnes 12 y 31 (Cnd)
8eslsLencla de 10k a vcc en pln MCL8
ln 1
Cscllador(2 condensadores de 13 a 33pf y 1
crlsLal de 4MPz 20MPz)
lnes 13 y 14
REQUERIMIENTOS MNIMOS
PARA FUNCIONAMIENTO
MEMORIAS
0 0 0 0 0
0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0
0 0 0 0 0 0

0 0 0 0
000
00
00
0
00
0
0

000
00
00
0
00
0
0

A0
A1
A2
u0
u1
u2
u3
u4
u3
u6
u7
COMPILADOR CCS C
Estructura de un programa
ulrecLlvas de preprocesador ueLermlnan el funclonamlenLo
del mlcroconLrolador
rogramas o funclones Son un con[unLo de lnsLrucclones que
cumplen una Larea especlflca Slempre deber haber un
programa o funcln prlnclpal llamado Maln()
lnsLrucclones ueLermlnan paso a paso cada una de las Lareas
que debe e[ecuLar el mlcroconLrolador
ComenLarlos Ayudan a comprender me[or el programa
lndlcando el slgnlflcado de algunas lnsLrucclones o con[unLo
de esLas
Directivas de preprocesador
Lspeclflcacln de dlsposlLlvo
#lnclude chlp #lnclude 16f877ah
#fuses #fuses x1 nCWu1
#use delay (clockfreq) #use delay (clock4000000)
Funciones
vold suma(Llpo param1 Llpo param2)
//Cdlgo que se reallzar en la funcln

vold resLa()
//Cdlgo que se reallzar en la funcln

vold maln()
//Cdlgo del programa prlnclpal

Comentarios
Los comenLarlos son uLlles para descrlblr llneas de cdlgo o
porclones de esLas Ayudan al desarrollador a ldenLlflcar el
propslLo y funclonamlenLo de varlables funclones clclos eLc
ara comenLar una sola llnea se usa //ComenLarlo
ara comenLar una porcln de cdlgo se usa /* Cdlgo */
Tipos de datos
1IC 1AMAC kANGC DLSCkICICN
lnL1
ShorL
1 blL 0 a 1 LnLero de 1 blL
lnL
lnL8
8 blLs 0 a 233 LnLero de 8 blLs
lnL16
Long
16 blLs 0 a 63333 LnLero de 16 blLs
lnL32 32 blLs 0 a 4294967293 LnLero de 32 blLs
lloaL 32 blLs 1173x10L38 a 3402x10L38 Coma floLanLe
Char 8 blLs 0 a 233 CaracLer
vold Sln valor
Slgned lnL8 8 blLs 128 a +127 LnLero con slgno
Slgned lnL16 16 blLs 32768a +32767 LnLero largo con slgno
Slgned lnL32 32 blLs 2L31 a + (2L31)1 LnLero de 32 blLs con slgno
'ariabIes
Separan un espaclo en memorla 8AM para almacenar daLos
LemporalmenLe
ueclaracln e lnlclallzacln ara declararlas deberemos especlflcar
el Llpo de varlable su nombre e lnlclallzarla haclendo uso del
operador de aslgnacln ''
1lpo nombre_varlable valor_lnlclal
lnL resulLado 0
'ariabIes
Las varlables pueden ser locales o globales
varlables locales Se pueden usar solo en la funcln donde hayan sldo declaradas
varlables globales Se pueden usar en cualquler funcln del programa
#lnclude 16f877a
#use delay (clock4000000)
lnL conLador //varlable global
vold funclon(vold)
floaL numero1 //varlable local

vold maln()
char leLra //varlable local

Operadores
Aslgnacln
Cp Descr|pc|n
+ Aslgnacln de suma (x+y es lo mlsmo que xx+y)
Aslgnacln de resLa (xy es lo mlsmo que xxy)
* Aslgnacln de mulLlpllcacln (x*y es lo mlsmo que xx*y)
/ Aslgnacln de dlvlsln (x/y es lo mlsmo que xx/y)
Aslgnacln de reslduo (xy es lo mlsmo que xxy)
Operadores
ArlLmeLlcos
Cp Descr|pc|n
+ Suma
8esLa
* MulLlpllcacln
/ ulvlsln
Mdulo 8eslduo
++ lncremenLo
uecremenLo
Operadores
8elaclonales
Cp Descr|pc|n
Menor que
Mayor que
Mayor o lgual que
Menor o lgual que
lgual
! ulsLlnLo de
Operadores
Lglcos
8lLs
Cp Descr|pc|n
! noL
Anu
|| C8
Cp Descr|pc|n
ComplemenLo a 1
Anu
| C8
xC8
uesplazamlenLo a la derecha
uesplazamlenLo a la lzqulerda
DecIaraciones de controI
ll LLSL
WPlLL
uCWPlLL
lC8
SWl1CP CASL
8L1u8n
88LAk CCn1lnuL
CC1C
Directivas de controI de
memoria
# byLe lu x Aslgna el nombre lu" a la poslcln
de memorla x"
#byLe C81A3
#byLe C8186
#byLe C81C7
#byLe C81u8
#byLe C81L9
C8183 //sl C818 es de sallda saldr el daLo
00000101
Directivas de controI de
memoria
# blL lu xy Aslgna el nombre lu" al blL y"
de la poslcln de memorla x"
#blL 880 060
#blL 880 C8180
8801 //Sl el blL 0 de C818 es de sallda
saldr un 1 por esLe ln
Instrucciones
Set_tr|s_x(va|ue) Conflgura plnes de cada puerLo como
enLrada/sallda value represenLa el valor a aslgnar al
reglsLro de conflguracln donde un 1 slgnlflca enLrada y un
0 sallda
SeL_Lrls_a( value )
SeL_Lrls_b( value )
SeL_Lrls_c( value )
SeL_Lrls_d( value )
SeL_Lrls_e( value )
SeL_Lrls_b(0x0l) //0000 1111
Los plnes 80 83 son enLradas y 84 87 son salldas
Instrucciones
|nput_x( ) Lee un daLo por un puerLo
uaLolnpuL_a( )
uaLolnpuL_b( )
uaLolnpuL_c( )
uaLolnpuL_d( )
uaLolnpuL_e( )
uaLolnpuL_d( ) //Cuarda en uaLo el valor de
porLd
Instrucciones
|nput(p|n ) Lee un daLo por un pln de un
puerLo
Los plnes esLn deflnldos en el archlvo h (ln_A0
ln_A1 ln_82 ln_C3 ln_u4)
uaLolnpuL (ln_80 ) //Cuarda en uaLo el
valor del ln 0 de C818 (1 0)
Instrucciones
|t_test(var|a|e|t) Lvalua el esLado de un
blL de una varlable que no necesarlamenLe
debe ser un puerLo
ara usarlo con los puerLos esLos deben ser
declarados como varlables por medlo de #byLe
blL_LesL(C8187) //Lvalua el esLado del blL 7
de C818
Instrucciones
utput_x(va|ue) Saca un daLo por un puerLo
ouLpuL_a( value )
ouLpuL_b( value )
ouLpuL_c( value )
ouLpuL_d( value )
ouLpuL_e( value )
CuLpuL_d(3) //00000101 por porLd
Instrucciones
utput_|t(p|n va|ue) Saca por el pln especlflcado un
0 1
Los plnes esLn deflnldos en el archlvo h (ln_A0 ln_A1
ln_82 ln_C3 ln_u4)
ouLpuL_blL( ln_C0 1) //Saca un 1 por el blL 0 de
C81C
CuLpuL_blL(ln_A0 lnpuL(ln_87)) //Saca por el blL 0
de C81A lo mlsmo que enLra por el blL 7 de C818
Instrucciones
utput_h|gh(p|n) Saca por el pln especlflcado
un 1
Los plnes esLn deflnldos en el archlvo h (ln_A0
ln_A1 ln_82 ln_C3 ln_u4)
ouLpuL_hlgh(ln_u0) //Saca un 1 por el blL 0
de C81u
Instrucciones
utput_|(p|n) Saca por el pln especlflcado
un 0
Los plnes esLn deflnldos en el archlvo h (ln_A0
ln_A1 ln_82 ln_C3 ln_u4)
ouLpuL_low(ln_A2) //Saca un 0 por el blL 2
de C81A
Instrucciones
|t_set(var|a|e|t) one un 1 en un blL
especlflcado de una varlable que no
necesarlamenLe debe ser un puerLo
ara usarlo con los puerLos esLos deben ser
declarados como varlables por medlo de #byLe
blL_seL(C81A2) //Saca un 1 por el blL 2 de
C81A
Instrucciones
|t_c|ear(var|a|e|t) one un 0 en un blL
especlflcado de una varlable que no
necesarlamenLe debe ser un puerLo
ara usarlo con los puerLos esLos deben ser
declarados como varlables por medlo de #byLe
blL_clear(C81u3) //Saca un 1 por el blL 3 de
C81u
Instrucciones
utput_tgg|e(p|n) Cambla el esLado del pln
especlflcado
Los plnes esLn deflnldos en el archlvo h (ln_A0
ln_A1 ln_82 ln_C3 ln_u4)
ouLpuL_Loggle(ln_u2) //Sl el blL 2 de C81u
es 0 lo cambla a 1 y vlceversa
Instrucciones
e|ay_ms(m|||sec) ermlLe esLablecer un
reLardo en mlllsegundos (mlllsec)
e|ay_us(m|crsec) ermlLe esLablecer un
reLardo en mlcrosegundos (mlcrosec)
ENTORNO DE DESARROLLO
ENTORNO DE DESARROLLO
ara lnlclar un nuevo programa haremos cllck
en el comando de mane[o de flcheros que
se encuenLra en la esqulna superlor lzqulerda
y selecclonaremos crear un nuevo flchero
fuenLe (new Source llle)
ENTORNO DE DESARROLLO
Cllck
ENTORNO DE DESARROLLO
uaremos un nombre a nuesLro archlvo y lo
guardaremos en la ublcacln que deseemos
Pecho esLo nos aparecer un edlLor en blanco
con una pesLana en la que aparece el nombre
de nuesLro archlvo Ln esLe edlLor
escrlblremos nuesLro cdlgo fuenLe
ENTORNO DE DESARROLLO
Aqul escrlblremos el cdlgo de nuesLro programa
Mi primer programa
ara varlar" haremos el programa bslco de
encender y apagar un LLu Lo prlmero que
haremos ser escrlblr la dlrecLlvas de pre
procesador
#lnclude 16f877Ah//mlcroconLrolador que deseamos usar
#fuses x1//1lpo de crlsLal x1
#use delay(clock4000000)//lrecuencla del oscllador (4MPz)
Mi primer programa
SeguldamenLe crearemos la funcln prlnclpal MAln y un clclo for()
lnflnlLo donde escrlblremos el cuerpo del programa Ll clclo debe ser
lnflnlLo para que el programa nunca Lermlne
v| ma|n() //rograma prlnclpal (lnlclo)
set_tr|s_(0x00) //Conflguro C818 como sallda (8 plnes)
fr() //Clclo lnflnlLo
utput_|t(IN_80) //Saca un 1 por 880 (blL 0 de C818)
e|ay_ms(000) //Lspera 1000 mS 1 segundo
utput_|t(IN_800) //Saca un 0 por 880
e|ay_ms(000) //Lspera oLro segundo
//Como el clclo es lnflnlLo reLornar al lnlclo del for() para repeLlr
//esLe proceso lndeflnldamenLe
//lln de programa
Mi primer programa
una vez creamos que nuesLro programa esL llbre de
errores procederemos a compllarlo con el boLn 8u|| A||
de la pesLana Cmp||e
Ln esLe proceso el compllador convlerLe nuesLro cdlgo
fuenLe a lengua[e de mqulna y crea unos archlvos
adlclonales de los cuales usaremos dos (hex cof) para la
slmulacln y uno de ellos para programar el
mlcroconLrolador (hex)
Ln la pesLana CuLpuL aparecern los poslbles errores de
slnLaxls o adverLenclas que gener el cdlgo
Mi primer programa
Cllck
Cllck
Aqul aparecern los errores de slnLaxls o adverLenclas
SIMULACION EN PROTEUS
Ll sofLware que usaremos para slmular nuesLros
programas es la herramlenLa lSlS de 8C1LuS
Zona de componenLes Zona de componenLes
SIMULACION EN PROTEUS
Cuando abrlmos el lSlS nos
aparece un espaclo en el cual
deberemos ublcar nuesLros
componenLes ara buscarlos
preslonamos sobre el boLn
Cmpnent Me y luego
sobre |ck de Dev|ces
Cllck
C
l
l
c
k
SIMULACION EN PROTEUS
Ln la venLana |ck Dev|ces sobre el campo
de LexLo keyrs escrlblremos Lodo o parLe
del nombre del componenLe que deseamos
A medlda que se escrlbe el sofLware lr
fllLrando la busqueda sl en esLa aparecen
ms elemenLos que cumplen con los
crlLerlos fllLraremos aun ms selecclonando
una caLegorla de la llsLa Categry Ll prlmer
elemenLo ser el lC16l877A
SIMULACION EN PROTEUS
LlemenLo
a buscar
8
e
s
u
l
L
a
d
o
d
e

l
a

b
u
s
q
u
e
d
a
C
a
L
e
g
o
r
l
a
s
SIMULACION EN PROTEUS
una vez enconLrado el componenLe daremos
doble cllck sobre el para ublcarlo en la venLana
uevlces Ahora buscaremos una reslsLencla y un
dlodo LLu ara una reslsLencla de 220 ohms
escrlblremos Mln8LS y enLre Lodos los
resulLados buscaremos una de 2208 y daremos
doble cllck para selecclonarla ara el dlodo
escrlblmos LLu y fllLramos selecclonando la
caLegorla Cpte|ectrn|cs de donde
selecclonaremos uno cuya descrlpcln dlga
An|mate LLD me|
SIMULACION EN PROTEUS
Cuando se haya Lermlnado de escoger los
componenLes se clerra la venLana lck
uevlces y de la venLana uevlces lremos
selecclonando uno a uno los elemenLos y los
lremos ublcando en la zona de componenLes
Luego los unlremos haclendo cllck sobre los
plnes de cada uno y arrasLrando la conexln
hasLa el oLro componenLe
SIMULACION EN PROTEUS
u
e
v
l
c
e
s
SIMULACION EN PROTEUS
ara ublcar la Llerra
haremos cllck sobre el
boLn 1erm|na|s Me
y de lavenLana 1erm|na|s
selecclonaremos GkCUND
Cllck
C
l
l
c
k
SIMULACION EN PROTEUS
Ll ulLlmo paso anLes de slmular es cargarle el programa al
mlcroconLrolador ara esLo damos doble cllck sobre el lC o
cllck derecho y selecclonamos L|t rpert|es para lngresar a
las propledades del dlsposlLlvo Ln esLa nueva venLana
buscaremos en rgram I||e el archlvo hex cof de nuesLro
programa
La dlferencla enLre uno y oLro es que el cof nos ayudar a
depurar el cdlgo al permlLlr e[ecuLarlo paso a paso pausarlo
en Llempo de e[ecucln revlsar el esLado de los reglsLros eLc
or ulLlmo en rcessr C|ck Irequency escrlblremos la
frecuencla del oscllador a usar llnallzamos preslonando Ck
SIMULACION EN PROTEUS
rograma
C
l
l
c
k
l
r
e
c
u
e
n
c
l
a
Cllck
SIMULACION EN PROTEUS
or ulLlmo para lnlclar la slmulacln
preslonaremos el boLn |ay de la barra
de slmulacln para correr la
slmulacln Ln esLa mlsma barra
enconLramos boLones para pausar la
e[ecucln o deLenerla
SIMULACION EN PROTEUS
C
l
l
c
k
SIMULACION EN PROTEUS
SIMULACION EN PROTEUS
Como se dl[o anLerlormenLe el archlvo cof
permlLe depurar el cdlgo mlenLras se
slmula ara esLo una vez cargado en el lC
el cof se e[ecuLar pero con el boLn Step
de la barra de slmulacln Ln caso de que no
aparezca una venLana con el cdlgo
preslonaremos Deug en la barra de Menu y
selecclonaremos IC CU Surce Ce
SIMULACION EN PROTEUS
C
l
l
c
k
C
l
l
c
k
Cdlgo
TALLER
8eallzar un programa que permlLa encender un led cada que se
preslone un lnLerrupLor
8eallzar un programa que enclenda un LLu de color verde sl el
daLo leldo por un puerLo de enLrada esL enLre 0 y 100 que
enclenda un LLu amarlllo sl el daLo leldo en el mlsmo puerLo esL
enLre 101 y 200 que enclenda un LLu ro[o sl el daLo leldo esL
enLre 201 y 233
8eallzar un programa que muesLre cuaLro dlsLlnLas secuenclas de
luces por un puerLo de 8 blLs cada secuencla se mosLrar
dependlendo de un daLo leldo por dos blLs de enLrada de oLro
puerLo asl sl el daLo leldo es 00 hace la prlmera secuencla 01 la
segunda secuencla 10 la Lercera secuencla y por ulLlmo 11 para la
cuarLa secuencla
LABORATORIO 1
8eallzar un programa que permlLa conLrolar la
velocldad y senLldo de glro de un moLor paso a
paso or medlo de un lnLerrupLor se selecclona el
senLldo (0 anLlhorarlo 1 horarlo) por medlo de dos
lnLerrupLores ms se selecclona la velocldad
(0023 0130 1073 11100) Se debe
presenLar slmulacln y funclonamlenLo en
proLoboard del slsLema
INTERRUPCIONES
Las lnLerrupclones son esLlmulos lnLernos o
exLernos que le lndlcan al mlcroconLrolador
sobre una peLlcln o accln que deba ser
e[ecuLada lnmedlaLamenLe de[ando en espera lo
que se encuenLre haclendo en ese momenLo Ln
el lnsLanLe que ocurre una lnLerrupcln no
lmporLa que parLe de programa se encuenLre
e[ecuLando el conLador de programa se dlrlglr
al vecLor de lnLerrupclones esLe es un espaclo
de memorla reservado para la aLencln de
Lodas las lnLerrupclones Ll lC16l877A posee
14 fuenLes de lnLerrupcln
INTERRUPCIONES
INTERRUPCIONES
La venLa[a de las lnLerrupclones es que el
mlcroconLrolador no neceslLa esLar pendlenLe de un
evenLo slno que una vez hablllLada la lnLerrupcln
esLe podr e[ecuLar oLras Lareas hasLa que se genere
el esLlmulo
Ln C la aLencln de lnLerrupclones se hace por medlo
de funclones (una para cada lnLerrupcln que esLe
hablllLada) Cuando ocurra la lnLerrupcln se har un
llamado a la funcln correspondlenLe y una vez
flnallce sus Lareas denLro de esLa reLornar a segulr
reallzando la e[ecucln del programa donde fue
lnLerrumpldo
INTERRUPCIONES
ara poder usar una lnLerrupcln se deber hablllLar un
blL CLC8AL el cual se encarga de gobernar a Lodas las
lnLerrupclones Sl esLe blL se encuenLra deshablllLado
nlnguna lnLerrupcln podr ocurrlr Adems del blL
CLC8AL se debern hablllLar cada una de las
lnLerrupclones que se deseen lmplemenLar
Cuando se genera el evenLo que produce la lnLerrupcln
el blL CLC8AL se deshablllLar para evlLar lnLerrupclones
suceslvas lndeseadas y una bandera(blL) que ldenLlflca a
la lnLerrupcln generada se acLlvar LsLa bandera deber
ser llmplada anLes de hablllLar de nuevo el blL CLC8AL de
lo conLrarlo el mlcroconLrolador asumlr que se ha
producldo una nueva lnLerrupcln
INTERRUPCIONES
Registro INTCON
Se encuenLra en la dlreccln 08h de la
memorla de daLos Ls un reglsLro de funcln
especlal con el cual por medlo de algunos
blLs se hablllLan deshablllLan cada una de
las lnLerrupclones que posee el
mlcroconLrolador y se consulLan las banderas
asocladas a cada una de las lnLerrupclones
INTERRUPCIONES
Registro INTCON
Los blLs 73 permlLen hablllLar o deshablllLar cada una de las
lnLerrupclones un 1 las hablllLa y un 0 las deshablllLa
8lL 7 (ClL) 8lL CLC8AL de lnLerrupclones
8lL 6 (LlL) 8lL de lnLerrupclones perlferlcas
8lL 3 (10lL) 8lL de lnLerrupcln por desbordamlenLo del 1lmer 0
8lL 4 (ln1L) 8lL de lnLerrupcln LxLerna
8lL 3 (88lL) 8lL de lnLerrupcln por camblo de esLado en un pln
del nlbble alLo de C818
INTERRUPCIONES
Registro INTCON
Los blLs 20 son banderas asocladas a algunas lnLerrupclones
LsLas se pondrn en 1 auLomLlcamenLe lndlcando la
lnLerrupcln que se gener Se deben poner en 0 por sofLware
8lL 2 (10ll) 8andera de lnLerrupcln por desbordamlenLo del
1lmer 0
8lL 1 (ln1l) 8andera de lnLerrupcln LxLerna
8lL 0 (88ll) 8andera de lnLerrupcln por camblo de esLado en
un pln del nlbble alLo de C818
INTERRUPCION EXTERNA
La lnLerrupcln exLerna ocurre por medlo del pln 880 y es un
evenLo exLerno el que debe generarla como por e[emplo un
pulsador LsLa lnLerrupcln debe ser conflgurada para ocurrlr en
un flanco de ba[ada o de sublda
Los blLs del reglsLro ln1CCn que deben ser Lenldos en cuenLa
para esLa lnLerrupcln son Ll blL CLC8AL de lnLerrupclones (blL
7) el blL de hablllLacln de lnLerrupcln exLerna ln1L (blL 4) y la
bandera ln1l (blL 1)
Pay que Lener en cuenLa que esLe pln deber ser conflgurado de
enLrada La funcln que ser llamada cuando ocurra una
lnLerrupcln deber ser precedlda por la dlrecLlva
IN1_Lk1
INTERRUPCION EXTERNA
SeguldamenLe se lmplemenLa la funcln con el
cdlgo a e[ecuLar cuando ocurra la lnLerrupcln
exLerna
#ln1_Lx1
//luncln para lnLerrupcln exLerna el nombre
//de la funcln no necesarlamenLe Llene que ser
//lnLerrupL_exL
vold lnLerrupL_exL()

//Cdlgo a e[ecuLar

INTERRUPCION EXTERNA
ara poder hacer uso de esLa lnLerrupcln
como se menclon anLerlormenLe deber ser
conflgurada para ocurrlr en un flanco de ba[ada
o de sublda esLo se hace por medlo de la
funcln
//llanco de sublda (Low 1o Plgh)
exL_lnL_edge(L_1C_P)
//llanco de ba[ada (Plgh 1o Low)
exL_lnL_edge(P_1C_L)
INTERRUPCION EXTERNA
or ulLlmo la lnLerrupcln debe ser hablllLada LxlsLe
un blL CLC8AL que hablllLa a Lodas las lnLerrupclones
y un blL especlflco para cada una de ellas para poder
usar cualquler lnLerrupcln no solo esLa deber ser
hablllLada slno Lamblen el blL CLC8AL ara esLo se
usar la funcln enable_lnLerrupLs()
//PablllLa lnLerrupcln exLerna
enable_lnLerrupLs(ln1_Lx1)
//PablllLa lnLerrupcln Clobal
enable_lnLerrupLs(CLC8AL)
INTERRUPCION POR RB
La lnLerrupcln por 88 ocurre cuando hay un camblo de esLado en cualqulera
de los plnes 887 886 883 884 y es un evenLo exLerno el que debe generarla
como por e[emplo un pulsador LsLa lnLerrupcln ocurrlr en cualquler flanco ya
sea de sublda o de ba[ada y cualqulera de los plnes podr generarla
Los blLs del reglsLro ln1CCn que deben ser Lenldos en cuenLa para esLa
lnLerrupcln son Ll blL CLC8AL de lnLerrupclones (blL 7) el blL de hablllLacln
de lnLerrupcln por 88 88lL (blL 3) y la bandera 88ll (blL 0)
ara poder hablllLar de nuevo el blL CLC8AL anLes se deber leer el puerLo 8
con una lnsLruccln como xCk18 para verlflcar el esLado de los plnes y
seguldamenLe llmplar la bandera 88ll
Pay que Lener en cuenLa que esLos plnes debern ser conflgurados de enLrada
La funcln que ser llamada cuando ocurra una lnLerrupcln deber ser
precedlda por la dlrecLlva
IN1_k8
INTERRUPCION POR RB
SeguldamenLe se lmplemenLa la funcln con el
cdlgo a e[ecuLar cuando ocurra la lnLerrupcln por
88
#ln1_88
//luncln para lnLerrupcln por 88 el nombre de
//la funcln no necesarlamenLe Llene que ser
//lnLerrupL_88
vold lnLerrupL_88()

//Cdlgo a e[ecuLar

INTERRUPCION POR RB
Al lgual que con la lnLerrupcln exLerna esLa debe ser
hablllLada Como se menclon anLerlormenLe exlsLe
un blL CLC8AL que hablllLa a Lodas las lnLerrupclones
y un blL especlflco para cada una de ellas La
hablllLacln se har de nuevo con la funcln
enable_lnLerrupLs()
//PablllLa lnLerrupcln por 88
enable_lnLerrupLs(ln1_88)
//PablllLa lnLerrupcln Clobal
enable_lnLerrupLs(CLC8AL)
MODULO LCD
Los mdulos LCu (Llquld CrysLal ulsplay) aparecleron a ralz de la
necesldad de Lener un meLodo de vlsuallzacln que fuera
compacLo fcll de mane[ar y con un consumo de corrlenLe ba[o
ya que anLerlormenLe se hacla uso de dlsplays de 7 segmenLos lo
que hacla un poco Ledlosa la programacln e lmplemenLacln de
hardware para mosLrar daLos por esLos elemenLos adems el
consumo de corrlenLe era alLo y no era poslble vlsuallzar Lodos los
caracLeres alfanumerlcos
Ll proceso de vlsuallzacln es gobernado por un mlcroconLrolador
lncorporado a la panLalla slendo el PlLachl 44780 el modelo ms
uLlllzado
MODULO LCD
MODULO LCD
Ll vlsuallzador a usar ser el LM016L que es un LCu de 2 llneas por 16
caracLeres cada una Las caracLerlsLlcas por las cuales se escogl esLe
vlsuallzador son las slgulenLes
- Consumo de poLencla reducldo (cerca de 73 mW)
- anLalla de caracLeres ASCll adems de los caracLeres [aponeses kan[l
caracLeres grlegos y slmbolos maLemLlcos
- uesplazamlenLo de caracLeres hacla la lzqulerda o derecha
- Memorla de 40 caracLeres por llnea de panLalla vlsuallzndose 16
caracLeres por llnea
- MovlmlenLo del cursor
- Ll usuarlo puede generar 8 caracLeres nuevos
- ueden ser gobernados con un bus de 8 4 blLs
MODULO LCD
Pin N-. Sismologa Nivel /O Funcin
1 VSS - - 0 Vlts. Tierra (GND).
2 VCC - - + 5 Vlts. DC.
3 Vee = Vc - - Ajuste del Contraste.
4 RS 0/1
0= Entrada de una nstruccin.
1= Entrada de un dato.
5 R/W 0/1
0= Escribir en el mdulo LCD.
1= Leer del mdulo LCD.
6 E 0/1
0= Deshabilita el modulo LCD
1= Habilita el mdulo LCD
7 DB0 0/1 /O BUS DE DATO LNEA 1 (LSB).
8 DB1 0/1 /O BUS DE DATO LNEA 2
9 DB2 0/1 /O BUS DE DATO LNEA 3
10 DB3 0/1 /O BUS DE DATO LNEA 4
11 DB4 0/1 /O BUS DE DATO LNEA 5
12 DB5 0/1 /O BUS DE DATO LNEA 6
13 DB6 0/1 /O BUS DE DATO LNEA 7
14 DB7 0/1 /O BUS DE DATO LNEA 8 (MSB).
15 A (Algunos) - - LED (+) Back Light
16 K (Algunos) - - LED (-) Back Light.
MODULO LCD
MODULO LCD
Ll compllador CCS provee una llbrerla llamada LCuC para el mane[o de esLe
dlsposlLlvo La llbrerla deber ser llamada por medlo de la dlrecLlva
#lncludeLCuC que se lnclulr despues de la dlrecLlva
#use delay(clockfrecuencla) o de lo conLrarlo no se conflgurar el relo[ para la
llbrerla LCuC lo que generar errores al compllar
La llbrerla LCuC vlene conflgurada para que el LCu Lraba[e a 4 blLs usando solo el
C81u
Las funclones que provee el archlvo LCuC son
lcd_lnlL() //rlmera funcln que se debe llamar y permlLe lnlclallzar el LCu
//se debe llamar solo una vez al lnlclo del programa
lcd_goLoxy(xy) //ublca el cursor en la poslcln xy de la panLalla
lcd_puLc(c) //Coloca el carcLer o caracLeres en la poslcln que se encuenLre
//el cursor
f C|ear |sp|ay n G t start f secn ||ne Mve ack ne ps|t|n
MODULO LCD
TECLADO MATRICIAL
TECLADO MATRICIAL
Ll compllador CCS provee una llbrerla llamada k8uC para el mane[o de esLe
dlsposlLlvo La llbrerla deber ser llamada por medlo de la dlrecLlva #lncludek8uC
que se lnclulr despues de la dlrecLlva
#use delay(clockfrecuencla) o de lo conLrarlo no se conflgurar el relo[ para la llbrerla
k8uC lo que generar errores al compllar
La llbrerla k8uC vlene conflgurada para que el Leclado maLrlclal Lraba[e en el C81u
pero como esLe puerLo lo esLaremos usando para el LCu se har un camblo en la
llbrerla para que Lraba[e en C818 esLe camblo ser qulLar el comenLarlo a una llnea
// uncommenL Lhe followlng deflne Lo use porL 8
#deflne use_porLb_kbd 18uL
Las funclones que provee el archlvo k8uC son
kbd_lnlL() //rlmera funcln que se debe llamar y permlLe lnlclallzar el
//Leclado Se debe llamar solo una vez al lnlclo del programa
kbd_geLc() //CbLlene la Lecla pulsada y la devuelve como un carcLer
TECLADO MATRICIAL
CON'ERSOR A/D
un conversor anlogo/dlglLal permlLe dlglLallzar una senal de volLa[e anlogo Lo que
hace es aslgnarle un numero blnarlo a cada clerLa canLldad de volLlos Ll valor mlnlmo
de volLa[e que el CAu sensar y dlglLallzar esL dado por la resolucln
vref ser la dlferencla de poLenclal enLre el valor mxlmo de volLa[e a sensar y el
mlnlmo
La resolucln depender del numero de blLs del conversor anlogo dlglLal de aqul se
obLlene el valor de n en la frmula Ll lC16l877A posee un conversor anlogo dlglLal
de 10 blLs por lo LanLo su resolucln ser


CON'ERSOR A/D
Supongamos que un sensor de LemperaLura enLrega valores enLre 0 y 3 volLlos Ll
sensor convlerLe la varlable flslca 1emperaLura en volLa[e y asumamos que 0 volLlos
equlvale 0C y 3 volLlos 130C
Los valores dlglLales para cada valor anlogo sern
0000000000 000000 v|t|s 0C
000000000 000488 v|t|s 046C
000000000 000976 v|t|s 0293C
00000000 00464 v|t|s 0439C
0 498S34 v|t|s 497C
0 499022 v|t|s 498SC
S00000 v|t|s S0C

%% %%
CON'ERSOR A/D
Como se menclon anLerlormenLe el lC16l877A posee un conversor de 10 blLs y 8
canales (plnes) anlogos por los cuales se pueden converLlr senales de esLe Llpo LsLos
plnes debern ser conflgurados para funclonar como enLradas anlogas
Canal 0 (An0) 8A0
Canal 1 (An1) 8A1
Canal 2 (An2) 8A2
Canal 3 (An3) 8A3
Canal 4 (An4) 8A3
Canal 3 (An3) 8L0
Canal 6 (An6) 8L1
Canal 7 (An7) 8L2
Ln C se usarn las slgulenLes funclones para hacer uso del conversor anlogo/dlglLal
Setup_ac_prts(va|r) //Conflgura los plnes que funclonar como enLradas anlogas
CON'ERSOR A/D
Ln C se usarn las slgulenLes funclones para hacer uso del conversor anlogo/dlglLal
Setup_ac_prts(va|r)//Conflgura los plnes que funclonar como enLradas
anlogas/dlglLales
va|r
nC_AnALCCS 7 // none
ALL_AnALCC 0 // A0 A1 A2 A3 A3 L0 L1 L2
An0_An1_An2_An4_An3_An6_An7_vSS_v8Ll 1 // A0 A1 A2 A3 L0 L1 L2 v8efhA3
An0_An1_An2_An3_An4 2 // A0 A1 A2 A3 A3
An0_An1_An2_An4_vSS_v8Ll 3 // A0 A1 A2 A4 v8efhA3
An0_An1_An3 4 // A0 A1 A3
An0_An1_vSS_v8Ll 3 // A0 A1 v8efhA3
An0_An1_An4_An3_An6_An7_v8Ll_v8Ll 0x08 // A0 A1 A3 L0 L1 L2 v8efhA3 v8eflA2
An0_An1_An2_An3_An4_An3 0x09 // A0 A1 A2 A3 A3 L0
An0_An1_An2_An4_An3_vSS_v8Ll 0x0A // A0 A1 A2 A3 L0 v8efhA3
An0_An1_An4_An3_v8Ll_v8Ll 0x08 // A0 A1 A3 L0 v8efhA3 v8eflA2
An0_An1_An4_v8Ll_v8Ll 0x0C // A0 A1 A4 v8efhA3 v8eflA2
An0_An1_v8Ll_v8Ll 0x0u // A0 A1 v8efhA3 v8eflA2
An0 0x0L // A0
An0_v8Ll_v8Ll 0x0l // A0 v8efhA3 v8eflA2
CON'ERSOR A/D
Setup_ac(m)//Conflgura el mdulo conversor A/u
M
AuC_Cll 0 // AuC Cff
AuC_CLCCk_ulv_2 0x10000 //8elo[ de conversln losc/2
AuC_CLCCk_ulv_8 0x0040 //8elo[ de conversln losc/8
AuC_CLCCk_ulv_32 0x0080 //8elo[ de conversln losc/32
AuC_CLCCk_ln1L8nAL 0x00c0 // lnLernal 26us
Set_ac_channe|(cana|)//Selecclona el canal del conversor A/u
cana|
0 7 // Canal0 Canal7
kea_ac()//8eLorna el valor en declmal del daLo converLldo en el canal selecclonado prevlamenLe
valorread_adc()
ev|ce ac0 //numero de blLs que el conversor reLornar
MODULO PWM
La modulacln de ancho de pulso de una senal conslsLe en varlar el Llempo de Lraba[o
(Llempo acLlvo duLy cycle) de esLa y asl regular la poLencla de clerLos dlsposlLlvos
Ll valor promedlo de volLa[e (y corrlenLe) que allmenLa a la carga es conLrolado
swlLcheando" rpldamenLe para que la senal llegue o no a esLa LnLre ms largo sea el
Llempo que se sumlnlsLra volLa[e a la carga comparado con el Llempo que no se hace
mayor ser la poLencla que se le provee a esLa
uu1? C?CLL
1
perlodo
MODULO PWM
La frecuencla del WM depender de la apllcacln en la que se
desee usar
Ll Llempo de Lraba[o o uuLy Cycle hace referencla al Llempo que
permanece encendldo" o que se esL allmenLando la carga
Ll lC Llene desLlnados 2 plnes llamados CC1 y CC2 para ser
usados como WM 8C2(CC1) y 8C1 (CC2) LsLos plnes debern
ser conflgurados como salldas
La resolucln del WM es de 10 blLs dlsLrlbuldos en dos reglsLros
CC8xL (8 Msb) y CCxCCn34 (2 Lsb)
x x x x x x x x x
MODULO PWM
ara obLener el perlodo de la senal WM se conflguran dos
reglsLros de 8 blLs llamados 1lML82 y 82 Ll prescaler del 1M82
puede ser 1 4 16 La slgulenLe frmula permlLe calcular el
perlodo del WM
WM1(82+1) x 4 x 1osc x (valor de prescaler del 1M82)
Cuando el valor del 1M82 alcanza al 82 suceden Lres evenLos
1M82 es llmplado
Ll pln CCx es puesLo a 1 (excepLo sl el duLy cycle 0)
Ll duLy cycle es camblado de CC8xL a CC8xP
MODULO PWM
ara obLener el clclo de Lraba[o de la senal WM se usa la slgulenLe
frmula
WM duLycycle(CC8xLCCxCCn34) x 1osc x (valor de prescaler del 1M82)
valor de 10 blLs
MODULO PWM
La funcln seLup_Llmer_2() permlLe conflgurar el prescaler del
1M82 el 82 y el posLcale del 1M82
seLup_Llmer_2 (mode perlod posLscale)
me 12_ulSA8LLu 12_ulv_8?_1 12_ulv_8?_4 12_ulv_8?_16
per| enLero enLre 0233 equlvalenLe al 82
pstca|e LnLero enLre 116 que deLermlna cuanLos
desbordamlenLos del Lemporlzador deben ocurrlr anLes de una
lnLerrupcln
MODULO PWM
ara conflgurar el mdulo como WM se usarn las funclones
seLup_ccp1(CC_WM)
seLup_ccp2(CC_WM)
ara conflgurar el duLy cycle se usar la funcln
seL_pwm1_duLy(valor)
seL_pwm2_duLy(valor)
va|r LnLero enLre 01023 que equlvale al valor de 10 blLs de
CC8xLCCxCCn34
MODULO PWM
ara generar un WM de 230kPz con un duLy cycle del 30 del
perlodo usando un crlsLal de 4MPz se proceder de la slgulenLe
forma
1) Se calcula el valor del 82 con la frmula
WM1(82+1) x 4 x 1osc x (valor de prescaler del 1M82)
Asumlendo un valor del prescaler del 1M821
Ll valor de WM1 se conoce al saber cual ser la frecuencla
WM11/230000Pz0000004 seg 4uS
1osc1/losc1/4000000000000023 seg
82 (0000004 x 4000000 x 1/4)1 3
WM1
MODULO PWM
2) Se calcula el valor de 10 blLs de (CC8xLCCxCCn34) con la frmula
WM duLycycle(CC8xLCCxCCn34) x 1osc x (valor de prescaler del 1M82)
Asumlendo un valor del prescaler del 1M821
Ll valor de WM duLycycle se conoce al saber el perlodo del WM de
4uS Como se requlere que sea del 30 el duLy cycle ser de 2uS
1osc1/losc1/4000000000000023 seg
duLy (0000002 x 4000000)/1 8
Duty
Cyc|e
duLy
WM1
MODULO PWM
#lnclude 16f877ah
#fuses xL
#use delay(clock4000000)
lnL16 duLy8
vold maln()
seL_Lrls_c(0x00)
seLup_Llmer_2(12_ulv_8?_1 31)
seLup_ccp1(CC_WM)
seL_pwm1_duLy(duLy)
for()

WM1
Duty
Cyc|e
MODULO PWM
Pay que Lener en cuenLa que los valores del 82 y duLy deben ser
enLeros en el caso dado que al calcularlos den con punLo declmal
se deber modlflcar el valor del 1M82
Ll valor del duLy debe ser un enLero de 16 blLs de oLra forma no
funclonar correcLamenLe el mdulo WM

You might also like