Está en la página 1de 16

datoaguardar,';

La ran de ello es >ue si el datoaguardar >ue es una varia?le ee;rom tiene un valor inicial
ma=or a 9: la hacemos :0 = esto suceder<a una sola ve0 =a >ue cuando se guarde un dato el
dato estar entre : = #% Pero un microcontrolador nuevo tiene en la memoria ee;rom ;uros
:Aff en todas las localidades0 entonces la ;rimera ve har >ue ese dato de :Aff se haga :%
Im;ortante% Si dentro de un ;rograma utilia una varia?le ee;rom como una varia?le +AM
;uede suceder >ue daCe esa localidad de memoria ee;rom0 =a >ue una ee;rom tiene una
vida Btil de 9::0::: ciclos de escritura = lectura0 ;ero si usa esa varia?le ee;rom como una
varia?le +AM ;uede suceder >ue en cuestin de segundos sucedan esos 9::0::: ciclos de
escritura = lectura ;or>ue un ;rograma en el microcontrolador eGecuta el cdigo miles de
veces en un segundo0 entonces al reescri?ir esa varia?le en el ;rograma miles de veces en
un segundo se va a ca?ar la vida Btil de la localidad de memoria% En el ;rograma vemos >ue
la ee;rom slo se escri?e cuando se ;resiona un ?otn%
'= C$nfi6*)a(i2n de& C$n1e)tid$) de Ana&26i($ a Di6ita& FADCG
Las caracter<sticas del ADC >ue tiene el microcontrolador A,+ son:
Tiene D canales con 9: ?its de resolucin
Ca;a de o?tener 9F0::: muestras ;or segundo a la mAima resolucin
,oltaGe de referencia internos de 9%9,
,oltaGe de referencia eAterno de : a ,cc del ADC
Ca;acidad de detener el CP* ;ara minimiar el ruido = meGorar el resultado de la
conversin
'='8 F*n(i$na%ient$ de *n ADC
*n ADC convierte una seCal analgica a un dato digital de manera lineal0 ;ara ello es
necesario identificar tres as;ectos im;ortantes = @stos son: el voltaGe de referencia Q,refS0 el
nBmero de ?its = si es uni;olar o ?i;olar el ADC%
'='8'8 C$n1e).i2n *ni5$&a)
En la conversin uni;olar el voltaGe >ue se introduce a los canales del convertidor es
solamente ;ositivo0 = ;udiendo ser la conversin del ADC de 9: ?its o de 8 ?its0 si es de 9:
?its significa >ue identifica hasta "
9:
com?inaciones >ue son 9:"IN si es de 8 ?its tiene "
8
com?inaciones esto es "FD com?inaciones% (?viamente entre ms ?its sean es meGor el
ADC aun>ue en ocasiones no es necesario una resolucin tan elevada% El voltaGe de
referencia es el valor con el >ue se com;arar el voltaGe de entrada analgico = con ?ase en
ello se determina la com?inacin de salida% La forma de o?tener la com?inacin digital si
est configurado el ADC en 9: ?its es:
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
($n1e).i2nPFVinM84?GQV)ef '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''e(F'8G
Donde ,in es el voltaGe >ue se a;lica0 vref es el voltaGe de referencia = conversin es el
valor digital%
Por eGem;lo si V)efP> = el vin >ue va a medir es de '> dar como salida F9" segBn la
ecuacin "%9N si ahora el vin es de 9 volt la conversin >ue dar ser de ":I%

En el caso de >ue se seleccione una conversin de 8 ?its0 la frmula a utiliar es:
($n1e).i2nPFVinM>=GQV)ef ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''e(F'G
Sustitu=endo en la ec "%" los valores de vinV"%F el resultado de la conversin es 9"80 si el
vinV9el resultado de la conversin ser F9
En el circuito integrado identifi>uemos las terminales asociadas al ADC
Fi6*)a '8@ Pine. de& %i()$($nt)$&ad$) ATMEGA?3
En la figura "%9E vemos >ue en las terminales "" = ": dicen 2'D = A,CC0 ests son las
t@rminales de tierra = alimentacin del ;erif@rico del convertidor de analgico a digital%
'ormalmente los microcontroladores de otros fa?ricantes el ADC se alimenta con el mismo
voltaGe del microcontrolador0 ;ero en los de ATMEL son alimentados ;or se;arado ;ara
disminuir los efectos del ruido% Aun>ue en nuestro caso = ;ara los ;rogramas >ue vamos a
realiar el A,CC = ,CC los conectaremos Guntos = los 2'D tam?i@n sern conectados
Guntos% Pero recuerde >ue si en su a;licacin re>uiere de una conversin ms eAacta ;uede
alimentar el microcontrolador = el ;erif@rico del ADC ;or se;arado% Solamente tenga en
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
cuenta >ue si los va alimentar ;or se;arado el voltaGe del ;erif@rico del ADC no de?e ser
ma=or al del microcontrolador0 ;or eGem;lo si el microcontrolador lo va alimentar con dos
;ilas = el voltaGe es de E ,olts0 el ADC de?e ser alimentado con E volts como mAimo
tam?i@n%
El vref >ue se encuentra en las ecuaciones "%9 = "%" ;uede ser de tres ti;os:
9% ,refV,cc del microcontrolador0 en este caso Aref no se conecta Q;in "9S0 vea la
figura "%9I el circuito de en medio%
"% ,refVAref Q;in "9S% En este caso se tiene una referencia eAterna = ;uede ser
cual>uier voltaGe0 siem;re = cuando no sea su;erior al ,cc del microcontrolador%
Este se eGem;lifica en el ;rimer diagrama de la figura "%9I%
E% ,refV9%9 ,olts interno0 se de?e conectar un ca;acitor eAterno de :%9uf del ti;o gota
de tantalo = se muestra en el tercer circuito de la figura "%9I%
)igura "%9I coneAin de las terminales del ADC segBn la seleccin del ,ref
Todos los casos anteriores se configuran con el codevision con clicHs%
En las ecuaciones "%9 = "%" se tiene un t@rmino llamado Vin >ue es el voltaGe de entrada0 es
decir0 el voltaGe >ue ser convertido a una com?inacin digital0 segBn su ;ro;orcin con
V)ef% Este Vin se a;lica en los canales del ADC >ue se numeran desde ADC: hasta ADCF
Q;ines del "E al "8S0 entonces tenemos >ue esos ;ines tienen varias funciones =a sean como
;ines de entrada o salida0 o como entradas del ADC% Entonces si el ;in se configura como
entrada del ADC =a no ;uede funcionar como entradaJsalida digital0 esto es >ue las
funciones son eAclu=entes%
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
Re.*%en de& ADC
En este ;erif@rico ;odemos tener:
Conversin uni;olar donde se a;lica a la entrada analgica un valor de voltaGe
;ositivo >ue ;uede ir desde : hasta ,ref%
o Puede ser la conversin de 8 ?its donde el resultado est dado ;or:
($n1e).i2nPFVinM>=GQV)ef
o Puede ser la conversin de 9: ?its donde el resultado est dado ;or:
($n1e).i2nPFVinM84?GQV)ef
El ,ref ;uede ser el voltaGe del microcontrolador0 ;ueder ser uno eAterno conectado
a la terminal Aref o uno interno de 9%9 ,olts%
El ,in es el voltaGe analgico >ue ser convertido a un com?inacin digital0 = ese
vin se a;lica en cual>uiera de los canales ADC: hasta ADCF
El ;erif@rcio del ADC se alimenta ;or se;arado0 ;ero no ;uede ser ma=or al ,cc del
microcontrolador% Aun>ue ;ara estos eGem;los conecatremos las terminales de 2'D
= el ,cc lo conectaremos al Avcc%
Las configuraciones descritas anteriormente se realian con clicHs en el codevision0
;or lo >ue no es necesario a;render ningBn registro o ?it de @stos ;ara su
configuracin%
Im;ortante% Si va a utiliar un canal ;ara hacer la conversin tenga la ;recaucin de
configurar ese ;in como entrada% 7a >ue en ese canal va a;licar voltaGe = no ;uede estar
configurado el ;in como salida0 =a >ue de ser as< se ;odr<a daCar el ;in% Por eGem;lo si va
utiliar el canal : del adc >ue es el ;in A: de?er configurar ese ;in como entrada%
Im;ortante El Avcc no ;uede ser ma=or al ,cc0 ;or eso con@ctelos Guntos
Im;ortante El Aref no ;uede ser ma=or al ,cc del microcontrolador%
Im;ortante 'o a;li>ue ,in ma=ores a Aref o a ,cc ;ara evitar daCos en el ;in del ADC%
P)$6)a%a !' .aga una conversin en 8 ?its so?re el canal : del ADC = muestre el
resultado en leds >ue se conectarn en el Puerto 3% Configure como ,ref el A,cc del
microcontrolador%
Ta?la "%9 Canal = ;in del ADC
Canal Pin
: ADC: "E C:
9 ADC9 "I C9
" ADC" "F C"
E ADCE "D CE
I ADCI "L CI
F ADCF "8 CF
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
)igura "%9F ConeAin ;ara el ;rograma #
Con el code&iard se hace la configuracin del ADC a trav@s de sim;les clicHs0 lo Bnico
>ue de?emos hacer en el ;rograma es leer el valor de la conversin del canal >ue estemos
usando a trav@s de la siguiente funcin:
variable,read:adc Fn-mero:de:canalG;
Por eGem;lo si desear utiliar el canal E0 >ue es el ;in "D de?er colocar :
variable,read:adcF%G;
+ecuerde tam?i@n >ue el ADC ;uede entregar la conversin en 8 o 9: ?its0 si selecciona
conversin en 8 ?its0 entonces la variable de?er definirse como unsigned char variable; es
decir ti;o char de 8 ?its0 ;ero si se selecciona una conversin en 9: ?its de?er declarar la
variable como unsigned int variable0 =a >ue el valor de la conversin ocu;a 9: ?its%
El nom?re >ue le di a la varia?le donde se guardar el resultado fue variable0 ;ero ;uede
darle cual>uier nom?re%
Im;ortante% La funcin readdadcQS slo ;uede utiliarse si dentro del codevision se ha?ilit
el ADC0 =a >ue si lo usa en cual>uiera de los otros ;rogramas >ue se han realiado = >ue no
han unicialiado el ADC marcar error%
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
,ea el videod;# donde se muestra la forma de inicialiar el ADC%
/
This program Ras produced b$ the
CodeSi+ardA=> =*.().Qa Evaluation
Automatic Orogram Venerator
W Cop$right *PP6I(''Q Oavel Xaiduc# XO Kn1oTech s.r.l.
httpY//RRR.hpin1otech.com
Oro&ect Y
=ersion Y
Cate Y *)/'P/(''6
Author Y ZreeRare# 1or evaluation and nonIcommercial use onl$
Compan$ Y
CommentsY
Chip t$pe Y ATmega.6
Cloc/ 1re!uenc$ Y *#'''''' MX+
Memor$ model Y ?mall
External ?>AM si+e Y '
Cata ?tac/ si+e Y *(6
/
Tinclude Emega.6.hM
Tinclude Edela$.hM
unsigned char x;
Tde1ine ACC:=>EZ:T]OE 'x0'
// >ead the 6 most signi1icant bits
// o1 the AC conversion result
unsigned char read:adcFunsigned char adc:inputG
5
ACM^_,adc:input N FACC:=>EZ:T]OE D 'x11G;
// Cela$ needed 1or the stabili+ation o1 the ACC input voltage
dela$:usF*'G;
// ?tart the AC conversion
ACC?>AN,'x.';
// Sait 1or the AC conversion to complete
Rhile FFACC?>A D 'x*'G,,'G;
ACC?>AN,'x*';
return ACCX;
7
// Ceclare $our global variables here
void mainFvoidG
5
// Ceclare $our local variables here
// Cr$stal Uscillator division 1actorY 6
Tpragma optsi+eI
CL[O>,'x6';
CL[O>,'x'%;
Ti1de1 :UOTKMK\E:?K\E:
Tpragma optsi+eJ
Tendi1
// Knput/Uutput Oorts initiali+ation
// Oort B initiali+ation
// ZuncQ,Uut Zunc0,Uut Zunc),Uut Zunc.,Uut Zunc%,Uut Zunc(,Uut Zunc*,Uut Zunc',Uut
// ?tateQ,' ?tate0,' ?tate),' ?tate.,' ?tate%,' ?tate(,' ?tate*,' ?tate','
OU>TB,'x'';
CC>B,'xZZ;
// Oort C initiali+ation
// Zunc0,Kn Zunc),Kn Zunc.,Kn Zunc%,Kn Zunc(,Kn Zunc*,Kn Zunc',Kn
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
// ?tate0,T ?tate),T ?tate.,T ?tate%,T ?tate(,T ?tate*,T ?tate',T
OU>TC,'x'';
CC>C,'x'';
// Oort C initiali+ation
// ZuncQ,Kn Zunc0,Kn Zunc),Kn Zunc.,Kn Zunc%,Kn Zunc(,Kn Zunc*,Kn Zunc',Kn
// ?tateQ,T ?tate0,T ?tate),T ?tate.,T ?tate%,T ?tate(,T ?tate*,T ?tate',T
OU>TC,'x'';
CC>C,'x'';
// Timer/Counter ' initiali+ation
// Cloc/ sourceY ?$stem Cloc/
// Cloc/ valueY Timer ' ?topped
// ModeY Normal top,ZZh
// UC'A outputY Cisconnected
// UC'B outputY Cisconnected
TCC>'A,'x'';
TCC>'B,'x'';
TCNT','x'';
UC>'A,'x'';
UC>'B,'x'';
// Timer/Counter * initiali+ation
// Cloc/ sourceY ?$stem Cloc/
// Cloc/ valueY Timer * ?topped
// ModeY Normal top,ZZZZh
// UC*A outputY Ciscon.
// UC*B outputY Ciscon.
// Noise CancelerY U11
// Knput Capture on Zalling Edge
// Timer * Uver1loR KnterruptY U11
// Knput Capture KnterruptY U11
// Compare A Match KnterruptY U11
// Compare B Match KnterruptY U11
TCC>*A,'x'';
TCC>*B,'x'';
TCNT*X,'x'';
TCNT*L,'x'';
KC>*X,'x'';
KC>*L,'x'';
UC>*AX,'x'';
UC>*AL,'x'';
UC>*BX,'x'';
UC>*BL,'x'';
// Timer/Counter ( initiali+ation
// Cloc/ sourceY ?$stem Cloc/
// Cloc/ valueY Timer ( ?topped
// ModeY Normal top,ZZh
// UC(A outputY Cisconnected
// UC(B outputY Cisconnected
A??>,'x'';
TCC>(A,'x'';
TCC>(B,'x'';
TCNT(,'x'';
UC>(A,'x'';
UC>(B,'x'';
// External KnterruptFsG initiali+ation
// KNT'Y U11
// KNT*Y U11
// Knterrupt on an$ change on pins OCKNT'IQY U11
// Knterrupt on an$ change on pins OCKNT6I*.Y U11
// Knterrupt on an$ change on pins OCKNT*0I(%Y U11
EKC>A,'x'';
EKM?[,'x'';
OCKC>,'x'';
// Timer/Counter ' KnterruptFsG initiali+ation
TKM?[','x'';
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
// Timer/Counter * KnterruptFsG initiali+ation
TKM?[*,'x'';
// Timer/Counter ( KnterruptFsG initiali+ation
TKM?[(,'x'';
// Analog Comparator initiali+ation
// Analog ComparatorY U11
// Analog Comparator Knput Capture b$ Timer/Counter *Y U11
AC?>,'x6';
ACC?>B,'x'';
// ACC initiali+ation
// ACC Cloc/ 1re!uenc$Y )''#''' /X+
// ACC =oltage >e1erenceY A=CC pin
// ACC Auto Trigger ?ourceY None
// Unl$ the 6 most signi1icant bits o1
// the AC conversion result are used
// Cigital input bu11ers on ACC'Y Un# ACC*Y Un# ACC(Y Un# ACC%Y Un
// ACC.Y Un# ACC)Y Un
CKC>','x'';
ACM^_,ACC:=>EZ:T]OE D 'x11;
ACC?>A,'x6*;
Rhile F*G
5
x,read:adcF'G; //?e hace la conversin sobre el canal ' del ACC
OU>TB,x; //?e despliega en el puerto B el valor digital
// Olace $our code here
7;
7
El ;rograma # hace una conversin so?re el canal :0 ;ero el resultado >ue da0 no es en
voltaGe sino en un cdigo ?inario% Si ,inV: volts la conversin da :?::::0::::N si vinV"%F
volts la conversin da :?9:::0:::: Q9"8 decimalSN si es F ,oltsV:?999909999 Q"FF
decimalS% Es decir nos convierte a una ;ro;orcin ?inaria >ue luego de?emos inter;retar0
;ero ese resultado lo ;odemos convertir a voltaGe a trav@s de una regla de E%
Si ,inVF da como resultado :Aff0 es decir "FF0 Pero deseamos >ue muestre un (2di6$
n*e1$ >ue sea F: Q>ue ser<a F%: ,oltsS% Entonces se resuleve as<:
C2di6$ n*e1$VConversinKF:Jconversin mAima
'ote0 si ,inVF ,olts0 la conversin dar :?999909999 >ue es "FF0 >ue sustitu=endo en la ec
9%E da:
Cdigo nuevoV"FFKF:J"FFVF: >ue ;odemos inter;retar como F%: ,olts%
Si vinV"%F ,olts0 la conversin dar :?9:::0:::: >ue es 9"8
Cdigo nuevoV9"8KF:J"FF V"F >ue ;odemos inter;retar como "%F ,olts%
Entonces la ecuacin 9%E >ueda:
(2di6$ n*e1$Vconversin del ADC K cdigo >ue deseamos%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ecQ"%ES
conversindMAima%
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
EGem;lo su;onga >ue conectamos un sensor de tem;eratura >ue da F volts cuando ha=
9::iC0 entonces ahora deseamos mostrar el resultado en grados cent<grados0 no en voltaGe0
as< >ue sustitu=endo en la ecuacin 9%E >ueda:
Cdigo nuevoVConversin del ADCK9::JConversin MAima Q"FF ;ara 8 ?itsS
Si conversinV"FF0 el cdigo nuevoV9::iC
Si la conversin del ADCV9"80 el cdigo nuevo ser 9"8K9::J"FFVF:0 el cdigo
nuevoVF:iC%
Pero ese cdigo nuevo de?emos se;ararlo en digitos ;ara ;oderlo des;legar en el dis;la= de
L segmentos o en una LCD% Esto se realia en el ;rograma 9:%
P)$6)a%a 84' Ha6a *na ($n1e).i2n de 3 -it. en e& (ana& 8 : %*e.t)e e& )e.*&tad$ de&
1$&atBe en d$. di.5&a:. E*e .e ($ne(ta);n a& P*e)t$ B' E& V)efPV((P> 1$&t.' E& 5in C$
($nt)$&a); e& di.5&a: de *nidade. : e& C8 e& de de(ena.' Se *.a); e& (ana& de& ADC
5$) d$nde .e a5&i(a); *n 1$&taBe 1a)ia-&e de ent)e 4 : > 1$&t.9 e& (*a& .e); de.5&e6ad$
en &$. d$. di.5&a:. de.de 4'4 #a.ta >'4
*sando la ecuacin "%E tenemos >ue la conversin mAima V"FF0 el cdigo >ue deseamos
con esa conversin mAimaVF: ;ara mostrar F%: ,olts%
(2di6$ n*e1$V conversin del ADC K cdigo >ue deseamos
Conversin MAima
De?emos hacer lo siguiente en el ;rograma:
Leer la conversin del canal
x,read:adcF*G;
codigonuevo,x)'/());
Im;ortante% x es ti;o char0 se multi;lica ;or F: ;ero ese resultado tem;oral ocu;a ms de 8
?its% Para evitar esto se hace el casting0 es decir0 se le dice al com;ilador el resultado de
x)'/()) da como resultado un char0 =a >ue no so?re;asa a "FF0 ;ero lo o?liga a >ue en las
o;eraciones intermedias Qso?re todo en la multi;licacinS se guarde el resultado en algBn
lugar =a >ue ocu;a ms de 8 ?its% El casting se hace codigonuevo,FcharGx)'/())
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
EL USO DEL CASTING
EBe%5&$ 8'
Su;onga >ue tiene x,$JRJ+N = todas son ti;o char0 en ese caso no eAiste ;ro?lema =a >ue
si $JRJ+ da como resultado un nBmero menor a "FF se ;odr guardar en A%
EBe%5&$ '
x es ti;o int; $#R $ + son ti;o char% 7 se escri?e x,$JRJ+N Pero se sa?e >ue $JRJ+ van a
dar mas de "FF0 = >ue ca?en en x =a >ue esta es ti;o int% Pero lo de la derecha $JRJ+ est
declarado como char0 entonces cuando la suma d@ ms de "FF jdnde >uedan esas
o;eracionesk Entonces a>u< si va eAistir un ;ro?lema ;or>ue x,int = $JRJ+ son ti;o char
cu=a suma da mas de 8 ?its = >ue ca?e en x0 ;ero en las sumas ;arciales las varia?les son
char = estas no ;ueden guardar mas de 8 ?its0 entonces ha= >ue hacer un casting0 o?ligando
al com;ilador a decirle todas son ti;o char0 ;ero el resultado es ti;o int ;ara >ue lo guarde
tem;oralmente en algBn lugar ;ara des;u@s asignarlo a x%
x,FintG $JRJ+; //Esto $a da un resultado correcto
x,$JRJ+ //Car"a un resultado errneo $a !ue $JRJ+ da mas de 6 bits $ estas
variables no pueden mane&ar m;s de 6 bits
Im;ortante% Podemos evitar hacer clculos de las o;eraciones intermedias ;ara ver si
hacemos o no el casting0 = esto deGarlo al com;ilador% Esta o;cin se selecciona en el
codevision en ;roGect!configure!C Com;iler = finalmente dando clicH en ;romote char to
int como se muestra en la figura "%9F% Con la seleccin de la casilla b;romote char to intc le
estamos indicando al com;ilador >ue cuando ocu;e hacer >ue la varia?le la haga ms
grande lo haga @l mismo ;ara evitarnos ;ro?lemas de casting%
)igura "%9F .a?ilitacin de cam?io detamaCo de varia?les ;ara evitar el casting
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
Con lo anterior le estamos indicando al com;ilador si la o;eracin intermedia ocu;a el
char un es;acio de un int >ue lo genere ;ara evitar errores = as< =a nos olvidamos del
casting%
Con las dos instrucciones anteriores =a tenemos re;resentado en voltaGe la conversin0 ;ero
de?emos se;ararlo en dos digitos0 esto es calcularle la cantidad de decenas = las unidades%
Continuando con la eA;licacin del ;rograma0 si =a se calcul el cdigo nuevo0 ahora
de?emos o?tener los dos digitos a des;legar =a >ue el F: no se ;uede des;legar en un
dis;la=0 de?emos o?tener los dos digitos0 as< >ue:
decenas,codigonuevo/*';
unidades,codigonuevo@*';
+ecuerde >ue Z es la o;eracin mdulo = >ue da como resultado el residuo% Su;onga >ue
el cdigonuevoVI80 es decir I%8 ,olts
Entonces decenasVI8J9:VI
7 unidadesVI8Z9:V8 Q>ue es el residuoS
7 las decenas = unidades los mandamos des;legar en dos dis;la=s de L segmentos%
Im;ortante% En cada ;ro=ecto nuevo >ue hagamos de?emos seleccionar la casilla de
;romote char to int%
Configuracin: P(+T3 de salidas ;ara conectar los dis;la=s% C: = C9 salidas >ue sern
usados ;ara maneGar los dos transistores: el >ue controla el dis;la= de unidades0 = el >ue
controla el dis;la= de decenas% El ;in C" como entrada >ue es tam?i@n el canal " del ADC
QADC"S%
,ea el videod;9: donde se muestra la inicialiacin del microcontrolador Gunto con el
ADC%
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
El siguiente listado es el ;rograma >ue gener el code&iard = lo >ue est en aul es lo >ue
de?er agregar al ;rograma >ue usted haga%
/
This program Ras produced b$ the
CodeSi+ardA=> =(.'%.0 Evaluation
Automatic Orogram Venerator
W Cop$right *PP6I(''6 Oavel Xaiduc# XO Kn1oTech s.r.l.
httpY//RRR.hpin1otech.com
Oro&ect Y
=ersion Y
Cate Y ')/*'/(''6
Author Y ZreeRare# 1or evaluation and nonIcommercial use onl$
Compan$ Y
CommentsY
Chip t$pe Y ATmega.6
Cloc/ 1re!uenc$ Y *#'''''' MX+
Memor$ model Y ?mall
External >AM si+e Y '
Cata ?tac/ si+e Y *(6
/
Tinclude Emega.6.hM
Tinclude Edela$.hM
unsigned char var#codigonuevo#unidades#decenas;
const char tablaQsegmentos 3*'4,5'x%1#'x'0#'x)b#'x.1#'x00#'x0d#'xQc#'x'Q#'xQ1#'x017;
void despliegaFvoidG; //?e va a utili+ar una 1uncin !ue se llama despliega sin par;metros
Tde1ine ACC:=>EZ:T]OE 'x0'
Tde1ine tru OKNC.'
Tde1ine trd OKNC.*

Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
// >ead the 6 most signi1icant bits
// o1 the AC conversion result
unsigned char read:adcFunsigned char adc:inputG
5
ACM^_,adc:input N FACC:=>EZ:T]OE D 'x11G;
// Cela$ needed 1or the stabili+ation o1 the ACC input voltage
dela$:usF*'G;
// ?tart the AC conversion
ACC?>AN,'x.';
// Sait 1or the AC conversion to complete
Rhile FFACC?>A D 'x*'G,,'G;
ACC?>AN,'x*';
return ACCX;
7
// Ceclare $our global variables here
void mainFvoidG
5
// Ceclare $our local variables here
// Cr$stal Uscillator division 1actorY 6
Tpragma optsi+eI
CL[O>,'x6';
CL[O>,'x'%;
Ti1de1 :UOTKMK\E:?K\E:
Tpragma optsi+eJ
Tendi1
// Knput/Uutput Oorts initiali+ation
// Oort B initiali+ation
// ZuncQ,Uut Zunc0,Uut Zunc),Uut Zunc.,Uut Zunc%,Uut Zunc(,Uut Zunc*,Uut Zunc',Uut
// ?tateQ,' ?tate0,' ?tate),' ?tate.,' ?tate%,' ?tate(,' ?tate*,' ?tate','
OU>TB,'x'';
CC>B,'xZZ;
// Oort C initiali+ation
// Zunc0,Kn Zunc),Kn Zunc.,Kn Zunc%,Kn Zunc(,Kn Zunc*,Uut Zunc',Uut
// ?tate0,T ?tate),T ?tate.,T ?tate%,T ?tate(,T ?tate*,' ?tate','
OU>TC,'x'';
CC>C,'x'%;
// Oort C initiali+ation
// ZuncQ,Kn Zunc0,Kn Zunc),Kn Zunc.,Kn Zunc%,Kn Zunc(,Kn Zunc*,Kn Zunc',Kn
// ?tateQ,T ?tate0,T ?tate),T ?tate.,T ?tate%,T ?tate(,T ?tate*,T ?tate',T
OU>TC,'x'';
CC>C,'x'';
// Timer/Counter ' initiali+ation
// Cloc/ sourceY ?$stem Cloc/
// Cloc/ valueY Timer ' ?topped
// ModeY Normal top,ZZh
// UC'A outputY Cisconnected
// UC'B outputY Cisconnected
TCC>'A,'x'';
TCC>'B,'x'';
TCNT','x'';
UC>'A,'x'';
UC>'B,'x'';
// Timer/Counter * initiali+ation
// Cloc/ sourceY ?$stem Cloc/
// Cloc/ valueY Timer * ?topped
// ModeY Normal top,ZZZZh
// UC*A outputY Ciscon.
// UC*B outputY Ciscon.
// Noise CancelerY U11
// Knput Capture on Zalling Edge
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
// Timer * Uver1loR KnterruptY U11
// Knput Capture KnterruptY U11
// Compare A Match KnterruptY U11
// Compare B Match KnterruptY U11
TCC>*A,'x'';
TCC>*B,'x'';
TCNT*X,'x'';
TCNT*L,'x'';
KC>*X,'x'';
KC>*L,'x'';
UC>*AX,'x'';
UC>*AL,'x'';
UC>*BX,'x'';
UC>*BL,'x'';
// Timer/Counter ( initiali+ation
// Cloc/ sourceY ?$stem Cloc/
// Cloc/ valueY Timer ( ?topped
// ModeY Normal top,ZZh
// UC(A outputY Cisconnected
// UC(B outputY Cisconnected
A??>,'x'';
TCC>(A,'x'';
TCC>(B,'x'';
TCNT(,'x'';
UC>(A,'x'';
UC>(B,'x'';
// External KnterruptFsG initiali+ation
// KNT'Y U11
// KNT*Y U11
// Knterrupt on an$ change on pins OCKNT'IQY U11
// Knterrupt on an$ change on pins OCKNT6I*.Y U11
// Knterrupt on an$ change on pins OCKNT*0I(%Y U11
EKC>A,'x'';
EKM?[,'x'';
OCKC>,'x'';
// Timer/Counter ' KnterruptFsG initiali+ation
TKM?[','x'';
// Timer/Counter * KnterruptFsG initiali+ation
TKM?[*,'x'';
// Timer/Counter ( KnterruptFsG initiali+ation
TKM?[(,'x'';
// Analog Comparator initiali+ation
// Analog ComparatorY U11
// Analog Comparator Knput Capture b$ Timer/Counter *Y U11
AC?>,'x6';
ACC?>B,'x'';
// ACC initiali+ation
// ACC Cloc/ 1re!uenc$Y )''#''' /X+
// ACC =oltage >e1erenceY A=CC pin
// ACC Auto Trigger ?ourceY None
// Unl$ the 6 most signi1icant bits o1
// the AC conversion result are used
// Cigital input bu11ers on ACC'Y Un# ACC*Y Un# ACC(Y Un# ACC%Y Un
// ACC.Y Un# ACC)Y Un
CKC>','x'';
ACM^_,ACC:=>EZ:T]OE D 'x11;
ACC?>A,'x6*;
Rhile F*G
5

var,read:adcF(G; //?e lee el valor del Canal ( del ACC FOKN C(G
codigonuevo,)'())/var; //Convierte el valor del ACC a un cdigo nuevo en volta&e
decenas,codigonuevo/*'; //Calcula las decenas
unidades,codigonuevo@*'; //Calcula las unidades
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
despliegaFG; //Manda desplegar los dos digitos
// Olace $our code here
7;
7
void despliegaFvoidG
5
OU>TB,tablaQsegmentos 3unidades4;
tru,*; //Orende displa$ de unidades
dela$:msF.G; //Ce&a prendido displa$ de unidades .m?
tru,'; //Apaga displa$ de unidades

OU>TB,tablaQsegmentos3decenas4;
trd,*; //Orende displa$ de decenas
dela$:msF.G; //Ce&a prendido displa$ de decenas .m?
trd,'; //Apaga displa$ de decenas
7
E+5&i(a(i2n de& 5)$6)a%a/
Se iniciali el valor de la ta?la >ue nos di?uGa los nBmeros en los L segmentos del dis;la=
= declaramos una funcin >ue nom?r@ despliega = >ue utiliar@ en el ;rograma = >ue no
env<a0 ni reci?e ;armetros%
unsigned char var#codigonuevo#unidades#decenas;
const char tablaQsegmentos 3*'4,5'x%1#'x'0#'x)b#'x.1#'x00#'x0d#'xQc#'x'Q#'xQ1#'x017;
void despliegaFvoidG; //?e va a utili+ar una 1uncin !ue se llama despliega sin par;metros
Des;u@s se agreg las siguientes igualdades
Tde1ine tru OKNC.'
Tde1ine trd OKNC.*
El tru es transistor de unidades = el trd es el transistor de decenas0 es ms fcil escri?ir el
;rograma haciendo ;or eGem;lo tru,*; con ello estamos haciendo >ue el OKNC.',*; =a >ue
es una igualdad0 ;ero tru resulta ms fcil recordar = sa?iendo >ue es donde est conectado
el transistor del dis;l=a de unidades
+ecuerde >ue la funcin ;ara leer el valor de conversin del ADC es read:adcFcanalG; >ue
es la ;rimera l<nea = dicho valor de la conversin se guarda en una varia?le llamada var >ue
es de 8 ?its0 =a >ue la conversin >ue escoGimos a la hora de inicialiar el ADC fue de 8
?its%
Si el voltaGe >ue se le a;lica al canal " es de "%F ,olts0 el valor de la conversin ser de 9"L0
;ero nosotros >ueremos re;resentarlo en voltaGe0 as< >ue con la frmula de F:K"FFJvar =
sustitu=endo varV9"L nos dar como resultado "F0 >ue ahora si ;odemos re;resentar como
"%F ,olts% Pero el "F ha= >ue convertirlo a dos digitos ;ara des;legarlos en el dis;la=0 ;or
lo >ue "FJ9:V"0 = "FZ9:VF Qrecuerde >ue Z es la funcim mdulo hace la divisin ;ero el
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com
resultado es el residuoS = esos valores se guardan en decenas = unidades ;ara des;legarlos
en la funcin despliegaFG; Todo lo anterior es el siguiente cdigo agregado al ;rograma:
var,read:adcF(G; //?e lee el valor del Canal ( del ACC FOKN C(G
codigonuevo,)'())/var; //Convierte el valor del ACC a un cdigo nuevo en volta&e
decenas,codigonuevo/*'; //Calcula las decenas
unidades,codigonuevo@*'; //Calcula las unidades
Posteriormente se manda llamar una funcin ;ara des;legar los dos digitos del voltaGe:
despliegaFG; //Manda desplegar los dos digitos
La funcin de des;liega manda im;rimir en el ;uerto 3 el digito corres;ondiente de
unidades0 des;u@s activa el transistor de unidades0 lo deGa ;rendido ImS = lo a;aga =
des;u@s manda im;rimir el digito de decenas lo ;rende = a;aga0 ;ero lo hace tan r;ido >ue
a;arenta >ue estn los dos digitos al mismo tiem;o%
void despliegaFvoidG
5
OU>TB,tablaQsegmentos 3unidades4;
tru,*; //Orende displa$ de unidades
dela$:msF.G; //Ce&a prendido displa$ de unidades .m?
tru,'; //Apaga displa$ de unidades

OU>TB,tablaQsegmentos3decenas4;
trd,*; //Orende displa$ de decenas
dela$:msF.G; //Ce&a prendido displa$ de decenas .m?
trd,'; //Apaga displa$ de decenas
7
Im;ortante% La funcin readdadcQcanalS funciona Bnicamente si a la hora de inicialiar el
microcontrolador con el code&iard inicialia el ADC0 as< >ue si utilia esta funcin en los
;rogramas anteriores no funcionar e inclusive marcar erros ;or>ue no est inicialiado el
;erif@rico del ADC%
'< ManeB$ de &a. 5anta&&a. de LCD
Las ;antallas de cristal l<>uido LCD alfanum@ricas sin im;ortar el fa?ricante se ?asan en un
circuito integrado de .itachi >ue es el .DIIL8:0 esto significa >ue cual>uier ;antalla >ue
se utilice funciona de la misma manera0 ;or lo >ue la ;rogramacin de la ;antalla es
Programacin en C de los microcontroladores ATMEL Autor: David Infante Snche
e!mail: dinfante"#$hotmail%com &&&%comunidadatmel%com

También podría gustarte