Académique Documents
Professionnel Documents
Culture Documents
de s arrol
lo de una l
ibre ría e n C para aprove ch ar
todo e lpote ncialde e s tos dis pl
ays
Pre s e ntación de l
a "7m a Com pe te ncia Nacionalde Robótica"
.s taff
núm e ro = 6;año = 2;
Cons e jo Editorial :
M ario Sacco
.indice
Arge ntina
s e rvice .s e rvis ys te m @ gm ail.com
Pabl o
Es paña M ódul
o PIC TRAINER 28 0x05
q uick bas ic@ te rra.e s PIC16F628A e n as s e m bl e r (ii) 0x0B
Libre ría de gráficos para GLCD 0x18
Bruno Gavando Te cl
ado m atriciale n PSI 0x23
Francia 7m a Com pe te ncia de Robótica 0x26
bruno.gavand@ ad-val
ore m .fr Brújul a digitalde pre cis ión 0x29
¡Un PIC e n tu TV! 0x2E
De s carga Gratuita.
Es te conte nido s e rige por l
al ice ncia
de Cre ative Com m ons “Lice ncia Cre ative
Com m ons Atribución-No Com e rcial -Sin
O bras De rivadas 3.0”
.e ditorial
Dos m e s e s h an pas ado de s de l a s al ida de lnúm e ro cinco de l a
, y talcom o prom e tim os , tie ne s e n tu pantal la una nue va e dición.
Es ta ve z h e m os s um ado colaboradore s y te m as , com o para q ue cada ve z
m ás le ctore s e ncue ntran al
guna articul o q ue l
e s re s ul
te de util
idad.
Por ul tim o, s i aún no conoce s nue s tro foro aprove ch am os para re com e ndarte
q ue pas e s por él . Es ta publ icación s olo re coge algunos de los te m as q ue al l
á
s e tratan, y e lform ato PDF no pe rm ite ni l a colaboración ni e linte rcam bio de
opinione s q ue tie ne l ugar e n e lforo. Se guram e nte podrás apre nde r m uch o
m ás vis itándol o pe riódicam e nte y, s obre todo, ayudarnos a m e jorar l a re vis ta.
¡H as ta e lpróxim o núm e ro!
//página 0x04
m ódul
o PIC TRAINER 28
Es te e s te rce r m ódul o de nue s tro e ntre nador. Su función e s l a de s e rvir com o
s oporte a l os m icrocontrol adore s PIC de 28 pine s , com o e l16F874A. Aligualq ue
s us h e rm anos , e m ple a un PCB de una s ol a cara, por l
o q ue s u m ontaje de be ría
s e r pos ible aún para aq ue l los e s tudiante s o aficionados q ue e s tán com e nz ando
trans itar e s te apas ionante cam ino.
//página 0x05
//página 0x06
ne ra de dos tornil l
os pe rm ite
al im e ntar a l a pl aca, y un
diodo 1N4007 prote ge al
circuito de una cone xión con
la pol aridad e q uivocada. Tal
com o re com ie nda l a h oja de
datos de l re gul ador de
vol taje , h e m os col ocado l os
dos conde ns adore s de 0.1
uF de rigor. Ade m ás , un
conde ns ador e l e ctrolítico de
470uF/16V fil tra e l poco
rippl e q ue pue da h abe r
e s capado al fil tro de l a
fue nte e xte rna, y un diodo
LED, e n s e rie con un re s is tor
de 220V, s e e ncie nde para
indicarnos q ue e l circuito
e s tá al im e ntado.
Talcom o ocurría con
las pl acas para m icrocontro-
ladore s de 18 o 40 pine s , e n
lugar de util iz ar un cris tal
com o os cil ador de l PIC
h e m os col ocado 3 de e l los ,
tam bie n s e l e ccionabl es me-
diante una s e rie de jum pe rs
(ide ntificados com o JP4, JP5
y JP6). De e s ta m ane ra
podre m os probar nue s tros
program as o m icrocontrol a-
dore s a dife re nte s fre cue n-
cias de trabajo. Los dos
conde ns adore s de 22pF
com pl e tan e s ta parte de l
circuito. En cas o de util iz ar
PICs q ue funcione n a m ás
de 20 M H z , e s pos ibl e q ue
h aya q ue cam biarl os por
conde ns adore s de 15pF o
al go m e nos . Re corde m os pue de cam biarl os a gus to. Si de s e am os s e l e ccionar l
os
q ue s i s e col oca m ás de un En e lcas o util iz ar l
os pul s adore s , de be m os re cor-
jum pe r a l a ve z e lm icrocon- pul s adore s o LEDs e xis - dar q ue e s tos pone n e lpin
trol ador no funcionará. te nte s e n l
a placa, para ingre - corre s pondie nte a 5V cuan-
En cuanto a l os cris - s ar (o re pre s e ntar) datos a do s on pre s ionados . M ie n-
tal e s , h e m os e l e gido (com o (o de ) nue s tro program a, de - tras q ue e s tán e n re pos o, l
as
pue de ve rs e e n e le s q ue m a be re m os m ove r l os jum pe rs e ntradas s e m antie ne n a
el éctrico) val ore s de 4M H z , JP1 y JP2, q ue pe rm ite n s e - GND a través de s e ndos
8M H z y 20M H z , pe ro nada le ccionar s i cone ctam os al re s is tore s de 10K .
im pide util iz ar otros . Ell e ctor PIC e lLED o e lpul s ador. Los cone ctore s s igue n
//página 0x07
e n e le ntre nador.
La única e xce pción, o
de s vío de l o norm al , q ue
pue de s ve r e n e l diagram a
de l os cone ctore s e s e n l os
pine s corre s pondie nte s a
RB6 (CLO CK ) y RB7 (DA-
TA), ya q ue pos e e n un
re s is tor de 220 oh m s e n
s e rie . Cum pl e n con l a fun-
ción de pe rm itir program ar e l
PIC m e diante e l cone ctor
ICSP s in ne ce s idad de
re tirar e lcabl e q ue cone cta
e le ntre nador con e lm odul o
de turno. Por s upue s to, s i l o
de s e as pue de s re e m pl az ar
e s os dos re s is tore s por s e n-
dos pue nte s . Sol o de be rás
q uitar e l cabl e pl ano a l a
h ora de re program ar e lPIC.
Elpin 1, q ue corre s -
ponde al RESET e n l os
m icrocontrol adore s PIC de
28 pine s com patibl e s con
e s te e ntre nador, e s ta unido a
un pul s ador a través de un
re s is tor de 470 oh m s y a + V
m e diante otro de 4.7K y un
diodo 1N4148. Al pre s ionar
e lpul s ador, e lm icrocontrol a-
dor s e re s e te a. Durante e l
funcionam ie nto norm al de l
program a, e lpin e s ta a + V.
El diodo im pide l os probl e-
m as q ue podrían s urgir e ntre
las al im e ntacione s de l m ó-
dul o y de l program ador al
util iz ar e lcone ctor ICSP.
//página 0x08
“m étodo de l a pl anch a”e xpl i- Una ve z m ontado
cado e n l a re vis ta num e ro 1) todo, s in col ocar e lPIC e n
de be s trans fe rir e ldis e ño a su l ugar, al im e nta e lcircuito Ya pode m os com e n-
un troz o de PCB virge n. con una te ns ión de e ntre 7.5 z ar a e xpe rim e ntar con PICs
Lue go, l o s um e rge s e n un y 12V. ElLED “Pow e r”de be - de 28 pine s . H ay m uch o
baño de cl oruro férrico; y por ría e nce nde rs e . Si e s as í, para apre nde r con e l los y, s i
ul tim o, l ue go de una bue na ve rifica con un m ul tím e tro de cide s e ncarar l a cons -
lim pie z a, l e h ace s l os aguje - q ue l a te ns ión e ntre l os pi- trucción de al guno de l os
ros . ne s 8 (GND) y 20 (Vcc) de l m ódul os acce s orios (com o e l
Al a h ora de s ol dar l os z ócal o de l m icrocontrol ador m ódul o de 8 E/S publ icado
com pone nte s te n e n cue nta s e a de 5V. Tam bién pue de s e n e lnúm e ro ante rior de l a
q ue por l o ge ne ral re s ul ta ve rificar q ue e n l os cone cto- re vis ta uControl ), podrás m ul -
m ás s e ncil lo s i prim e ro col o- re s de e xpans ión e s té pre - tiplicar por 100 l as pos ibil
ida-
cas l os q ue s on m ás bajos , s e nte e s a te ns ión. Si todo de s de e s te e ntre nador.
com o l os pue nte s , diodos , e s ta bie n, ya tie ne s l is to tu
z ócal os y re s is tore s ; y de jas e ntre nador. Cas o contrario,
para e lfinall os cone ctore s , re pas a l as s ol daduras y po-
re gul ador de vol taje y con- s ición de l os com pone nte s .
de ns adore s . As e gúrate de
q ue , invol untariam e nte , no
h ace s un pue nte e ntre dos
puntos de lcircuito.
Pre s ta e s pe cial ate n-
ción a l a h ora de s ol dar l os
com pone nte s q ue tie ne n “po-
laridad” , com o l os diodos ,
LEDs y conde ns adore s e l e c-
trol íticos . Tam bién e s im por-
tante q ue col oq ue s e lz ócal o
de s tinado al PIC e n l a
dire cción corre cta, ya q ue de
h ace rl o m alpue de s confun-
dirte cuando ins e rte s e lm i-
crocontrol ador, dañándol o.
//página 0x09
PIC16F628A e n as s e m bl
er
s e gunda parte
En e s ta s e gunda parte de ltutorialde program ación e n l e nguaje as s e m bl
e r nos
introducire m os e n e lm ane jo de ldire ccionam ie nto indire cto y e n e lm undo de l as
inte rrupcione s de lm icrocontrol ador. Expl icare m os q ué s on, para q ué s irve n, de
cuántas dis pone m os y s u im pl e m e ntación e n nue s tros program as . ¡M anos a l a
obra!
//por: Al e jandro Cas anova //
inf.pic.s uk y@ live .com .ar
//página 0x0B
;DIRECTO :
;De finim os re gis tro e n l
a m e m oria de datos .-
M iRe gis tro e q u 0x20 ;Ubicado e n 0x20.-
;INDIRECTO :
;Cargam os dato e n e lre gis tro.-
m ovl
w 0x20 ;
m ovw fFSR ;Dire ccionam os Re gis tro de datos ubicado e n 0x20.-
m ovl
w 0x8A ;
m ovw fINDF ;Cargam os re gis tro dire ccionado con e lval
or 0x8A.-
//página 0x0C
;**** Encabe z ado ****
Lis tp=16f628A ;l
is tdire ctive to de fine proce s s or
#incl ude <p16f628A.inc> ;proce s s or s pe cific variabl e de finitions
_ _ CO NFIG _ CP_ O FF & _ W DT_ O FF & _ BO DEN_ O N & _ PW RTE_ O N &
_ INTO SC_ O SC_ NO CLK O UT & _ DATA_ CP_ O FF & _ LVP_ O FF & _ M CLRE_ O N
;**** De finición de variabl
e s ****
Contador equ 0x20 ;Se l e ccionam os pos ición e n l a RAM (GPR) para guardar
Contador1 e q u 0x21 ;Re gis tro util iz ado e n de m ora.-
Contador2 e q u 0x22 ;Re gis tro util iz ado e n de m ora.-
Re s e t
org 0x00 ;Aq uí com ie nz a e lm icro.-
goto Inicio ;Sal to a inicio de m i program a.-
;**** Program a principal****
;**** Configuración de pue rtos ****
org 0x05
Inicio
bs f STATUS,RP0 ;Pas am os de Banco 0 a Banco 1.-
clrf TRISB ;PO RTB com o s al ida.-
bcf STATUS,RP0 ;Pas o de lBanco 1 alBanco 0
cal l Config_ Tabl a ;Cargam os re gis tros con Código de 7 s e gm e ntos .-
m ovfw INDF ;Le e m os código de 7 Se gm e ntos para e lCERO .-
m ovw fPO RTB ;M os tram os e lCERO .-
;**** Bucl e de vis ualiz ación ****
Bucl e
cal l De m ora_ 19 0m s ;De m ora para vis ual iz ar Dis pl
ay
incf FSR,1 ;Incre m e ntam os Punte ro.-
m ovl w 0x3A ;Cons ul tam os s i s e pide código para m os trar "10",
s ubw f FSR,0 ;s i e s as í re s e te am os FSR, apunta a 0x30--> "0".-
btfs s STATUS,Z ;Si Z =1 --> 0x3A - FSR = 0.-
goto M ue s tro_ Dis pl ay ;No, m ue s tro dis pl ay.-
m ovl w 0x30 ;Si re s e te o punte ro.-
m ovw fFSR ;
M ue s tro_ Dis pl ay
m ovfw INDF ;Le o Re gis tro q ue apunta FSR.-
m ovw fPO RTB ;Lo cargo e n PO RTB.-
goto Bucl e ;Continuo conte o.-
;**** De m ora ****
De m ora_ 19 0m s
m ovl w 0xFF ;
m ovw fContador1 ;Iniciam os contador1.-
Re pe ticion1
m ovl w 0xFF ;
m ovw fContador2 ;Iniciam os contador2
Re pe ticion2
de cfs z Contador2,1 ;De cre m e nta Contador2 y s i e s 0 s al e .-
goto Re pe ticion2 ;Si no e s 0 re pe tim os cicl o.-
de cfs z Contador1,1 ;De cre m e nta Contador1.-
goto Re pe ticion1 ;Si no e s ce ro re pe tim os cicl o.-
re turn ;Re gre s a de l a s ubrutina.-
//página 0x0D
;**** Cargam os tabl a e n m e m oria ****
Config_ Tabl a
m ovl w 0x30 ;
m ovw fFSR ;Dire ccionam os e lre gis tro 0x30 de l a m e m oria RAM (GPR).-
m ovl w 0x3F ;Cargam os e lcódigo para m os trar e lCERO .-
m ovw fINDF ;Lo guardam os donde apunta FSR --> 0x30.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x31.-
m ovl w 0x06 ;Cargam os código para UNO .-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x32.-
m ovl w 0x5B ;Cargam os código para DO S.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x33.-
m ovl w 0x4F ;Cargam os código para TRES.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x34.-
m ovl w 0x66 ;Cargam os código para CUATRO .-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x35.-
m ovl w 0x6D ;Cargam os código para CINCO .-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x36.-
m ovl w 0x7D ;Cargam os código para SEIS.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x37.-
m ovl w 0x07 ;Cargam os código para SIETE.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x38.-
m ovl w 0xFF ;Cargam os código para O CH O .-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
incf FSR,1 ;Incre m e ntam os FSR, ah ora apunta a 0x39 .-
m ovl w 0x6F ;Cargam os código para NUEVE.-
m ovw fINDF ;Lo guardam os donde apunta FSR.-
;....................
m ovl w 0x30 ;
m ovw fFSR ;Dire ccionam os Re gis tro de lCERO .-
re turn ;Cargado l os val ore s , re tornam os .-
;..................................................................
e nd
//página 0x0E
com paradore s anal ógicos .
• Inte rrupción provocada por
Una de l as caracte rís - e l m ódulo CCP e n m odo
ticas m ás im portante de l os com paración o captura.
m icrocontrol adore s e s q ue
tie ne n l a pos ibilidad de m a- Cada fue nte de inte -
ne jar inte rrupcione s . Se trata rrupción e s ta control ada por
de un aconte cim ie nto q ue 2 bits . Un bit l ocalde inte -
h ace q ue e l m icro de je de rrupcione s (te rm inado e n E)
lado l o q ue s e e ncue ntra de pe rm is o o proh ibición de El bit GIE s e borra
re aliz ando, atie nda e s e s uce - e je cución. Si e s ta e n 0 bl o- autom áticam e nte cuando s e
s o, re gre s e y continúe con l o q ue ará l a s ol icitud de inte - re conoce una inte rrupción
s uyo. rrupción, y s i e s ta e n 1 para e vitar q ue s e produz ca
H ay dos tipos de inte - pe rm itirá l a e je cución. Un bit otra m ie ntras s e e s tá ate n-
rrupcione s pos ibl e s , una e s q ue actúa com o s e ñal iz ador die ndo a l a prim e ra y al
m e diante una acción e xte rna (te rm inado e n F) e lcuale s re tornar de l a inte rrupción
(e s de cir por l a activación de activado (pue s to a 1) s i s e con l a ins trucción RETFIE, e l
uno de s us pine s ), l a otra e s h a producido l a inte rrupción. bit GIE s e vue l ve a activar
inte rna (por e je m pl o cuando Ade m ás e xis te n 2 bits poniéndos e a 1. En cam bio
ocurre e lde s bordam ie nto de de controlgl obal , e lbit GIE los bits s e ñal iz adore s o ban-
uno de s us re gis tros ) (INTCO N <7>) e lcuals i e s ta de ras de inte rrupción de be n
En e l16F628A h ay 10 de s activado bl oq ue a todas s e r pue s tos a ce ro por e l
fue nte s de inte rrupción: las s ol icitude s de inte rrup- tratam ie nto de l a inte rrupción
ción y e lbit PEIE (INTCO N re aliz ada por e l us uario
• Fl anco as ce nde nte o de s - <6>) q ue s e ría com o un (program ador).
ce nde nte de l pin RB0/INT, s e gundo bit de controlgl obal Cuando una inte rrup-
q ue re gre s a alPIC de lm odo de inte rrupcione s e xce ptuan- ción e s tá h abil itada (s u bit
SLEEP. do a de s bordam ie nto de l local de h abil itación e s tá
• Por l os pine s RB4 a RB7, Tim e r0, de te cción de fl anco activado, e lbit GIE e s tá acti-
configurados com o e ntrada y e n RB0 y cam bio de e s tado vado y/o de pe ndie ndo de lca-
e n cas o de q ue al guno de de RB4-RB7. s o e lbit PEIE e s tá activado)
el los cam bie de e s tado. Lo ante rior de s crito y ocurre e l e ve nto q ue l a
• Por de s bordam ie nto de l pue de e nte nde rs e obs e rvan- activa, e l val or de PC s e
re gis tro TM R0, cuando e s te do e ldiagram a l ógico de l a guarda e n l a PILA y e n és te
re gis tro pas a de 255 a 0 e n figura #2. s e carga e l0x04 (único ve c-
de cim al . tor de inte rrupción). Es a
• Por de s bordam ie nto de l Nota: Todos e s tos bits al partir de e s ta dire cción q ue
re gis tro Tim e r1, cuando pas a re s e te ars e o iniciars e e lm i- s e de be col ocar e ltratam ie n-
de 65535 a 0 e n de cim al . cro s e e ncue ntran e n 0. to de l a inte rrupción, de te c-
• Por de s bordam ie nto de l
re gis tro TM R2, cuando e s te
re gis tro s upe ra e l val or de l
re gis tro PR2.
• Alcom pl e tar l
a e s critura de
l a EEPRO M de datos .
• Cuando s e re cibe un dato
por USART.
• Cuando s e com pl e ta e l
e nvío de un dato por USART.
• O curre un cam bio e n l os
//página 0x0F
tando por m e dio de l os bits guie nte ins trucción. b) M odo Captura: H a ocu-
bande ras cualde l os e ve n- rrido una captura de TM R1
tos h a ocurrido y actuar 3. No Im pl e m e ntado.
s e gún s e a e lcas o. 4. TXIF: Indicador de inte -
INTCO N. Re gis tro de rrupción de fin de trans -
Nota: e l único re gis tro q ue le ctura y e s critura q ue m is ión USART.
s e s al va e n l a PILA e s PC, cont ie ne v arios bits de s e ña- 5. RCIF: Indicador de inte -
para pre s e rvar al gún otro liz ación y h abil itación para e l rrupción de l le gada de datos
re gis tro de be s e r e l propio de s bor-dam ie nto de l TM R0, USART.
program a de ate nción a l a cam bio s obre e lpue rto RB e 6. CM IF: Indicador de inte -
inte rrupción e lq ue s e e ncar- inte rrup-ción e xte rna e n l a rrupción por cam bio de e s ta-
gue de s al var s u e s tado al pat illa RB0/ INT . do de al guna de l as s al idas
inicio de l a rutina y de de vol - de l os com paradore s .
ve rl os alfinalde lm is m o. 0. RBIF: Indicador de inte - 7. EEIF: Indicador de inte -
rrupción por cam bio de rrupción de fin de e s critura
e s tado RB4-RB7. e e prom inte rna.
1. INTF: Indicador de inte -
• O curre un e ve nto q ue rrupción e xte rna. PIE1. Re gis tro q ue
s ol icita l a inte rrupción, e lbit 2. T0IF: Indicador de inte - pos e e l os bits de h abil itación
bande ra s e activa. rrupción por de s bordam ie nto individual para l as inte rrup-
• Si e lbit l ocalde inte rrup- de Tim e r 0. cione s de pe riféricos . Elbit
cione s e s ta activado, e l bit 3. RBI E: H abil itación de inte - PEIE de l re gis tro INTCO N
GIE activado y/o PEIE acti- rrupción por cam bio de de be s e r 1 para pe rm itir l a
vado s e produce l a inte rrup- e s tado RB4-RB7. h abil itación de cual q uie r
ción. 4. INTE: H abil itación de inte - inte rrupción de pe riférico.
• Se de s activa GIE. rrupción e xte rna.
• Elval or de lPC s e guarda 5. T0IE: H abil itación de inte - 0. TM R1IE: H abil itación de
en l a PILA, y PC s e carga rrupción por de s bordam ie nto inte rrupción por de s borda-
con 0x04. de Tim e r 0. m ie nto de Tim e r 1.
• Se e je cuta l a rutina de 6. PEIE: H abil itación de inte - 1. TM R2IE: H abil itación de
ate nción de inte rrupción cre a- rrupción de pe riféricos . inte rrupción por de s borda-
da por e lus uario, guardando 7. GI E: H abil it ación ge ne ral m ie nto de Tim e r 2.
l os re gis tros ne ce s arios y de inte rrupcione s . 2. CCP1IE: H abil itación de
re al iz ando l a bifurcación co- inte rrupción de l m ódul o de
rre s pondie nte para l a ate n- PIR1. Elre gis tro PIR1 Captura/Com paración/PW M .
ción de l e ve nto por m e dio contie ne l os bits de s e ña- 3. No Im pl e m e ntado.
de lbitbande ra. liz ación indiv idual de l
as 4. TXI E: H abil itación de
• Al final iz ar e l tratam ie nto inte rrupcione s de pe riféricos . inte rrupción de fin de trans -
de le ve nto, s e de vue l ve n l os m is ión USART.
val ore s de los re gis tros 0. TM R1IF: Indicador de 5. RCIE: H abil itación de
s al vados y s e borran por inte rrupción por de s borda- inte rrupción de l le gada de
s oftw are l os bits bande ras . m ie nt o de Tim e r 1. dat os USART .
• La rutina de ate nción 1. TM R2IF: Indicador de 6. CM IE: H abil itación de
de be rá te rm inar con una inte rrupción por de s borda- inte rrupción por cam bio de
ins trucción RETFIE, l a cual m ie nto de Tim e r 2. e s tado de al guna de l as s a-
activa nue vam e nte e lbit GIE 2. CCP1IF: Indicador de lidas de l os com paradore s .
(GIE=1) y l ee l a PILA para int e rrupción de l m ódul o de 7. EEI E: H abilitación de
re s tabl e ce r PC y continuar l a Captura /Com paración. inte rrupción de fin de e s cri-
e je cución de lprogram a q ue a) M odo Com parador: Coinci- tura e e prom inte rna.
fue inte rrum pido e n l a s igui- de ncia e ntre TM R1 y CCP1.
//página 0x10
;**** Rutina de s e rvicio de Inte rrupción ****
; Guardado de re gis tro W y STATUS.-
Inicio_ ISR
Prim e ro s e de be guar- m ovw fW _ Te m p ;Copiam os W a un re gis tro
dar e lconte nido de lre gis tro ;Te m porario.-
W y STATUS. El probl ema s w apf STATUS, W ;Inve rtim os l os nibl e s de l
de m ove r W a otro re gis tro ;re gis tro STATUS.-
(h acie ndo us o de m ovf) e s m ovw fSTATUS_ Te m p ;Guardam os STATUS e n un
q ue e s ta ins trucción corrom - ;re gis tro te m poral.-
pe l a bande ra Z , m odificando ISR
e lre gis tro de STATUS. Se - ;Ate nde m os l a inte rrupción.-
gún l a h oja de datos otor- ;Re s tauram os l os val ore s de W y STATUS.-
gada por M icroch ip, e n uno Fin_ ISR
de s us apartados re com ie n- s w apf STATUS_ Te m p,W ;Inve rtim os l o nible s de
da una s e cue ncia de código ;STATUS_ Te m p.-
q ue pe rm ite guardar y m ovw fSTATUS
re s taurar l os re gis tros s in s w apf W _ Te m p, f ;Inve rtim os l os nibl es yl o
m odificarl os . ;guardam os e n e lm is m o
;re gis tro.-
s w apfW _ Te m p,W ;Inve rtim os l os nibl es
;nue vam e nte y l o
;guardam os e n W .-
Para e lcontrolde l a re tfie ;Sal im os de inte rrupción.-
inte rrupción e xte rna s e ne ce -
s ita un bit adicionalINTEDG ;Los re gis tros W _ Te m p y STATUS_ Te m p s on re gis tros
(O PTIO N_ REG<6>) q ue s e - ;alte rnativos para guardar te m porariam e nte s us val ore s
le cciona e lfl anco q ue ge ne - ;corre s pondie nte s .
rará l a inte rrupción. Si e s tá
e n 1 s e ge ne ra por fl anco q ue m ue s tre com o s e confi- ello configuram os q ue l a inte -
as ce nde nte y e n 0 por fl anco gura, e lcualalpre s ionar un rrupción de ge ne re por fl an-
de s ce nde nte . pul s ador cone ctado a RB0 co as ce nde nte . En e s ta cas o
Para m os trar s u us o cam biará e l e s tado de un vam os a re al iz ar e lguardado
h are m os un e je m plo s e ncil
lo LED cone ctado a RB1, para de l os re gis tro W y STATUS
//página 0x11
;**** Encabe z ado ****
lis t p=16f628A ;l is tdire ctive to de fine proce s s or
#incl ude <p16f628A.inc> ;proce s s or s pe cific variabl e de finitions
_ _ CO NFIG _ CP_ O FF & _ W DT_ O FF & _ BO DEN_ O N & _ PW RTE_ O N &
_ INTO SC_ O SC_ NO CLK O UT & _ DATA_ CP_ O FF & _ LVP_ O FF & _ M CLRE_ O FF
;**** De finición de variable s ****
Contador1 e q u 0x20
Contador2 e q u 0x21
//página 0x12
Fin_ ISR
bcf INTCO N,INTF ;Lim piam os bande ra.-
re tfie ;Sal im os de inte rrupción.-
;..........................................
;**** De m ora ****
De m ora_ 20m s
m ovl w 0xFF ;
m ovw fContador1 ;Iniciam os contador1.-
Re pe ticion1
m ovl w 0x19 ;
m ovw fContador2 ;Iniciam os contador2
Re pe ticion2
de cfs z Contador2,1 ;De cre m e nta Contador2 y s i e s 0 s al
e .-
goto Re pe ticion2 ;Si no e s 0 re pe tim os ciclo.-
de cfs z Contador1,1 ;De cre m e nta Contador1.-
goto Re pe ticion1 ;Si no e s ce ro re pe tim os ciclo.-
re turn ;Re gre s a de la s ubrutina.-
e nd
para e je m pl
ificar e l m étodo
pe ro no e s ne ce s ario ya q ue
e lm icrocontrol ador s ol o es-
pe ra a q ue ocurra l a inte -
rrupción.
Com o e ltitul o l
o indi-
ca e s ta inte rrupción s e ge ne -
ra cuando s e pre s e nta un
cam bio de nive le n cual q uie -
ra de l os pine s RB4 a RB7
configurados com o e ntradas .
Aprove ch are m os e s ta
inte rrupción para de te ctar
cuando s e h a pre s ionado
una te cl a de un te cl ado m atri-
cial . Un te cl ado m atriciale s
un s im pl e arre glo de botone s
cone ctados e n fil as y col um -
nas , de m odo q ue s e pue de n
le e r varios botone s con e l util iz ando s olam e nte 7 l íne as de l pue rto B, RPBU
m ínim o núm e ro de pine s de un m icrocontrol ador. (O PTIO N_ REG<7>) a 0, e n-
re q ue ridos . Un te cl ado m atri- Configurare m os RB0 tonce s e n e s tado norm al(s in
cial4×3 s ol am e nte ocupa 4 a RB3 com o s al ida y l as col o- pre s ión de te clas ) e s tarán a
líne as de un pue rto para l as care m os a nive lbajo. RB4 y nive l alto. Al pre s ionar una
filas y otras 3 l íne as para las RB7 configuradas com o e n- te cl
a s e cone cta una fil a con
col um nas , de e s te m odo s e tradas y h abil itare m os l as una col um na, s e produce un
pue de n l e e r 12 te clas util i- re s is te ncias pul l-up inte rnas cam bio de nive le n al guna de
//página 0x13
las col um nas (de nive lal to a pre s e ntare m os la te cl a te cla pre s ionada.
bajo), y s e ge ne ra l a inte rrup- pre s ionada e n form a binaria
ción. Para de te ctar q ue te cl a con LEDs cone ctados al Nota: La bande ra RBIF de be
s e h a pre s ionado, s e col o- pue rto A. pone rs e a ce ro por s oftw are
can RB0 a RB3 a nive lal to, pe ro ade m ás de be re al iz ars e
y s e pas an a nive lbajo de a pre viam e nte una ope ración
una por ve z , de te ctando s i de l e ctura (o e s critura) de l
s e produce al gún cam bio e n Te ne r e n cue nta q ue Pue rto B para q ue de je de
las col um nas . Se util iz a una tam bién con l a variabl e dars e l a dis cre pancia e ntre
variabl e q ue s e incre m e nta NTe cl a (Num e ro de Te cl a e l val or actual y e l val or
con l a cue nta de l as te cl as pre s ionada) s e pue de util iz ar le ído, y no ge ne re una nue va
re vis adas , de e s te m odo al com o e ntrada a una tabl a inte rrupción.
de te ctar una pul s ación e l para codificar e n ASCK II l a
val or de l a cue nta s e rá e l
val or de l a te cla pre s ionada. m ovfw NTe cla
Si al final no s e pre s ionó call Tabl a_ TM atricial
ninguna te cl a l a variabl e se ;Codificación de Te cl a pre s ionada:
pone a ce ro y l a cue nta Tabla_ TM atricial
vue l ve a com e nz ar. addw fPCL,1
Algoritm o de de te c- DT “1”,”2”, ”3”, ”4”, ”5”, ”6”, ”7”, ”8”, ”9 ”, ”*”, ”0”, ”#”
ción de te cl a pul s ada: alocu-
rrir una inte rrupción s e pue -
de de te rm inar q ue col um na
h a cam biado de e s tado, pe ro
no l a fil
a. Entonce s para de -
te ctarl a ire m os col ocando a
nive lbajo s ol o una fil a por
ve z , y te s te are m os las col um -
nas , alde te ctar un nive lbajo
e n al guna de te rm inare m os
m e diante l a cue nta de te cl as
te s te adas e xactam e nte cual
h a s ido.
En nue s tro e je m pl o re -
//página 0x14
;**** Encabe z ado ****
lis tp=16f628A ;l is tdire ctive to de fine proce s s or
#incl ude <p16f628A.inc> ;proce s s or s pe cific variabl e de finitions
_ _ CO NFIG _ CP_ O FF & _ W DT_ O FF & _ BO DEN_ O N & _ PW RTE_ O N &
_ INTO SC_ O SC_ NO CLK O UT & _ DATA_ CP_ O FF & _ LVP_ O FF & _ M CLRE_ O N
;**** De finición de variabl e s ****
NTe cl a e q u 0x20 ;Se le ccionam os pos ición e n l
a m e m oria RAM (GPR)
para guardar Num e ro de Te cl a pre s ionada
//página 0x15
;Ras tre am os Te cl a pre s ionada.-
Te cl a_ Pre s ionada
clrf NTe cl a ;Borra Num e ro de Te cl a y…
incf NTe cl a,1 ;… pre para NTe cl a para prim e r código.
m ovl w b'00001110' ;Saca 0 a l a prim e ra fil a…
m ovw fPO RTB ;… de l a Pue rta B
nop ;Para e s tabil iz ación de s e ñal .
Te s t_ Col um nas
btfs s PO RTB,4 ;Prim e ra col um na = 0?
goto Sue l ta_ te cla ;Sal e s i s e h a pul s ado te cl
a.
incf NTe cl a,1 ;No e s , incre m e nta nº te cl a.
btfs s PO RTB,5 ;Se gunda col um na = 0?
goto Sue l ta_ te cla ;Sale s i s e h a pul s ado te cla.
incf NTe cl a,1 ;No e s , incre m e nta nº te cl a.
btfs s PO RTB,6 ;Te rce ra col um na = 0?
goto Sue l ta_ te cla ;Sal e s i s e h a pul s ado te cl
a.
incf NTe cl a,1 ;No e s , incre m e nta nº te cl a.
; En e s te cas o no s e Us a te clado 3x4.-
; btfs s PO RTB,7 ;Cuarta col um na = 0
; goto Sue l ta_ te cla ;Sale s i s e h a pul s ado te cla.
; incf NTe cl a,1 ;No e s , incre m e nta nº Te cl a.
Ul
tim a_ te cl a
btfs s PO RTB,3 ;Ya s e re vis aron todas l as fil
as ?
goto Nul l_ te cl
a ;Si, Fals a al arm a, no s e h a pre s ionado ninguna.-
bs f STATUS,C ;No, s e guim os con l a s iguie nte . Pone a 1 BitC…
rlf PO RTB,1 ;… as í l
a Fil a 1 pas a a 1 con l a rotación a iz q da.
goto Te s t_ Col um nas ;Se guim os te s te ando.
Nul
l_ te cl a
clrf NTe cl
a ;Col oca variabl
e Te cl
a a 0 (Ninguna)
re turn ;re gre s a.
Sue l ta_ te cl a
;Ah ora s e e s pe ra a q ue l a te cla s e a s ol
tada para e vitar re bote s y re activacione s de te cl
a.
Es pe ra1
btfs s PO RTB,4 ;Si no s e s ue l ta l a te cl
a FILA 1…
goto Es pe ra1 ;… vue l ve a e s pe rar.
Es pe ra2
btfs s PO RTB,5 ;Si no s e s ue l ta l
a te cla FILA 2…
goto Es pe ra2 ;… vue l ve a e s pe rar.
Es pe ra3
btfs s PO RTB,6 ;Si no s e s ue l ta l
a te cla FILA 3…
goto Es pe ra3 ;… vue l ve a e s pe rar.
Es pe ra4
btfs s PO RTB,7 ;Si no s e s ue l ta l
a te cla FILA 4…
goto Es pe ra4 ;… vue l ve a e s pe rar.
re turn ;vue l
ve alprogram a q ue h iz o l allam ada.
;..........................................
e nd
//página 0x16
l
ibre ría de gráficos
para GLCD e n C
Cuando ne ce s itam os util iz ar un dis pl ay LCD gráfico (GLCD) nos e ncontram os
q ue no s ie m pre te ne m os a m ano l as funcione s ne ce s arias para dibujar form as o
te xto s obre él . Al gunos com pil adore s dis pone n de libre rias ale fe cto, pe ro m uch as
ve ce s tie ne n re s triccione s l e gale s s obre e lcódigo ge ne rado. H oy te m os tram os
com o e s cribir tus propias rutinas , y a adaptarl as a tus ne ce s idade s .
//por: Arie lPal az z e s i //
arie l
palaz z e s i@ gm ail .com
//página 0x18
PIN LCD PIC //--------------------------------------------------------------------------------
1 CS1 B1 //GLCD_ inicial iz a(m odo) - Es ta función inicial iz a e lLCD.
2 CS1 B0 //--------------------------------------------------------------------------------
6 R/S B2 void GLCD_ inicial iz a(int1 m odo)
{
7 R/W B3
//Pone l os pine s de controle n e le s tado corre cto.
8 E B4
output_ h igh (GLCD_ RESET);
9 ...16 D0...D7 D0...D7 output_ l ow (GLCD_ E);
17 RESET B5 output_ l ow (GLCD_ CS1);
output_ l ow (GLCD_ CS2);
Por s upue s to, los pi- output_ l ow (GLCD_ DI); //M odo ins trucción
ne s utiliz ados pue de n cam -
biars e m odificando l as s e n- //Envio datos de inicial
iz ación -----------------------
te ncias DEFINE q ue s e e ncu- GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0xC0);
e ntran alprincipio de l al ibre - GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0xC0);
ría. GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0x40);
GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0x40);
//Pine s a us ar GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0xB8);
#de fine GLCD_ CS1 GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0xB8);
PIN_ E2
#de fine GLCD_ CS2 //Si m odo = 1 inicial
iz a e nce ndido. Sino, apagado.
PIN_ E1 if(m odo == 1)
#de fine GLCD_ DI { GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0x3F);
PIN_ C3 //Encie ndo e lGLCD
#de fine GLCD_ RW GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0x3F);}
PIN_ C2 el se {
#de fine GLCD_ E GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0x3E);
PIN_ C1 //Apago e lGLCD
#de fine GLCD_ RESET GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0x3E);}
PIN_ E0
//Borro la pantal l
a
Com e nce m os a anal i- GLCD_ l im piar(0);
z ar cada una de l as funcio- }
ne s im pl
e m e ntadas :
"pinta" toda l a pantal l
a con
uno u otro col or. Si re cibe co-
Es ta e s l a prim e r función de m o parám e tro un "1", l a
la l ibre ría q ue de be l lam ar pintará com pl e tam e nte de
nue s tro program a. Se e ncar- ne gro. Si re cibe un "0", l a
ga de inicial iz ar e lGLCD, y lim piará por com pl e to. Su
e lparám e tro "m odo" de te rm i- funcionam ie nto tam bién e s
na s i e s tará e nce ndido (s i m uy s e ncil lo, y s e "apoya"
re cibe un "1") o apagado (s i e n GLCD_ e nvia BYTE() para
re cibe un "0"). Es im portante e s cribir e n e lGLCD. Re corre
s abe r q ue e s ta función ade - am bas m itade s de l GLCD,
m ás de inicial iz ar e l GLCD página por página, de arriba
borra l a pantal la. h acia abajo, e s cribie ndo
"0x00" o "0xFF" s e gún s e h a-
ya e l e gido pintar o borrar.
Es ta e s l
a función q ue
//página 0x19
//---------------------------------------------------------------------------------
//GLCD_ l im piar(col or) - Lim pia e lGLCD (pinta l a pantal la) Es ta e s l a "prim itiva gráfica"
//--------------------------------------------------------------------------------- indis pe ns abl e . A partir de
void GLCD_ l im piar(int1 col or) GLCD_ punto(x, y, col or) e s -
{ cribire m os todas l as funcio-
int8 i, j; ne s re s tante s . Los parám e -
//Re corre l as 8 paginas (ve rtical ) tros q ue re cibe GLCD_ punto-
for(i = 0;i < 8;+ + i) (x, y, color) s on:
{
output_ l ow (GLCD_ DI); //M odo ins trucción x: un byte , e s l a coorde nada
"x" (h oriz ontal), con val ore s
//Com ie nz o, e n cada página, de s de l
a dire cción 0 válidos de 0 a 127 (iz q uie rda
GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0b01000000); a de re ch a).
GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0b01000000);
y: un byte , e s la coorde nada
//Se l
e cciono l
a dire ccion de ntro de l
a pagina "y" (ve rtical
), con val
ore s vál
i-
GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, i | 0b10111000); dos de 0 a 63 (arriba a aba-
GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, i | 0b10111000); jo).
output_ h igh (GLCD_ DI); //M odo datos color: un bit, "0" = apagado,
"1" = e nce ndido.
//Re corre las dos m itade s (h oriz ontal
es)
for(j= 0;j< 64;+ + j)
{ GLCD_ e nviaBYTE(GLCD_ l ado_ CS1, 0xFF * col
or);
//Encie nde /apaga píxe les
GLCD_ e nviaBYTE(GLCD_ l ado_ CS2, 0xFF * color);
//Encie nde /apaga píxe l es
}
}
}
//página 0x1A
//-----------------------------------------------------------------------
//GLCD_ punto(x, y, col or) - Dibuja un pixe l
La l ine a tam bién re s ulta in- //-----------------------------------------------------------------------
dis pe ns abl
e a l a h ora de di- void GLCD_ punto(int8 x, int8 y, int1 col or)
bujar un gráfico. Los parám e - {
tros q ue re cibe GLCD_ l ine a- BYTE dato;
(x1, y1, x2, y2, color) s on: int1 lado = GLCD_ l ado_ CS1; //Lado e n q ue voy a dibujar.
x1: un byte , e s l a coorde na- if(x > 63) //Ve o s i cae de lotro l
ado
da "x" (h oriz ontal ) de lprim e r { x -= 64;
e xtre m o de l a l ine a, con l
ado = GLCD_ l
ado_ CS2;}
val ore s vál idos de 0 a 127
(iz q uie rda a de re ch a). output_ l ow (GLCD_ DI); //M odo ins trucción
y1: un byte , e s l a coorde na- bit_ cl e ar(x,7); //Lim pio bitM SB...
da "y" (ve rtical ) de l prim e r bit_ s e t(x,6); //...y pongo e lbit6 e n 1
e xtre m o de l a l ine a, con GLCD_ e nviaBYTE(l ado, x);
val ore s válidos de 0 a 63 (a- //Envio l a dire cción de l
a coorde nada X
rriba a abajo).
x2: un byte , e s l a coorde na- //Calcul o e n q ue pagina de las 8 cae ...
da "x" (h oriz ontal ) de ls e gun- GLCD_ e nviaBYTE(l ado, (y/8 & 0xBF) | 0xB8);
do e xtre m o de l a l ine a, con output_ h igh (GLCD_ DI); //...y pas o a M odo datos
val ore s vál idos de 0 a 127
(iz q uie rda a de re ch a). //Se ne ce s itan dos le cturas para q ue de vue l
va e ldato e n l
a
y2: un byte , e s l a coorde na- //nue va dire cción
da "y" (ve rtical ) de ls e gundo GLCD_ l e e BYTE(l ado);
e xtre m o de l al ine a, con val o- dato = GLCD_ l e e BYTE(l ado);
re s vál idos de 0 a 63 (arriba
a abajo). //De acue rdo alval or de color...
col or: un bit, "0" = l ine a e n if(color == 1) bit_ s e t(dato, y% 8); //Encie ndo e lpíxe l
bl anco, "1" = l ine a e n ne gro. else bit_ cle ar(dato, y% 8); //apago e lpíxe l
Eltraz ado de l ine as s e bas a output_ low (GLCD_ DI); //M odo ins trucción
e n e lAlgoritm o de Bre s e n- GLCD_ e nviaBYTE(l ado, x); //Fijo e ll ado a e s cribir,
h am . output_ h igh (GLCD_ DI); //pongo e n M odo Datos y....
GLCD_ e nviaBYTE(l ado, dato); //dibujo e lpíxe l
}
//página 0x1B
//--------------------------------------------------------------------------------
//Dibuja una l ine a de s de (x1,y1) a (x2,y2) de col or (0 o 1)
Los re ctángul os de dibujan //--------------------------------------------------------------------------------
(inte rnam e nte ) m e diante cua- void GLCD_ l ine a(intx1, inty1, intx2, inty2, int1 col or)
tro l l
am adas a l a función {
GLCD_ l ine a. Los parám e - //De cl aro variabl e s -------------------
tros q ue re cibe GLCD_ re c- s igne d int x, y, incre m e nto_ x, incre m e nto_ y, dis tancia_ x,
tangul o(x1, y1, x2, y2, col or) dis tancia_ y;
s on: s igne d long P;
inti;
x1: un byte , e s l a coorde na-
da "x" (h oriz ontal ) de l a es- //Cal cul ol as dife re ncias e ntre l
as coorde nadas de orige n y
q uina s upe rior iz q uie rda de l de s tino
re ctángul o, con val ore s vál i- dis tancia_ x = abs ((s igne d int)(x2 - x1));
dos de 0 a 127 (iz q uie rda a dis tancia_ y = abs ((s igne d int)(y2 - y1));
de re ch a).
y1: un byte , e s l a coorde na- //Inicial iz o x e y con l as coorde nadas de orige n
da "y" (ve rtical ) de la e s q uina x = x1;
s upe rior iz q uie rda de lre ctán- y = y1;
gul o, con val ore s vál idos de
0 a 63 (arriba a abajo). //Cal cul o e ls e ntido de los incre m e ntos (pos itivos o
x2: un byte , e s l a coorde na- ne gativos )
da "x" (h oriz ontal ) de l a es- //e n función de l a pos ición de lorige n y e lde s tino
q uina infe rior de re ch a de l if(x1 > x2) incre m e nto_ x = -1;e l s e incre m e nto_ x = 1;
re ctángul o, con val ore s vál i- if(y1 > y2) incre m e nto_ y = -1;e l s e incre m e nto_ y = 1;
dos de 0 a 127 (iz q uie rda a
de re ch a). //Si l a dis tancia h oriz ontale s m ayor a l a ve rtical ...
y2: un byte , e s l a coorde na- if(dis tancia_ x >= dis tancia_ y)
da "y" (ve rtical ) de la e s q uina { P = 2 * dis tancia_ y - dis tancia_ x;
infe rior de re ch a de l re ctán- for(i=0;i<=dis tancia_ x;+ + i)
gul o, con val ore s vál idos de {
0 a 63 (arriba a abajo). GLCD_ punto(x, y, col or);
col or: un bit, "0" = re ctángu-
lo e n bl anco, "1" = re ctángu- if(P < 0)
lo e n ne gro. { P + = 2 * dis tancia_ y;
x + = incre m e nto_ x;}
el se
{ P + = 2*dis tancia_ y - 2*dis tancia_ x;
Las "cajas " s on re ctángul os x + = incre m e nto_ x;
pintados e n s u inte rior con e l y + = incre m e nto_ y;}
m is m o col or q ue e lborde e x- }
te rior. Tam bién s e dibujan (in- }
te rnam e nte ) m e diante l lam a-
das a l a función GLCD_ l ine - //Si l a dis tancia ve rticale s m ayor a l a h oriz ontal ...
a. Los parám e tros q ue re ci- el se
be GLCD_ caja(x1, y1, x2, { P = 2 * dis tancia_ x - dis tancia_ y;
y2, col or) s on: for(i=0;i<=dis tancia_ y;+ + i)
{ GLCD_ punto(x, y, col or);
x1: un byte , e s l a coorde na- if(P < 0)
da "x" (h oriz ontal ) de l a es- { P + = 2 * dis tancia_ x;
//página 0x1C
q uina s upe rior iz q uie rda de l y + = incre m e nto_ y;}
re ctángul o, con val ore s vál i- else
dos de 0 a 127 (iz q uie rda a { P + = 2 * dis tancia_ x - 2 * dis tancia_ y;
de re ch a). x + = incre m e nto_ x;
y1: un byte , e s l a coorde na- y + = incre m e nto_ y;}
da "y" (ve rtical ) de la e s q uina }
s upe rior iz q uie rda de lre ctán- }
gul o, con val ore s vál idos de }
0 a 63 (arriba a abajo).
x2: un byte , e s l a coorde na- //Eje m pl o de us o de GLCD_ l ine a(x1, y1, x2, y2, col
or)
da "x" (h oriz ontal ) de l a es- #incl ude <16F877A.h >
q uina infe rior de re ch a de l #de vice *=16
re ctángul o, con val ore s vál i- #incl ude <s tdlib.h >
dos de 0 a 127 (iz q uie rda a #fus e s H S,NO W DT,NO LVP
de re ch a).
y2: un byte , e s l a coorde na- #USE DELAY (CLO CK =20000000)
da "y" (ve rtical ) de la e s q uina #incl ude <GLCD_ K 0108.C>
infe rior de re ch a de lre ctángu-
lo, con val ore s vál idos de 0 a //-------Com ie nz a e lprogram a -----------------------
63 (arriba a abajo). void m ain()
col or: un bit, "0" = caja e n {
bl anco, "1" = caja e n ne gro. inti;
//página 0x1D
dos de 0 a 127 (iz q uie rda a //--------------------------------------------------------------------------------
de re ch a). //Dibuja un re ctángul o de s de (x1,y1) a (x2,y2)
y1: un byte , e s l a coorde na- //de col or (0 ó 1).
da "y" (ve rtical ) de l ce ntro //-----------------------------------------------------------------------
de lcircul o, con val ore s váli- void GLCD_ re ctangul o(intx1, inty1, intx2, inty2, int1 col or)
dos de 0 a 63 (arriba a aba- {
jo). GLCD_ l ine a(x1,y1,x2,y1,col or);
radio: un byte , e s e lradio de GLCD_ l ine a(x1,y1,x1,y2,col or);
la circunfe re ncia (e n pixe - GLCD_ l ine a(x1,y2,x2,y2,col or);
le s ). GLCD_ l ine a(x2,y1,x2,y2,col or);
col or: un bit, "0" = circulo en }
bl anco, "1" = circul o e n ne -
gro. //Eje m pl
o de GLCD_ re ctangul
o(x1, y1, x2, y2, col
or)
//Dibujo un re ctángulo
GLCD_ re ctangul o(10,10,117,40,1);
}
//página 0x1E
//-----------------------------------------------------------------------
//Dibuja un re ctángul o PINTADO de s de (x1,y1) a (x2,y2)
//de col or (0 o 1)
//-----------------------------------------------------------------------
void GLCD_ caja(intx1, inty1, intx2, inty2, int1 col or)
{
//De cl aro variabl e s -------------------
inti;
for(i=y1;i<=y2;i+ + ) {
GLCD_ l ine a(x1,i,x2,i,col
or);}
}
//-----------------------------------------------------------------------
//Dibuja un circul o con ce ntro e n (x1,y1), radio
//y col or (0 ó 1)
//-----------------------------------------------------------------------
void GLCD_ circul o(intx1, inty1, intradio, int1 col or)
{
s igne d intd, x, y;
//Inicial
iz o l
as variabl
es.
d = 1 - radio;
x = 0;
y = radio;
//página 0x1F
GLCD_ punto(x1, y1 - radio, col
or);
GLCD_ punto(x1 + radio, y1, color);
GLCD_ punto(x1 - radio, y1, col
or);
//Dibujando un circul o
#incl ude <16F877A.h >
#de vice *=16
#incl ude <s tdl
ib.h >
#fus e s H S,NO W DT,NO LVP
//página 0x20
H ay dos funcione s acce s o- //-----------------------------------------------------------------------
rias e n l as q ue s e bas a e l //Es cribe un byte e n una de l as m itade s de l a pantal la
funcionam ie nto de toda l a //(l ado=0:iz q Lado=1:de r)
libre ría. Efe ctivam e nte , de //-----------------------------------------------------------------------
form a indire cta o indire cta to- void GLCD_ e nviaBYTE(int1 l ado, BYTE dato)
das l as funcione s im pl e m e n- {
tadas h ace n us o de GLCD_ - if(l
ado) output_ h igh (GLCD_ CS2); //Se l e cciono l a m itad
le e BYTE(int1 l ado) y GLCD_ - corre s pondie nte
e nviaBYTE(int1 l ado, BYTE els e output_ h igh (GLCD_ CS1);
dato) para l e e r o e s cribii by-
te s e n e ldis pl ay. A continua- output_ low (GLCD_ RW ); //M odo e s critura
ción, e lcódigo fue nte de ca- output_ d(dato); //Col oco e ldato e n e lpue rto y...
da una. de l
ay_ us (1); //...e s pe ro.
output_ h igh (GLCD_ E); //Pongo e lbitEnabl e e n al to y...
Por úl tim o pue de s de s cargar de l
ay_ us (2); //...e s pe ro.
la l ibre ria GLCD_ K 0108.C output_ low (GLCD_ E); //Pongo e lbitEnabl e e n bajo.
h acie ndo cl ick aq uí.
output_ l
ow (GLCD_ CS1); //Libe ro l
aline a CS1 y...
output_ l
ow (GLCD_ CS2); //CS2.
}
//-----------------------------------------------------------------------
//Le e un byte de una de l as dos m itade s de l a pantal l
a
//-----------------------------------------------------------------------
//Se l
e cciono l
a m itad de ldis pl
ay a l
e e r.
if(l
ado) output_ h igh (GLCD_ CS2);
els e output_ h igh (GLCD_ CS1);
de l
ay_ us (1); //Es pe ro...
output_ h igh (GLCD_ E); //Pongo e n al to e lpin e nable y...
de l
ay_ us (2); //...e s pe ro.
dato = input_ d(); //Guardo e n "dato" e lval or de vue l
to y...
output_ low (GLCD_ E); //...pongo e n bajo e lpin e nabl e.
//Vue l
vo a pone r e n bajo l
as l
ine as CS1 y CS2.
output_ l
ow (GLCD_ CS1);
output_ l
ow (GLCD_ CS2);
re turn dato;
}
//página 0x21
l
e e r un te cl
ado m atricial
con PIC Sim ul ator IDE
Una de l as m ane ras m ás us ual e s de ingre s ar datos a un m icrocontrol ador e s a
través de un te cl ado m atricial. En e s te tutoriale xplicare m os com o re aliz ar una
rutina de l e ctura e n e ll
e nguaje Bas ic de le ntorno PIC Sim ul ator IDE para utiliz arl
a
e n nue s tros proye ctos .
//por: Lucas M artín Tre s e r //
lm tre s e r@ gm ail
.com
//página 0x23
Al
lDigital 'Subrutina de l
e ctura de un te cl
ado m atricial4x4.
//página 0x24
s éptim a com pe te ncia
nacionalde robótica
ElGrupo de Robótica y Sim ul ación (GRS) pe rte ne cie nte alDe partam e nto de
Inge nie ría Eléctrica de la Unive rs idad Te cnol
ógica NacionalFacul tad Re gional
Bah ía Bl anca organiz a nue vam e nte uno de l
os e ve ntos m ás im portante s de lpaís :
la "Séptim a Com pe te ncia Nacionalde Robotica".
//por: Grupo de Robótica y Sim ul ación //
com pe te nciarobotica@ frbb.utn.e du.ar
//página 0x26
s iguie nte :
//página 0x27
brújul
a digitalde pre cis ión
con s e ns or de e fe cto h al
l
Elfís ico Edw in H al lde s cubrió (por cas ual
idad) e le fe cto q ue l
le va s u nom bre e n e l
año1879 . De s de e ntonce s h an pas ado m uch os años y s e h an de s arrol lado
m últiple s s e ns ore s q ue aprove ch an e s te fe nóm e no. H acie ndo us o de e l l
os
podre m os cons truir una brújul a digitalde gran pre cis ión.
//por: Pabl o //
q uick bas ic@ te rra.e s
//página 0x29
m e nte de 2,5V h acia l a
te ns ión de fue nte y s i dam os
vue l ta e lim án, e nfre ntándol o
alpol o s ur, l a s al ida bajará
de 2,5Va nive lde m as a.
Aprove ch ando e s to y
para aum e ntar l a s e ns ibil i-
dad al dobl e m ontare m os
dos s e ns ore s opue s tos , uno
e nfre ntado a otro.
Si l e ace rcam os al
m ontaje e l pol o norte de l
im án, un de l os s e ns ore s s u-
birá 1V por e ncim a de lnive l
de re pos o ( 2,5V) y e lotro
bajará 1V por de bajo de h ora de conve rtir l a s e ñalde Por e je m pl o con una re s is -
dich o nive l . Por lo tanto te ne - anal ógica a digital . Por e s o te ncia de 360 oh m s s e
m os un s e ns or q ue e ntre ga us am os e l am pl ificador de cons igue una am pl ificación
3,5V y e lotro 1,5. Si e nton- ins trum e ntación INA122, de de 560 ve ce s l a te ns ión
ce s cone ctam os un vol tím e - m uy bajo ruido y "railto rail ". e ntrante . Por l o q ue l os 5m V
tro e ntre s us dos s al idas Es te ch ip de pre cis ión s e de lcam po m agnético te rre s -
"O UT" te ndre m os una dife - s ue l e us ar para am pl ificar tre s acarían 2'8 vol tios por e l
re ncia s um ada de 2V (ve r las m ínim as te ns ione s corpo- pin "O UT" de lINA122. Con
figura 1). ral e s para e q uipos de e l e ctro- e s tas ganancias e lruido e s
Con e s te arre gl ol ogra- cardiogram as y e nce fal ogra- cons ide rabl e y h ay q ue
m os m ul tiplicar l a s e ns ibil i- m as . Es m uy fácilde m ontar filtrarlo con capacitore s para
dad por 2: ah ora 1 Gaus s ya q ue s ól o ne ce s ita una lograr al go le gible . Elorige n
s e rán 10m V. Pe ro com o e l re s is te ncia e xte rna para de - de e s te ruido captado por l os
cam po m agnético de l a Tie - cirl e q ue ganancia ne ce s ita- s e ns ore s h al l e s un te m a
rra produce 5m V, todavía m os . m uy inte re s ante , pe ro para
re s ulta ins uficie nte para ata- Si m iram os l a h oja de otra ocas ión.
car un conve rs or anal ógico / datos e ncontrare m os una for-
digital . Te ndre m os q ue am pl i- m ul a para cal cul ar l a re s is -
ficar e s ta s e ñalm uch o m ás . te ncia q ue configura l a ga-
nancia de lam pl ificador:
En un conve rs or A/D de 10
(200.000 /R) + 5 = Ganancia bits (1023 puntos de re s ol
u-
Para e s te tipo de
apl icacione s l os am pl ificado-
re s ope racional e s (tipo LM -
358) re s ul tan ine ficace s ,
introduce n de m as iado ruido
y no s on "rail to rail ", q ue
q uie re de cir q ue no e ntre gan
e n s u s al ida una te ns ión
m áxim a de 5V y m ínim a de
0, s ino q ue s u rango dinám i-
co e s bas tante m e nor, l o q ue
nos trae rá probl e m as a l a
//página 0x2A
ción) con una te ns ión de
re fe re ncia de 5V, l a s alida de
2,8V de lINA122 e q uival e a
una variación de 572 puntos .
Al girar 360º varias
ve ce s e lm ontaje s e obtie ne
una gráfica com o l a de l a
figura 3. Se trata de una
función SENO . Con un s e n-
s or s ol am e nte te ne m os una
coorde nada: l a X, o e ls e no.
Te ne m os q ue util iz ar otro
s e ns or cruz ado a 9 0 grados
para obte ne r e l e je Y, e l
cos e no (ve r figura 2).
Ah ora bie n, con dos
s e ns ore s cruz ados y s i gira-
m os e lm ontaje varias vue l -
tas com pl e tas de 360 gra-
dos , ve re m os dos s e ñal es
com o l as de l a figura 4.
El de s fas e e ntre am -
bas gráficas coincide con l os
9 0º. Inte rpol ando am bas m e -
didas X e Y, y girando e l
m ontaje 360 grados , obte n-
dre m os una bonita gráfica de
puntos com o e s ta l a de l a
figura 5. Se trata de un cír-
cul o pe rfe cto, función de l
s e no y e lcos e no ge ne rados
por e lcam po m agnético te -
rre s tre . Cabe acl arar q ue l as
im pe rfe ccione s q ue s e ve n
s on de bidas a m ovim ie ntos
inde bidos a l a h ora de l os
e ns ayos con e lcircuito re al .
Las s e ñal
e s obte nidas
por e l circuito tie ne n una
am pl itud de 572 puntos , con
e s to pode m os cal cul
ar la pre - 360 grados /179 6 puntos = 0,2 función arco-tange nte para
cis ión q ue te ndrá nue s tra grados de re s ol
ución obte ne r de e s ta gráfica cir-
brújul a as í: cular un angul o e ntre 0 y 360
grados :
572 x 3.1416 = 179 6 puntos de
circunfe re ncia totalde lcírcul
o
Ah ora unas e cuacione s con
//página 0x2B
' ------(vol
ts e s e le je X , vol
ts 1 e s e le je Y)---- Ate nción: para q ue e s to
funcione , h ay q ue ajus tar e l
Ifvol ts = 0 And vol ts 1 > 0 Th e n angul
o = 270 ce ntro de l "círcul o" e n l as
Ifvol ts = 0 And vol ts 1 < 0 Th e n angul
o=90 coorde nadas 0,0. Es to pue -
Ifvol ts > 0 And vol ts 1 > 0 Th e n angul
o = 360 - (Atn(vol ts 1 / de s h ace rlo s im ple m e nte re s -
volts ) * (180 /3.1416)) tando o s um ando e l val or
Ifvol ts > 0 And vol ts 1 < 0 Th e n angul
o = -(Atn(vol ts 1 /vol ts ) * ade cuado a X e Y e n e l
(180 /3.1416)) program a. Con e s to ya te n-
Ifvol ts < 0 Th e n angul o = 180 - (Atn(vol
ts 1 /volts ) * (180 / dre m os una bonita l e ctura
3.1416)) digital e n grados , con una
pre cis ión m ayor de 1 grado.
printangul
o Sol o re s ta arm ar al guna
inte rface atractiva e n Vis ual
'------------------------------------------------------------------ Bas ic o s im ilar para us ar con
nue s tro h ardw are .
//página 0x2C
¡un PIC e n tu TV!
¿Al guna ve z , com o parte de al guno de tus proye ctos , h as ne ce s itado m os trar
al guna inform ación e n l a pantal l
a de un te l e vis or? Es pos ibl
e q ue s i. Pe ro e l
h ardw are y e ls oftw are ne ce s arios para e s te tipo de proye cto no e s fácilde
de s arrol l
ar. Sin e m bargo, ah ora podrás h ace rlo. Es te artícul
o te m os trará cóm o
conve rtir un PIC18 e n un ge ne rador PAL de graficos y te xtos (e n bl anco y ne gro)
con un núm e ro m uy re ducido de com pone nte s de bajo cos to, con un m ínim o de
e s fue rz o de program ación.
//por: Bruno Gavando //
bruno.gavand@ ad-valore m .fr
//página 0x2E
re m os e lus o de cada una de
el l
as .
Prototipo: void PAL_ init(uns igne d ch ar y)
Parám e tros : y : núm e ro de l
ine as ve rtical
e s , h as ta 128.
De vue l
ve : Nada
Es ta función pre para
la l ibre ría PIC PAL. Cuanto Re q uie re : Elfich e ro PAL_ library.h de be s e r incl
uido
m ayor s e a l a cantidad de e n e lcodigo fue nte de lus uario. ElPIC18
line as ve rticale s q ue de s e e s de be funcionar a 32M H z .
m os trar e n e lTV, m e nor s e rá Eje m pl
o: PAL_ init(128);
la cantidad de m e m oria y de
re curs os q ue e l PIC te nga
para e lre s to de lprogram a.
Es ta l ibre ría tom a e lcontrol Prototipo: void PAL_ control (uns igne d ch ar s t,
de lTIM ER0 y s us inte rrupcio- uns igne d ch ar rd)
ne s as ociadas . Tam bién util i-
Parám e tros : s t: Controlde l a s incroniz ación PAL.
z a e lPO RTD.
PAL_ CNTL_ START : Com ie nz a s incroniz a-
ción PAL.
PAL_ CNTL_ STO P : De tie ne l a s incroniz a-
ción PAL(l ibe ra los re curs os de lPIC).
Es ta función control a
rd : Controlde re nde r PAL_ CNTL_ BLANK :
la ge ne ración de l a s e ñalde
Sol o s e m ue s tran l os borde s (libe ra parte
vide o. Cuando com ie nz a l a
de l os re curs os de lPIC).
s incroniz ación PAL, l a varia-
PAL_ CNTL_ RENDER : M ue s tra todo e l
bl e PAL_ fram e Ctr (uns igne d
vide o, con borde s e im age n (cons um e m ás
long gl obal ) s e incre m e nta
re curs os de lPIC).
25 ve ce s por s e gundo.
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Es ta función l le na la Eje m pl
o: PAL_ control
(PAL_ CNTL_ START,
pantal l
a con un patrón de te r- PAL_ CNTL_ RENDER);
m inado. Util
iz a 0x00 para l im -
piar la pantal la y 0xFF para
pintarla com pl e tam e nte de
blanco. Prototipo: void PAL_ fil
l(uns igne d ch ar c)
Parám e tros : c : Patrón de re l
le no
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Es ta función cam bia
e lcol or de lborde q ue rode a Eje m pl
o: PALL_ fil
l(0);
la im age n.
Es ta e s l
a función q ue
pe rm ite dibujar un punto e n
una pos ición de te rm inada de
l
a pantal la.
//página 0x2F
Prototipo: void PAL_ s e tBorde r(uns igne d ch ar borde r)
Es ta función dibuja u-
Parám e tros : borde r : PAL_ CO LO R_ BLACK o na l ine a de s de (x0, y0) a (x1,
PAL_ CO LO R_ W H ITE y1).
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ borde r(PAL_ CO LO R_ BLACK ); Es ta función dibuja un
circul
o con ce ntro e n (x,y) y
radio z .
Eje m pl
o: PAL_ s e tPixe l
(10, 20, PAL_ CO LO R_ RE-
VERSE);
Es ta función e s cribe
un caracte r de te xto e n l
a fil
a
Prototipo: void PAL_ l ine (ch ar x0, ch ar y0, ch ar x1, y col um na de s e ada. Pue de s
ch ar y1, uns igne d ch ar m ode ) us ar PAL_ box() para e s cribir
e n vide o inve rtido.
Parám e tros : x0, y0 : Coorde nadas (fil a y col
um na) de l
com ie nz o de lal ine a.
x1, y1 : Coorde nadas (fil a y col
um na) de l
finalde l aline a.
m ode : col or de lpixe l , PAL_ CO LO R_ BLA- Es ta función e s cribe
CK , PAL_ CO LO R_ W H ITE o PAL_ CO LO R_ - una cade na de te xto a partir
REVERSE. de l
a fil
a y col
um na de s e ada.
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ line (0, 0, 127, 127, PAL_ CO LO R_ -
W H ITE);
Es ta función e s cribe
una cade na de te xto a partir
de la fil
a y col um na de s e ada.
Es iguala l a funcion ante rior,
pe ro para te xtos alm ace nad-
os e n RO M .
//página 0x30
Prototipo: void PAL_ circl e (ch ar x, ch ar y, ch ar r,
uns igne d ch ar m ode )
Dibuja una im age n
Parám e tros : x : Colum na de lce ntro de lcircul o.
(BitM ap) pre viam e nte al m a-
y : Fil
a de lce ntro de lcircul o.
ce nado e n l a RO M y apun-
r : Radio de lcircul o.
tado por bm , e n l a pos ición
m ode : col or de lpixe l, PAL_ CO LO R_ BLA-
(x, y). La im age n s e rá m ono-
CK , PAL_ CO LO R_ W H ITE o PAL_ CO LO R_ -
crom a, y pue de util iz ars e l a
REVERSE
h e rram ie nta para ge ne rar
De vue l
ve : Nada
m apas de bits para GLCD
Re q uie re : La e je cución pre via de PAL_ init(); T69 63 de m ik roEl e k tronik a
para conve rtir las im age ne s .
Eje m pl
o: PAL_ circl
e (30, 30, 5, PAL_ CO LO R_ W H I-
TE);
Es ta función no pue de
serl l am ada dire ctam e nte por
Prototipo: void PAL_ box(ch ar x0, ch ar y0, ch ar x1,
e lus uario, pe rode be s e r col o-
ch ar y1, uns igne d ch ar m ode )
cada de ntro de l a función
Parám e tros : x0, y0 :Coorde nadas de l a e s q uina s upe rior inte rrupt(). Ate nción: s i e s tán
iz q uie rda. h abil itadas , otras inte rrupcio-
x1, y1 :Coorde nadas de l a e s q uina infe rior ne s pue de ocas ionar probl e-
de re ch a. m as de s incronis m o e n e l
m ode : col or de lpixe l
, PAL_ CO LO R_ BLA- vide o.
CK , PAL_ CO LO R_ W H ITE o PAL_ CO -
LO R_ REVERSE
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ box(10, 10, 30, 30, PAL_ CO LO R_ -
W H ITE);
//página 0x31
Prototipo: void PAL_ ch ar(uns igne d ch ar x, uns igne d ch ar y, uns igne d ch ar c, uns igne d
ch ar s iz e )
Parám e tros : x : Col um na de lpixe ls upe rior iz q uie rdo de lcaracte r, de 0 to 127
y : Fil a de lcaracte r, de 0 a num e ro de l ine as -1
c : Código ASCII de lcaracte r.
s iz e : Elnibble alto e s e lm ultiplicador de l a al
tura, e lbajo m ultipl
ica e lanch o.
Tam años pre de finidos : PAL_ CH AR_ STANDARD, PAL_ CH AR_ DW IDTH ,
PAL_ CH AR_ DH EIGH T, PAL_ CH AR_ DSIZ E
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ ch ar(3, 5, 'A', PAL_ CH AR_ DSIZ E);
Prototipo: void PAL_ w rite (uns igne d ch ar l ig, uns igne d ch ar col , uns igne d ch ar *s ,
uns igne d ch ar s iz e )
Parám e tros : lig : Line a de lte xto
col: Col um na de lte xto
s : Punte ro a l a cade na de te xto (te rm inado e n NULL)
s iz e : Elnibble al to e s e lm ul
tiplicador de l a altura, e lbajo m ul tipl
ica e lanch o.
Tam años pre de finidos : PAL_ CH AR_ STANDARD, PAL_ CH AR_ DW IDTH ,
PAL_ CH AR_ DH EIGH T, PAL_ CH AR_ DSIZ E
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ w rite (0, 5, m yString, PAL_ CH AR_ STANDARD);
Prototipo: void PAL_ cons tW rite (uns igne d ch ar l ig, uns igne d ch ar col
, cons tuns igne d
ch ar *s , uns igne d ch ar s iz e )
Parám e tros : lig : Line a de lte xto
col: Col um na de lte xto
s : Punte ro a l a cade na de te xto (te rm inado e n NULL)
s iz e : Elnibbl e alto e s e lm ul tipl
icador de la altura, e lbajo m ul
tiplica e lanch o.
Tam años pre de finidos : PAL_ CH AR_ STANDARD, PAL_ CH AR_ DW IDTH ,
PAL_ CH AR_ DH EIGH T, PAL_ CH AR_ DSIZ E
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ w rite (0, 5, m yCons tantString, PAL_ CH AR_ STANDARD);
//página 0x32
Prototipo: void PAL_ picture (uns igne d ch ar x, uns igne d ch ar y, cons tuns igne d ch ar
*bm , uns igne d ch ar s x, uns igne d ch ar s y)
Parám e tros : x : colum na de lpixe ls upe rior iz q uie rdo de la im age n.
y : fil
a de lpixe ls upe rior iz q uie rdo de l
a im age n.
bm : Punte ro albitm ap e n RO M
s x : Anch o de la im age n.
s y : Alto de l
a im age n.
De vue l
ve : Nada
Re q uie re : La e je cución pre via de PAL_ init();
Eje m pl
o: PAL_ picture (0, 0, pict, 128, 128);
//página 0x33
conve rs or anal ogico digital
de lPIC. La s e ñalde vide o
s e obtie ne de l os re s is tore s
R8 y R9 . Los pul s adore s s e
e m pl e an para configurar e l
s oft.
La s e ñal de s al ida
pue de apl icars e dire ctam e n-
te a l a e ntrada de vide o
com pue s to de un aparato de
TV.
//página 0x34
/*
* file : PALde m o.c
* proje ct : PIC PALSO FTW ARE VIDEO GENERATO R DEM O
* auth or : Bruno Gavand
* com pil e r : m ik roC V6.2
* date : January 17, 2006
*
* de s cription :
* Th is program dis pl ays a cl ock , a cale ndar and th e te m pe rature on a TVs cre e n
* and s h ow s h ow to us e th e PIC PALl ibrary.
* pre s s RB7 to s k ip th e w e lcom e s cre e n
* to adjus tclock and cal e ndar, pre s s :
* RB0 to adjus tm inute
* RB1 to adjus th our
* RB2 to adjus tday
* RB3 to adjus tm onth
* RB4 to adjus tye ar
* RB5 to adjus tte m pe rature
* pre s s RB7 atth e s am e tim e to de cre m e nt.
*
* targe tde vice :
* PIC18F4620 @ 32 M h z (8 M h z crys tal+ H S PLL)
*
* Lice nce :
* Fe e lfre e to us e th is s ource code atyour ow n ris k s .
*
* h is tory :
* cre ate d january 2007
*
* s e e m ore de tail s on h ttp://w w w .m icro-e xam pl e s .com /
*/
#incl
ude "PAL_ Library.h "
#incl
ude "picture s .h "
/*************
* DEFINITIO NS
*************/
/*
* graph ic cl
ock
*/
#de fine CLK _ CENTER_ X 9 0 //ce nte r
#de fine CLK _ CENTER_ Y 60
#de fine CLK _ RADIUS_ PSS 28 //clock radius
#de fine CLK _ RADIUS_ SS 25 //s e conds
#de fine CLK _ RADIUS_ M N 20 //m inute s
#de fine CLK _ RADIUS_ H H 15 //h ours
//página 0x35
/*
* num be r ofve rticalpixe l s
* from 1 to 128 incl ude d
* th e m ore pixe ls you h ave :
* - th e l
e s s RAM you h ave
* - th e l
e s s M CU tim e you h ave
*/
#de fine PAL_ Y 128
/*
* s im pl
e tim e s tructure de finition
*/
type de fs truct
{
uns igne d ch ar s s ; //s e conds
uns igne d ch ar m n ; //m inute s
uns igne d ch ar h h ; //h ours
uns igne d ch ar m d ; //day in m onth , from 1 to 31
uns igne d ch ar w d ; //day in w e e k , m onday=0, tue s day=1, .... s unday=6
uns igne d ch ar m o ; //m onth num be r, from 1 to 12
//(and notfrom 0 to 11 as w ith unix C tim e !)
uns igne d int yy ; //ye ar Y2K com pl iant, from 189 2 to 2038
}Tim e Struct;
/********************
* RO M CO NSTANTS
********************/
/*
* m onth nam e s
*/
cons tuns igne d ch ar m onth Str[13][4] =
{
"???", "Jan", "Fe b", "M ar", "Apr", "M ay", "Jun", "Jul
", "Aug", "Se p", "O ct", "Nov", "De c"
};
/*
* day ofw e e k nam e s
*/
cons tuns igne d ch ar w Days tr[7][4] =
{
"M on", "Tue ", "W e d", "Th u", "Fri", "Sat", "Sun"
};
/********************
* RAM VARIABLES
********************/
/*
* s cre e n m e m ory m ap
//página 0x36
* do notch ange th is l
ine !
*/
uns igne d ch ar PAL_ s cre e n[PAL_ X * PAL_ Y /8] ;
/*
* ge ne ralpurpos e s tring
*/
uns igne d ch ar s tr[20] ;
uns igne d l
ong s e cO ffs e t= 0 ; //re fe re nce tim e s tam p
uns igne d l
ong ol dCtr = 0 ; //fram e counte r back up
Tim e Struct ts ; //tim e s truct
/*************************
* FUNCTIO NS
*************************/
/*
* adjus ttim e s tructm e m be r
*/
void adjus t(uns igne d ch ar *v, uns igne d ch ar m in, uns igne d ch ar m ax)
{
if(PO RTB.F7)
{
if(*v == m in) *v = m ax ;
el s e (*v)-- ;
}
el se
{
if(*v == m ax) *v = m in ;
el s e (*v)+ + ;
}
}
/*
* conve rtval ue v into s tring pointe d to by p, l
e ading z e ro bl
ank s ifblk is s e t
*/
void ch ar2s tr(uns igne d ch ar *p, uns igne d ch ar v, uns igne d ch ar blk)
{
*p = v /10 + '0' ;
if(blk & & (*p == '0'))
{
*p = ' ' ;
}
p+ + ;
*p = v % 10 + '0' ;
//página 0x37
p+ + ;
*p = 0 ;
}
/*
* draw s cre e n w ith de coration iffullis s e t, us ing vide o m ode m ode
*/
void draw Scre e n(uns igne d ch ar ful l
, uns igne d ch ar m ode )
{
s tatic uns igne d ch ar os x = CLK _ CENTER_ X, os y = CLK _ CENTER_ Y,
om x = CLK _ CENTER_ X, om y = CLK _ CENTER_ Y,
oh x = CLK _ CENTER_ X, oh y = CLK _ CENTER_ Y ;
uns igne d int i ;
int t;
uns igne d ch ar s s ;
uns igne d ch ar s x, s y, m x, m y, h x, h y ;
PAL_ control
(PAL_ CNTL_ START, m ode ) ;
if(ful
l) //draw ful ls cre e n w ith de coration
{
PAL_ fill
(0) ;
PAL_ cons tW rite ( 0, 0, "\xC9 \xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\
xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBB", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 1, 0, "\xBA PALLIBRARY DEM O \xBA", PAL_ CH AR_ STANDARD) ;
PAL_ cons tW rite ( 2, 0, "\xC8\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\
xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xCD\xBC", PAL_ CH AR_ STANDARD) ;
//página 0x38
PAL_ cons tW rite (12, 17, "\xf8C", 0x31) ;
for(s s = 0 ;s s < 60 ;s s + + )
{
s x = CLK _ CENTER_ X - (cos E3(9 0 + 6 * s s ) * CLK _ RADIUS_ PSS) /1000 ;
s y = CLK _ CENTER_ Y - (s inE3(9 0 + 6 * s s ) * CLK _ RADIUS_ PSS) /1000 ;
PAL_ s e tPixe l
(s x, s y, PAL_ CO LO R_ W H ITE) ;
if((s s % 5) == 0)
{
PAL_ s e tPixe l
(s x + 1, s y, PAL_ CO LO R_ W H ITE) ;
PAL_ s e tPixe l
(s x - 1, s y, PAL_ CO LO R_ W H ITE) ;
PAL_ s e tPixe l
(s x, s y + 1, PAL_ CO LO R_ W H ITE) ;
PAL_ s e tPixe l
(s x, s y - 1, PAL_ CO LO R_ W H ITE) ;
}
}
}
ol
dCtr = PAL_ fram e Ctr + 24 ; //pre pare ol
dCtr for ne xtupdate tim e
/*
* draw anal
og cl
ock
*/
s x = CLK _ CENTER_ X - (cos E3(9 0 + 6 * ts .s s ) * CLK _ RADIUS_ SS) /1000 ;
s y = CLK _ CENTER_ Y - (s inE3(9 0 + 6 * ts .s s ) * CLK _ RADIUS_ SS) /1000 ;
if((h x != oh x) || (h y != oh y))
{
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, oh x, oh y,
PAL_ CO LO R_ BLACK ) ;
}
if((m x != om x) || (m y != om y))
{
//página 0x39
PAL_ l
ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, om x, om y, PAL_ CO LO R_ BLACK ) ;
}
if((s x != os x) || (s y != os y))
{
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, os x, os y,
PAL_ CO LO R_ BLACK ) ;
}
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, h x, h y, PAL_ CO LO R_ W H ITE) ;
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, m x, m y, PAL_ CO LO R_ W H ITE) ;
PAL_ l ine (CLK _ CENTER_ X, CLK _ CENTER_ Y, s x, s y, PAL_ CO LO R_ W H ITE) ;
/*
* printdate and tim e
*/
ch ar2s tr(s tr, ts .s s , 0) ;
PAL_ w rite (4, 7, s tr, PAL_ CH AR_ DH EIGH T) ;
/*
* s ave old val
ue for fas tanal
og clock cl e aning atne xtupdate
*/
os x = s x ;
os y = s y ;
om x = m x ;
om y = m y ;
oh x = h x ;
oh y = h y ;
t= de gRe f- Adc_ Re ad(4) ; //re ad te m pe rature s e ns or
/*
* adjus tl
im its
*/
//página 0x3A
if(t< -9 9 )
{
t= -9 9 ;
}
if(t> 9 9 )
{
t= 9 9 ;
}
/*
* ave rage val ue s
*/
de gH is to[tIdx] = t;
tIdx+ + ;
if(tIdx == DEG_ NBH ISTO )
{
tIdx = 0 ;
}
t= 0 ;
for(i = 0 ;i < DEG_ NBH ISTO ;i+ + )
{
t+ = de gH is to[i] ;
}
t/= DEG_ NBH ISTO ;
/*
* printte m pe rature
*/
if(t< 0)
{
i = -t;
PAL_ cons tW rite (12, 11, "-", 0x31) ;
}
el se
{
i = t;
PAL_ cons tW rite (12, 11, " ", 0x31) ;
}
ch ar2s tr(s tr, i, 1) ;
PAL_ w rite (12, 12, s tr, 0x32) ;
}
//re s tore vide o re nde ring ifitw as s toppe d
PAL_ control (PAL_ CNTL_ START, PAL_ CNTL_ RENDER) ;
}
/*
* inte rrupts e rvice routine
*/
void inte rrupt(void)
{
//página 0x3B
/*
* do PALs tuff
*/
PAL_ ISR() ; //l
ibrary cal
l
}
/*
* m ain program
*/
void m ain(void)
{
uns igne d ch ar i ;
/*
* I/O configuration
*/
ADCO N1 = 0x0f;
TRISA = 0xff;
PO RTA = 0 ;
TRISB = 0xff;
PO RTB = 0 ;
TRISC = 0xff;
PO RTC = 0 ;
TRISD = 0 ;
PO RTD = 0 ;
TRISE = 0 ;
PO RTE = 0 ;
/*
* de faulttim e and date
*/
ts .s s = 0 ;
ts .m n = 0 ;
ts .h h = 12 ;
ts .m d = 1 ;
ts .m o = 1 ;
ts .yy = 2007 ;
/*
* s tartvide o and dis pl
ay firs ts cre e n
*/
//página 0x3C
PAL_ init(PAL_ Y) ; //initPALl ibrary
PAL_ fill(0) ; //cle ar s cre e n
PAL_ picture (0, 0, l
ogo_ bm p, 128, 128) ; //paintpicture
PAL_ control (PAL_ CNTL_ START, PAL_ CNTL_ RENDER) ; //s tartvide o and re nde ring
i=0;
w h il
e (PO RTB == 0) //w aitfor a k e y to be pre s s e d
{
/*
* ch ange borde r color tw o tim e s pe r s e cond
*/
if(PAL_ fram e Ctr > 12)
{
PAL_ s e tBorde r(i) ;
i = !i ;
PAL_ fram e Ctr = 0 ;
}
}
PAL_ s e tBorde r(PAL_ CO LO R_ BLACK ) ;//cl e ar borde r
for(;;)
{
if(PO RTB & 0b1111111) //a k e y is pre s s e d
{
Tim e _ Epoch ToDate (s e cO ffs e t+ PAL_ fram e Ctr /25, & ts ) ;
/*
* cal
e ndar s e ttings
*/
if(PO RTB.F0)
{
adjus t(& ts .m n, 0, 59 ) ;
ts .s s = 0 ;
}
if(PO RTB.F1)
{
adjus t(& ts .h h , 0, 59 ) ;
ts .s s = 0 ;
}
if(PO RTB.F2)
{
adjus t(& ts .m d, 1, 31) ;
}
if(PO RTB.F3)
{
adjus t(& ts .m o, 1, 12) ;
}
if(PO RTB.F4)
//página 0x3D
{
if(PO RTB.F7) ts .yy-- ;e l
s e ts .yy+ + ;
}
/*
* te m pe rature cal ibration
*/
if(PO RTB.F5)
{
if(PO RTB.F7)
{
de gRe f-- ;
EEPRO M _ w rite (0, de gre f) ;
}
else
{
de gRe f+ + ;
EEPRO M _ w rite (0, de gre f) ;
}
}
w h il
e (PO RTB & 0b1111111) ;//w aitfor th e k e y to be re l
e as e d
//página 0x3E