Vous êtes sur la page 1sur 73

MANUAL Y CUADERNO DE TRABAJO

PARA EL
Microchip PICmicro MCUs
Pgina 1 de 73 GUIA DEL COMPILADOR CPCWDH
05/04/2013 h!"//###$ad!e%a7&$nene$ne/e'e()*ni(a/GUIA+COMPILADOR+PCWDH$h%'
INDICE.
UNIDAD 1. CONCEPTOS BSICOS PARA PROGRAMACION EN C
1.1. DEFINICION DE DIAGRAMA
1.2. DEFINICION DE PROGRAMA
1.3. ESTRUCTURA DE UN ARCHIVO
1.3.1. ENCABEZADO DE UN PROGRAMA
1.3.1.1. LIBRERIAS
1.3.1.2. FUSIBLES
1.3.1.3. DIRECTIVAS PARA EL MANEJO DE PERIFERICOS
1.3.1.4. VARIABLES GLOBALES
1.3.2. CUERPO DEL ARCHIVO
1.3.2.1. DEFINICION DE FUNCIONES
1.3.3. COMENTARIOS
1.4. SENTENCIAS DE CONTROL Y ESTATUTOS
1.4.1. OPERADORES COMPARATIVOS DE CONDICION.
1.4.2. CONDICIONAL
1.4.2.1. CONDICIONAL SIMPLE
1.4.2.2. CONDICIONAL COMPUESTA
1.4.2.3. CONDICIONAL COMPUESTA PARA NUMEROS ENTEROS
1.4.3. CICLOS O LAZOS
1.4.3.1. CICLOS FOR
1.4.3.2. CICLOS WHILE
1.4.3.3. CICLOS DO-WHILE()
1.5. OPERADORES
1..1. OPERACIONES ARITMETICAS SIMPLES
1..2. OPERACIONES ARITMETICAS CON ASIGNACION
1..3. OPERACIONES LOGICAS A NIVEL BIT
1..4. OPERACIONES LOGICAS A NIVEL BIT CON ASIGNACION
1... COMPARACIONES
1... MANIPULACION DE MULTIPLES COMPARACIONES EN UNA MISMA CONDICION
1..!. MANIPULACION DE VARIABLES DE FORMA INDIRECTA
UNIDAD 2. PROGRAMACION EN EL COMPILADOR CCS PARA PICS
2.1. CONTROL Y MANEJO DE LOS PUERTOS
2.1.1. ENTRADAS " SALIDAS DISCRETAS
2.1.1.1. FAST#IO()
2.1.1.2. SET#TRIS#A($%&'()) SET#TRIS#B($%&'()) SET#TRIS#C($%&'()) SET#TRIS#D($%&'())
SET#TRIS#E($%&'()
2.1.1.3. INPUT(*+,)
2.1.1.4. OUTPUT#BIT(*+,) $%&'()
2.1.1.. OUTPUT#HIGH(*+,)
2.1.1.!. OUTPUT#LOW(*+,)
2.1.1.-. .B"TE I/(,0+1+2%/34 5 6
2.1.2. ENTRADA " SALIDA SERIAL
2.1.2.1. RS232()
2.1.2.2. 2 5 GETC()) 2 5 GETCH()) 2 5 GETCHAR()
1.1.2.3. GETS(27%4 8904+,:)
2.1.2.4. PUTC() ; PUTCHAR()
2.1.2.. PUTS(904+,:)
2.1.2.!. PRINTF(<1',20+3,=) 904+,:) <$%&'(9=)
2.1.2.-. >BHIT()
2.1.2.?. SET#UART#SPEED(@%'/)
2.1.3. ENTRADA ANALOGICA
2.1.3.1. SETUP#ADC#PORTS($%&'()
Pg!" 2 #$ %3 GUIA DEL COMPILADOR CPC&DH
'5('4(2'13 )**+,((---."#+$."%/.!$*!$.!$*($0$1*23!1"(GUIA4COMPILADOR4PC&DH.)*.0
2.1.3.2. SETUP#ADC(A3/()
2.1.3.3. SET#ADC#CHANNEL(2%,%&)
2.1.3.4. +5READ#ADC()
2.1.4. REGISTROS DE CCP
2.1.4.1. SETUP#CCP1(A3/() ; SETUP#CCP2(A3/()
2.1.4.2. SETUP#COMPARATOR(A3/()
2.1.4.3. SET#PWM1#DUT"($%&'() ; SET#PWM2#DUT"($%&'()
2.2. CONTROL Y MANEJO DE REGISTROS.
2.2.1. EEPROM
2.2.1.1. READ#CALIBRATION($%&'()
2.2.1.2. READ#EEPROM(%//4(99)
2.2.1.3. WRITE#EEPROM(%//4(99) $%&'()
2.2.2. CONTADORESBTEMPORIZADORES
2.2.2.1. GET#RTCC() GET#TIMERC() GET#TIMER1() +5GET#TIMER2()
2.2.2.2. RESTART#WDT()
2.2.2.3. SET#RTCC($%&'() SET#TIMERC($%&'() SET#TIMER1($%&'() SET#TIMER2($%&'()
2.2.2.4. SETUP#COUNTERS(4022#90%0() *9#90%0()
2.2.2.. SETUP#TIMER#1(A3/()
2.2.2.!. SETUP#TIMER#2(A3/() *(4+3/) *39092%&()
2.3. CONTROL Y MANEJO DE DATOS.
2.3.3. FUNCIONES DE MANIPULACIDN DE BITS
2.3.3.1. BIT#CLEAR($%4)@+0)
2.3.3.2. BIT#SET($%4)@+0)
2.3.3.3. BIT#TEST($%4)@+0)
2.3.3.4. ROTATE#LEFT(%//4(99) @;0(9)
2.2.3.. ROTATE#RIGHT(%//4(99) @;0(9)
2.3.3.!. SHIFT#LEFT(%//4(99) @;0(9) $%&'()
2.3.4. FUNCIONES DE RETARDOS
2.3.4.1. DELA"#C"CLES(23',0)
2.3.4.2. DELA"#MS(0+A()
2.3.4.3. DELA"#US(0+A()
UNIDAD 3. TECNICAS DE PROGRAMACION AVANZADAS PARA APLICACIONES EMBEBIDAS.
3.1. ESTRUCTURA DE ARCHIVOS.
3.2. CONVENCION DE NOMENCLATURAS
3.2.1. DEFINICIONES
3.2.2. ESPACIADO
3.2.3. LONGITUD
3.2.3. NOMENCLATURA
3.2.4. MACROS
3.2.4. PREFIJOS
3.2.4. SUFIJOS
3.2.4. USO DE MA"USCULAS
UNIDAD 4. HARDWARE DE LOS MICROCONTROLADORES Y SU PROGRAMACION
4.1. FAMILIA DE LOS MICROCONTROLADORES PIC
4.2. ARQUITECTURA DEL MICROCONTROLADOR
4.2.1. MEMORIA DE PROGRAMA
4.2.2. MEMORIA DE DATOS
4.2.3. EL PUERTO A
4.2.4. EL PUERTO B
4.2.. EL TIMERC
4.2.!. EL TIMER1
4.2.-. EL TIMER2
4.2.?. EL MODULO CCPM
4.2.E. EL MODULO COMPARADOR
UNIDAD 5. EJEMPLOS DE PROGRAMAS
P!"#$ 3 %& '3 GUIA DEL COMPILADOR CPCWDH
(5)(4)2(13 *++,-))....$%,&/$'0.#&+#&.#&+)&1&2+34#"2$)GUIA5COMPILADOR5PCWDH.*+/1
5.1. ENCENDER Y APAGAR UN LED EN EL PUERTO B
5.2. ENVIAR AL PUERTO AL PUERTO B LO QUE SE DETECTE EN EL PUERTO C SIEMPRE Y
CUANDO EL VALOR LEIDO SEA MAYOR A 10.
5.3. TEMPORIZADOR HEXADECIMAL DE 0-255 S CON PIN DE RESET.
5.4. LUZ PROGRESIVA USANDO CORRIMIENTO DE BITS.
5.5. DOBLE SEMAORO
5.!. ROTAR UN UNO HACIA LA IZQUIERDA COMO UN SECUENCIADOR EN EL PUERTO B
5.". CONVERSI#N A$D DE % BITS Y SE MUESTRA EL N&MERO BINARIO EN PUERTO B
5.%. CONVERSI#N A$D DE % BITS DE DOS PINES TERMINALES ANALOGICAS Y MUESTRA LOS
DATOS POR EL PUERTO B Y D
5.'. PUERTO A$ D Y BITS Y SE MUESTRA EN UNA SE(AL P)M
5.10. MANE*O DE INTERRUPCION POR TEMPORIZADOR
5.11. MANE*O DEL TEMPORIZADOR+ ADC Y SENAL DE P)M.
5.12. COMUNICACION SERIAL RS232
5.13. CONTROL PID
P,-./0 4 12 "3 GUIA DEL COMPILADOR CPC)DH
05$04$2013 34456$$777.015280"'./24/2./24$292:4;</.:0$GUIA=COMPILADOR=PC)DH.3489
UNIDAD 1
P,-./0 5 12 "3 GUIA DEL COMPILADOR CPC)DH
05$04$2013 34456$$777.015280"'./24/2./24$292:4;</.:0$GUIA=COMPILADOR=PC)DH.3489
UNIDAD 1. CONCEPTOS BSICOS PARA PROGRAMACION EN C
El lenguaje C es uno de los ms rpidos y potentes que hay hoy en da. Algunos dicen que est desfasado y que el
futuro es Java. No se si tendr futuro pero est claro que presente si tiene. No hay ms que decir que el sistema
operativo Linu est desarrollado en C en su prctica totalidad. As que creo que no s!lo no perdemos nada
aprendi"ndolo sino que ganamos mucho. #ara empe$ar nos servir como %ase para aprender C&& e introducirnos
en el mundo de la programaci!n 'indo(s y de plataformas em%e%idas. )i optamos por Linu eiste una
%i%lioteca llamada gt* +o li%rera, como prefieras- que permite desarrollar aplicaciones estilo 'indo(s con C.
No de%emos confundir C con C&&, que no son lo mismo. )e podra decir que C&& es una etensi!n de C. #ara
empe$ar en C&& conviene tener una s!lida %ase de C.
)i queremos reali$ar la programaci!n de los microcontroladores #.C en un lenguaje como el C, es preciso utili$ar
un compilador de C.
/icho compilador nos genera ficheros en formato .ntel0headecimal, que es el necesario para programar
+utili$ando un programador de #.C- un microcontrolador de 1, 2, 32 ! 45 patillas.
El compilador de C que vamos a utili$ar es el #C' de la casa CC) .nc. A su ve$, el compilador lo integraremos
en un entorno de desarrollo integrado +./E- que nos va a permitir desarrollar todas y cada una de las fases que se
compone un proyecto, desde la edici!n hasta la compilaci!n pasando por la depuraci!n de errores. La 6ltima fase,
a ecepci!n de la depuraci!n y retoques hard(are finales, ser programar el #.C.
Al igual que el compilador de 7ur%o C, "ste 8traduce8 el c!digo C del archivo fuente +.C- a lenguaje mquina
para los microcontroladores #.C, generando as un archivo en formato headecimal +.9E:-.
1.1. DEFINICION DE DIAGRAMA
Es una representaci!n la cual est acompa;ada de una eplicaci!n. El diagrama tiene una estructura definida
llamada %loques. Las formas de los %loques cam%ia dependiendo de la instrucci!n de la cual se trate, estas pueden
ser<
=LEC9A
Lnea de secuencia, esta lnea permite la uni!n entre procesos.
#>?CE/.@.EN7?, 7A>EA ? AC7.A./A/
/entro de este proceso se de%e escri%ir la actividad que se desarrollara durante este proceso. Ca%e mencionar que
solo una actividad de%er manejarse por %loque.
#gina 1 de BC DE.A /EL C?@#.LA/?> C#C'/9
5FG54GH53C http<GG(((.adpemaBI.netne.netGelectronicaGDE.AJC?@#.LA/?>J#C'/9.html
CONDICION
Este bloque permite condicionar la realizacin de uno o ms bloques del programa. Este bloque puede tener dos
o ms condiciones de salida. Si se cumple una condicin determinada por el programador, el usuario realizara
actividad , en caso contrario realizar actividad !.
INICIO O "IN DE #$O%$&'&
Este bloque indicara el principio ( el )in de un programa, este bloque deber indicar en su interior *INICIO+ (
*"IN+.
EN,$&D& DE D&,O
-a entrada de dato estar descrita mediante un trapecio, el cual indicara el nombre de la variable ingresada.
Estos bloques estarn ubicados del lado izquierdo del diagrama
S&-ID& DE D&,O
El valor de salida deber estar siempre contenido en el interior del bloque. Este bloque se ubica siempre del lado
derec.o del diagrama.
1.2. DEFINICION DE PROGRAMA
-a *programacin+ puede de)inirse como con/unto de instrucciones operativas escritas para que una
computadora realice una actividad espec0)ica.
Dic.os programas son conocidos como *algoritmos+ que pueden ser representados de )orma gr)ica mediante
*diagramas+.
1n programa contiene uno o varios procedimientos denominados *)unciones+. Cada procedimiento esta
encargado de realizar una *tarea+ determinada para lograra un ob/etivo. Este 2ltimo es la razn de ser del
programa.
1n buen programa tiene una estructura clara.
1.3. ESTRUCTURA DE UN ARCHIVO
1.3.1. ENCABEZADO DE UN PROGRAMA
1n programa deber estar con)ormado de la siguiente )orma3
#gina 4 de 45 %1I& DE- CO'#I-&DO$ C#C6D7
89:8;:!85 .ttp3::<<<.adpema4=.netne.net:electronica:%1I&>CO'#I-&DO$>#C6D7..tml
1.3.1.1. LIBRERIAS
En esta seccin se escriben las libreras que se ocupan en el programa. Las libreras son archivos precompilados
que se crean para tener ciertas operaciones especiales. Algunas de estas libreras son:
#include <16F877A.h>
#include <stdio.h>
#include <math.h>
#include <ctype.h >
#include <stdlib.h >
1.3.1.2. FUSIBLES
Esta directiva define qu fusibles deben activarse en el dispositivo cuando se programe. Los fusibles permiten
configurar ciertos registros en un microcontrolador en el cual se tiene acceso nicamente durante el proceso de la
programacin.
Esta directiva no afecta a la compilacin; sin embargo esta informacin se pone en el archivo de salida. !i los
fusibles necesitan estar en formato "aralla# ha$ que agregar "A% en opciones. &tili'ar la utilidad "())*("!
para determinar qu opciones son v+lidas para cada dispositivo.
La opcin !,A" tiene la funcin especial de intercambiar los b$tes alto $ ba-o de los datos que no son parte del
programa en el archivo *e#. Esta informacin es necesaria para algunos programadores de dispositivos. Algunas
de las opciones m+s usadas son:
Estos registros son:
#fuses
"+gina . de /0 1&(A 2EL )34"(LA23% )"),2*
56758795:0 http:77;;;.adpema/<.netne.net7electronica71&(A=)34"(LA23%="),2*.html
LP, XT, HS, RC
WDT, NOWDT
PROTECT, NOPROTECT
PUT, NOPUT (Power Up Timer)
BROWNOUT, NOBROWNOUT
PAR (Parallax Forma F!"e")
SWAP
#$!"e" HS, NOWDT, NOPROTECT, NOBROWNOUT
1.3.1.3. DIRECTIVAS PARA EL MANEJO DE PERIFERICOS
Son palabras reservadas que permiten el manejo de los puertos paralelos, rs232, y puertos digitales.
#USE DELA% (CLOC&'$re(!e)(ia)
Esta directiva indica al compilador la frecuencia del procesador, en ciclos por segundo, a la vez que
habilita el uso de las funciones DE!"#$S%& y DE!"#'S%&.
(pcionalmente podemos usar la funci)n restart#*D+%& para que el compilador reinicie el *D+ durante
el retardo.
Ejemplos,
-use delay %cloc./20000000&
-use delay %cloc./32000, 1ES+!1+#*D+&
#USE FAST*+O (p!ero)
Esta directiva afecta al c)digo que el compilador generar2 para las instrucciones de entrada y salida. Este
m3todo r2pido de hacer 45( ocasiona que el compilador realice 45( sin programar el registro de direcci)n.
El puerto puede ser !67.
Ejemplo,
-use fast#io%!&
#USE RS,-, (BAUD'.a!/io", X0+T'pi), RC1'pi)222)
Esta directiva le dice al compilador la velocidad en baudios y los pines utilizados para la
45( serie. Esta directiva tiene efecto hasta que se encuentra otra directiva 1S232.
a directiva -'SE DE!" debe aparecer antes de utilizar -'SE 1S232. Esta directiva habilita el uso de
funciones tales como 7E+89, :'+89!1 y :14;+<. Si la 45( no es est2ndar es preciso poner las directivas
<4=ED#4( o <!S+#4( delante de -'SE 1S232
OPC+ONES3
RESTART_WDT
Hace que GETC() ponga a cero el WDT mientras espera un carcter.
INVERT
Invierte la polaridad de los pines serie (normalmente no es necesario con el convertidor de nivel, como el
!"#$#). %o puede usarse con el &CI interno.
PARITY=X
Donde " es %, E, u '.
BITS =X
Donde " es ()* (no puede usarse ()+ con el &CI).
FLOAT_HIGH
&e utili,a para las salidas de colector a-ierto.
ERRORS
Indica al compilador que guarde los errores reci-idos en la varia-le .&#$#/E..'.& para resta-lecerlos cuando
se producen.
BRGH1OK
0ermite velocidades de transmisi1n -a2as en c3ips (uC4s, memorias, etc.) que tienen pro-lemas de transmisi1n.
Cuando utili,amos dispositivos con &CI 5 se especi6ican los pins &CI, entonces se usar el &CI. &i no se puede alcan,ar
:2gina > de ?3 7'4! DE 8($:4!D(1 8:8*D9
0@50A520B3 http,55CCC.adpema?>.netne.net5electronica57'4!#8($:4!D(1#:8*D9.html
una tasa de baudios dentro del 3% del valor deseado utilizando la frecuencia de reloj actual, se generar un error.
ENABLE=pin
El pin especificado estar a nivel alto durante la transmisin.
FORCE_SW
Usa una UAR soft!are en lugar del "ard!are aun cuando se especifican los pines del "ard!are.
#a definicin de R$%3%&ERR'R$ es como sigue(
Sin UART:
El )* + es el ,- )* para el modo de datos de , )*.
El )* . a nivel alto indica un fallo en el modo flotante alto.
Con UART:
Usado slo para conseguir(
/opia del registro R/$A, e0cepto( 1ue el )* 2 se usa para indicar un error de paridad.
Las directivas son las siguientes:
#use delay (clock=20000000, restart_wdt)
#use rs232 (baud=9600, xmit PI_!6, rc"=PI!_!#)
#use $ast_io(%)
1.3.1.4. VARIABLES GLOBALES
DESCRIPCION.
Las variables globales se definen al principio del archivo pueden ser usadas por cual!uier funci"n dentro del
#is#o archivo.
RE$L%S P%R% ESCRI&IR NO'&RE DE (%RI%&LES
Deber) o#itirse los espacios o s*#bolos de operaciones co#o:
+ , - . / 0 1 . 2 ,3
Podr) co#binarse con n4#eros letras pero deber) e#pe5ar con letras.
Deber) utili5arse sie#pre #in4sculas en todo el progra#a1 tanto para no#bre de funciones1 co#o para
variables.
Puede utili5arse cual!uier eti!ueta /no#bre0 e6cepto a!uellas palabras reservadas por el #is#o co#pilador
para crear el progra#a.
NO'&RES NO (%LIDOS NO'&RES (%LIDOS
7variable variable89
variable- variable9
var 9 var:bsave
9variable
(%RI%&LES SI'PLES
unsigned define un n4#ero de ; bits sin signo
unsigned int define un n4#ero de ; bits sin signo
int define un n4#ero de ; bits sin signo
char define un n4#ero de ; bits sin signo
long define un n4#ero de 9< bits sin signo
long int define un n4#ero de 9< bits sin signo
signed define un n4#ero de ; bits con signo
signed int define un n4#ero de ; bits con signo
signed long define un n4#ero de 9< bits con signo
float define un n4#ero de =: bits en punto flotante
short define un &I>
short int define un &I>
(%RI%&LES CO'P?ES>%S
&'um variable enu#erada
(y)ede$ variable personali5ada
*truct variable co#puesta
P)gina 9@ de A= $?I% DEL CO'PIL%DOR CPCBDC
@D.@E.:@9= http:..FFF.adpe#aAG.netne.net.electronica.$?I%8CO'PIL%DOR8PCBDC.ht#l
Union variable que puede tener dos posible formas de leerse.
Static se inicializa una sola vez y guarda su valor en todo momento mientras el
microcontrolador este energizado.
Auto es una variable de rpido acceso y solo esta presenta mientras se ejecute el
procedimiento.
Si TYPEDEF se pone delante de la definicin de un dato, entonces no se asigna espacio de memoria al
identificador a menos que sea utilizado como un especificador de tipo en otras definiciones de datos.
Si delante del identificador ponemos CONS entonces, el identificador es tratado como constante. !as constantes
deben ser inicializadas y no pueden cambiar en tiempo de ejecucin.
No estn permitidos punteros a constantes. S"O# es un tipo especial utilizado para generar cdigo muy
eficiente para las operaciones de $%O.
No se permiten los arreglos de tipo S"O# ni los punteros a S"O#. !a siguiente tabla muestra la sinta&is para
las definiciones de datos.
'jemplos(
int a,b,c,d;
typedef int byte;
typedef short BIT;
BIT e,f;
byte g!"#";
char $h;
enu% boo&ean 'fa&se, true(;
boo&ean );
byte * + ,;
byte const SE-A.AS + ,#;
byte const FA/T01ES 2" + '3, 45, 52, 4#3(;
struct registro6datos
'
byte a #";
byte b 7 #; 8$# bits $8
byte c 7 !; 8$! bits$8
int d;
(
1.3.2. CUERPO DEL ARCHIVO
)n programa deber estar conformado de la siguiente forma(
*uncin +rincipal
,ariables locales
Operaciones y llamadas a funciones secundarias
*unciones secundaria
Operaciones bsicas cuyo nombre debe implicar la operacin que realiza.
1.3.2.1. DEFINICION DE FUNCIONES
!as funciones aceptan argumentos o parmetros y devuelven valores. El formato de la definicin de una funcin es
como sigue(
-calificador.tipo/ identificador 0--especificador.tipo identificador/1
+gina 22 de 34 5)$6 7'! CO8+$!67O# C+C97"
:;%:<%=:24 >ttp(%%???.adpema3@.netne.net%electronica%5)$6.CO8+$!67O#.+C97".>tml
{
[cuerpo de la funcin]
}
El calificador_tipo para una funcin pueden ser: void o un especificador de tipo.
La definicin de una funcin puede ir precedida por una de las siguientes directivas del proprocesador
(calificadores de funcin) para identificar una caracterstica especial de la funcin: #separate #inline #int_...
uando utili!a"os una de las directivas "encionadas # la funcin tiene un prototipo (declaracin anterior a la
definicin de la funcin$ # colocada al principio del fic%ero fuente) %a# &ue incluir la "is"a #directiva en el
prototipo # en la definicin de la funcin.
'na caracterstica no "u# corriente$ se %a a(adido al co"pilador para a#udar a evitar los pro)le"as creados por
el %ec%o de &ue no pueden crearse punteros a constantes de cadenas.
'na funcin &ue tiene un par*"etro de tipo c%ar aceptar* una constante de cadena. El co"pilador generar* un
)ucle &ue lla"a a la funcin una ve! para cada car*cter de la cadena.
Las funciones ta")i+n pueden tener varia)les internas$ estas de)er*n ir al principio de la funcin sie"pre.
void main (void)
{
//definicin de variables

//Programa

}
1.3.3. COMENTARIOS
Los co"entarios tienen la siguiente for"a:
,, o"entarios de un rengln -nica"ente.
,. o"entario de "-ltiples
/englones$ puedes poner toda la
0escripcin de la funcin.,
1ueden ir en cual&uier parte del arc%ivo
/**************************************
* programa: no hace nada
* autor: Adbeel Aleandro P!re" #art$ne"
* empresa: %&%'(&)
*
**************************************/
//librer$as
//variable
//prototipo de funciones secundarias
void funcion*secundaria(void)+
,oid main (void)// funcin principal
{
//programa demostrativo
funcion*secundaria()+
}
/******************************************
1*gina 23 de 45 6'78 0EL 9:17L809/ 1;0<
=>,=?,3=25 %ttp:,,@@@.adpe"a4A.netne.net,electronica,6'78_9:17L809/_1;0<.%t"l
* nombre de la funcin: funcion_secundaria
* parmetros: ninguno
* regresa: nada
*******************************************/
void funcion_secundaria(void)
{
//funcin secundaria
}
/******************************************
* Descripcin del archivo: rograma no hace nada
* !ltimos cambios:
* "ev #echa Descripcin
*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
* % diciembre %&' %()) modificacin de comentarios
* ) diciembre %&' %()) creacin del archivo
******************************************/
1.4. SENTENCIAS DE CONTROL Y ESTATUTOS
Este compilador permite las siguientes estructuras y estatutos en la construccin de programas:
1.4.1. OPERADORES COMPARATIVOS DE CONDICION.
Los operadores que se utilizan para el manejo de sentencias de control de tipo comparativo:
Igualdad == es igual?
Diferencia = es diferente?
!ayor que " es mayor?
!enor que # es menor?
!ayor o igual "= es mayor o igual?
!enor o igual #= es menor igual?
$er ejemplo
int varia%le=&'
Es (varia%le==)*? falso+ porque varia%le es &
Es (varia%le=)*? verdadero porque varia%le vale & y este es diferente de ),
Es (varia%le")*? falso porque varia%le vale & y & es menor que ),
Es (varia%le#)*? verdadero porque varia%le es & y & es menor que ),
Es (varia%le"=)*? falso porque varia%le vale & y & es menor que ),
Es (varia%le#=)*? verdadero porque varia%le es & y & es menor que ),
1.4.2. CONDICIONAL
-n programa de%er. estar conformado de la siguiente forma:
1.4.2.1. CONDICIONAL SIMPLE
/.gina &0 de 10 2-I3 DEL 45!/IL3D56 4/47D8
9:;9<;)9&0 =ttp:;;>>>,adpema1?,netne,net;electronica;2-I3@45!/IL3D56@/47D8,=tml
if (condicin*
A
;;Bi la condicin es verdadera ejecuta esta seccin de cdigo
C
1.4.2.2. CONDICIONAL COMPUESTA
if (condicin*
A
;;Bi la condicin es verdadera ejecuta esta seccin de cdigo
Celse
A
;;Bi la condicin es falsa ejecuta esta seccin de cdigo
C
/.gina &< de 10 2-I3 DEL 45!/IL3D56 4/47D8
9:;9<;)9&0 =ttp:;;>>>,adpema1?,netne,net;electronica;2-I3@45!/IL3D56@/47D8,=tml
1.4.2.3. CONDICIONAL COMPUESTA PARA NUMEROS ENTEROS
switch(variable)
{
case 0:
//Si la variable es igual a 0 ejecuta esta seccin de cdigo
break;
case 1:
//Si la variable es igual a 1 ejecuta esta seccin de cdigo
break;
case 2:
//Si la variable es igual a 2 ejecuta esta seccin de cdigo
break;
case :
/!Si la variable es igual a ejecuta esta seccin de cdigo ("#$ %&S' #S(#%)&*)!/
de+ault:
Si la variable no concuerda con los valores ,revios ejecuta esta seccin de cdigo-
break;
.
(/gina 10 de 1 23)& 4#* %'5()*&4'$ %(%647
00/08/201 htt,://www-ad,e9a1:-netne-net/electronica/23)&;%'5()*&4'$;(%647-ht9l
1.4.3. CICLOS O LAZOS
1.4.3.1. CICLOS FOR
for(inicializacin de variable; condicin; incremento)
{
//mientras sea verdadero esta seccin de cdigo se ejecutara
}
1.4.3.2. CICLOS WHILE
while(condicin)
{
//mientras sea verdadero esta seccin de cdigo se ejecutara
}
1.4.3.3. CICLOS DO-WHILE()
Pgina ! de "# $%&' ()* +,-P&*'(,. +P+/(0
12/13/41# htt56//www7ad5ema"87netne7net/electronica/$%&'9+,-P&*'(,.9P+/(07html
do
{
//mientras sea verdadero esta seccin de cdigo se ejecutara
} while(condicin);
1.5. OPERADORES
Los operadores que se utilizan son:
1.5.1. OPERACIONES ARITMETICAS SIMPLES
!"#$#%&
' ()*(+,!$$#%&
- .)L+#/L#$!$#%&
/ "#0#(#%&
1 !(#2&!$#%&
3 .%")L%
1.5.2. OPERACIONES ARITMETICAS CON ASIGNACION
1 !"#$#%& 4 !(#2&!$#%&
#&$,5.5&+% 5& )&%
'1 ,5(+! 4 !(#2&!$#%&
'' ,5(+! 5& )&%
/1 "#0#(#%& 4 !(#2&!$#%&
-1 .)L+#/L#$!$#%& 4 !(#2&!$#%&
3/ .%")L% 4 !(#2&!$#%&
/6gina 78 de 89 2)#! "5L $%./#L!"%, $/$:";
<=/<>/?<79 http://www@adpema8A@netne@net/electronica/2)#!B$%./#L!"%,B/$:";@html
1.5.3. OPERACIONES LOGICAS A NIVEL BIT
| OR
& AND
^ XOR
! NOT
~ COMPLEMENTO A UNO
>> CORRIMIENTO A LA DERECHA
<< CORRIMIENTO A LA IZQUIERDA
1.5.4. OPERACIONES LOGICAS A NIVEL BIT CON ASIGNACION
&= AND SOBRE BITS Y ASIGNACION
|= OR Y ASIGNACION
^= XOR Y ASIGNACION
>>= CORRIMIENTO A LA DERECHA CON ASIGNACION
<<= CORRIMIENTO A LA IZQUIERDA Y ASIGNACION
1.5.5. COMPARACIONES
== COMPARACION DE IGUALDAD
> MAYOR QUE
>= MAYOR O IGUAL QUE
!= COMPARACION DE DIFERENCIA
< MENOR QUE
<= MENOR O IGUAL QUE
1.5.5. MANIPULACION DE MULTIPLES COMPARACIONES EN UNA MISMA CONDICION
&& AND LOGICO
|| OR LOGICO
! CONDICION
1.5.. MANIPULACION DE VARIABLES DE FORMA INDIRECTA
" APUNTADOR
& DIRECCION
#> APUNTADOR A ESTRUCTURA
P$%&'( )* +, -. GUIA DEL COMPILADOR CPC/DH
01203240). 5667!228889(+7,:(-;9',6',9',62,<,=6>?'&=(2GUIA@COMPILADOR@PC/DH956:<
UNIDAD 2
P$%&'( ); +, -. GUIA DEL COMPILADOR CPC/DH
01203240). 5667!228889(+7,:(-;9',6',9',62,<,=6>?'&=(2GUIA@COMPILADOR@PC/DH956:<
UNIDAD 2. PROGRAMACION EN EL COMPILADOR CCS PARA PICS
2.1. CONTROL ! MANE"O DE LOS PUERTOS
2.1.1. ENTRADAS ! SALIDAS DISCRETAS
2.1.1.1. FAST#IO()
Ver la seccin (1.3.1.3. DIRECTIVAS PARA EL MANEJO DE PERIFERICOS)
2.1.1.2. SET#TRIS#A($%&'()) SET#TRIS#B($%&'()) SET#TRIS#C($%&'()) SET#TRIS#D($%&'()) SET#TRIS#E
($%&'()
Estas funciones permiten escribir directamente los registros tri-estado para la configuracin de los puertos.
Esto debe usarse con FAST_I() ! cuando se accede a los puertos de I" como si fueran memoria# igual $ue
cuando se utili%a una directi&a '()TE. *ada (IT de &alue representa una patilla. +n ,-, indica $ue la patilla es de
entrada ! un ,., $ue es de salida.
E/emplo0
SET_T1IS_(( .2.F )3 "" pone (.# (-# (4 ! (5 como entradas3 (6# (7# (8 ! (9
"" como salidas# en un :I* -8c;6
2.1.1.3. INPUT(*+,)
<e&uel&e el estado ,., o ,-, de la patilla indicada en pin. El m=todo de acceso de I" depende de la >ltima
directi&a '+SE ?_I utili%ada. El &alor de retorno es un entero corto.
E/emplo0
@Aile ( Binput(:IC_(-) )3
Cota0 El argumento para las funciones de entrada ! salida es una direccin de (IT. :or e/emplo# para el (IT 5D
del port A (b!te 7 de los SF1) tendrEa un &alor direccin de 7?;F5G65.
Esto se puede definir como sigue0 'define pin5_portA 65.
Hos pines o patillas de los dispositi&os estIn definidos como :IC_JJ en los arcAi&os de cabecera ?.K. Lstos# se
pueden modificar para $ue los nombres de los pines sean mIs significati&os para un pro!ecto determinado.
2.1.1.4. OUTPUT#BIT(*+,) $%&'()
Esta funcin saca el (IT dado en &alue(. o -) por la patilla de I" especificada en pin. El
modo de establecer la direccin del registro# estI determinada por la >ltima directi&a '+SE ?_I.
E/emplo0
output_bit( :IC_(.# .)3 "" es lo mismo $ue output_lo@(pin_(.)3
output_bit( :IC_(.#input( :IC_(- ) )3 "" pone (. igual $ue (-
output_bit( :IC_(.# sAift_left(Mdata# -# input(:IC_(-)))3
"" saca por (. el NS( de ,data, ! al mismo tiempo
"" despla%a el ni&el en (- al HS( de data.
2.1.1.5. OUTPUT#HIGH(*+,)
:one a ,uno, el pin indicado. El m=todo de acceso de I" depende de la >ltima directi&a
'+SE ?_I utili%ada.
:Igina 4. de 95 O+IA <EH *N:IHA<1 *:*P<K
.7".6"4.-5 Attp0""@@@.adpema9Q.netne.net"electronica"O+IA_*N:IHA<1_:*P<K.Atml
Ejemplo:
output_high(PIN_A0);
2.1.1.6. OUTPUT_LOW(pin)
Pone a 'cero' el pin indicado. El mtodo de acceo de I!" depende de la #ltima directi$a
%&'E (_I".
Ejemplo:
output_lo)(PIN_A0);
2.1.1.7. #BYTE Identificador !
Eta directi$a crear* un identi+icador ,id, -ue puede utili.are como cual-uier N/ (un 01te). El identi+icador
re+erenciar* un o0jeto en la poici2n de memoria 34 donde 3 puede er una contante u otro identi+icador. 'i 3 e
otro identi+icador4 entonce te etar* locali.ado en la mima direcci2n -ue el identi+icador ,id,.
Ejemplo:
%01te tatu 5 6
%01te port_0 5 7
truct
8
hort int r_);
hort int c_d;
int no_uado : 9;
int dato : :;
; port_a;
%01te port_a 5 <
...
port_a.c_d 5 =;
2.1.2. E"T#$%$ Y &$LI%$ &E#I$L
2.1.2.1. #&2'2()
>er la ecci2n (1.3.1.3. DIRECTIVAS PARA EL MANEJO DE PERIFERICOS)
2.1.2.2. c (ET)()* c (ET)+()* c (ET)+$#()
Eta +uncione eperan un car*cter por la patilla ?@> del dipoiti$o ?'969 1 retorna
el car*cter reci0ido.
E precio utili.ar la directi$a %&'E ?'969 ante de la llamada a eta +unci2n para -ue el compilador pueda
determinar la $elocidad de tranmii2n 1 la patilla utili.ada. Aa directi$a %&'E ?'969 permanece e+ecti$a hata
-ue e encuentre otra -ue anule la anterior.
Ao procedimiento de I!" erie e3igen incluir %&'E BEAAC para a1udar a incroni.ar de +orma correcta la
$elocidad de tranmii2n. ?ecordad -ue e neceario adaptar lo ni$ele de $oltaje ante de conectar el PI@ a un
dipoiti$o ?'D969.
Ejemplo:
print+(,@ontinuar (4n)E,);
do
8
repueta5getch();
; )hile(repuetaF5''GG repuetaF5'n');
P*gina 9= de H6 I&IA BEA @"JPIAAB"? @P@KBL
0<!0:!90=6 http:!!))).adpemaHM.netne.net!electronica!I&IA_@"JPIAAB"?_P@KBL.html
1.1.2.'. (ET&(c,ar -.trin/)
Esta funcin lee caracteres (usando GETC()) de la cadena (string) hasta que encuentra un retorno de carro(valor
ASCII 13). a cadena se ter!ina con un ".
2.1.2.0. PUT)() 1 PUT)+$#()
Estas funciones env#an un car$cter a la %atilla &'IT del dis%ositivo (S)3). Es %reciso utili*ar la directiva +,SE
(S)3) antes de la lla!ada a esta funcin %ara que el co!%ilador %ueda deter!inar la velocidad de trans!isin -
la %atilla utili*ada. a directiva +,SE (S)3) %er!anece efectiva hasta que se encuentre otra que anule la
anterior.
E.e!%lo/
if (chec0su!11")
2
%utchar(AC3)4
5else
2
%utchar(6A3)4 77 6A3 car$cter de res%uesta negativa
5
2.1.2.2. PUT&(.trin/)
Esta funcin env#a cada car$cter de string a la %atilla &'IT del dis%ositivo (S)3). ,na ve* concluido el env#o de
todos los caracteres la funcin env#a un retorno de carro C( o (ET,(6 (ASCII 13) - un avance de l#nea 8 o
I6E98EE: (ASCII 1").
E.e!%lo/
%uts( ; 9999999999 ; )4
%uts( ; < =>A <; )4
%uts( ; 9999999999 ; )4
2.1.2.6. P#I"T3(4f5nction6* .trin/* 47a85e.6)
a funcin de i!%resin for!ateada ?(I6T8 saca una cadena de caracteres a la salida est$ndar serie (S9)3) o a
una funcin es%ecificada. El for!ato est$ relacionado con el argu!ento que %one!os dentro de la cadena (string).
Cuando se usan varia@lesA string de@e ser una constante. El car$cter B se %one dentro de string %ara indicar un
valor varia@leA seguido de uno o !$s caracteres que dan for!ato al ti%o de infor!acin a re%resentar.
Si %one!os BB o@tene!os a la salida un solo B. El for!ato tiene la for!a genCrica BDtA donde D es o%tativo -
%uede ser 1A)A...AE. Esto es %ara es%ecificar cu$ntos caracteres son re%resentados4 si elegi!os el for!ato "1A...A"E
indica!os ceros a la i*quierdaA o ta!@iCn 1.1 a E.E %ara re%resentacin en %unto flotante.
t es el ti%o de for!ato - %uede ser uno de los siguientes/
C Car$cter
, Entero sin signo
F Entero en =eF (en !inGsculas)
& Entero en =eF (en !a-Gsculas)
: Entero con signo
Be (eal en for!ato eF%onencial(notacin cient#fica)
Bf (eal (8loat)
F Entero largo en =eF (en !inGsculas)
& Entero largo en =eF (en !a-Gsculas)
?$gina )) de H3 G,IA :E C>'?IA:>( C?CI:=
"J7"K7)"13 htt%/77DDD.ad%e!aHE.netne.net7electronica7G,IALC>'?IA:>(L?CI:=.ht!l
Lu Decimal largo sin signo
Ld Decimal largo con signo
% Simplemente un %
Ejemplos:
byte x,y,z;
printf ( !ola ";
printf(#$%%&alue'(%)x*n*r,get+rtcc("";
printf(%)u %, %-,*n*r,x,y,z";
printf(L%D+./$%, n'%c,n";
2.1.2.7. 9B+IT()
Esta funci0n de1uel1e $#/E si el 23$ 4ue se est5 en1iando al pin #%& de un dispositi1o #S)6), es el 23$ de
inicio de un car5cter7 Es preciso utilizar la directi1a 8/SE #S)6) antes de la llamada a SET_UART_SPEED(baud)7
Ejemplo:
9eypres': :;
;<ile ( 9eypress=':>: "
? @@ entramos al bucle ;<ile
if ( 9b<it (" "
?
9eypress'getc("; @@ en la 1ariable 9eypress se guardan los caracteres
A
if (=input(.3B+2)"" @@ inicio del en1Co de un byte
?
output+<ig<(.3B+26";
A
else
?
output+lo;(.3B+26"
A
A
2.1.2.:. &ET_U$#T_&PEE%(;a5d)
Esta funci0n cambia la 1elocidad de transmisi0n de la /D#$ (/ni1ersal Dsync<ronous #ecei1er $ransmitter" en
tiempo de ejecuci0n7
2.1.'. E"T#$%$ $"$LO(I)$
2.1.'.1. &ETUP_$%)_PO#T&(7a85e)
Esta funci0n configura los pines del DD% para 4ue sean anal0gicos, digitales o alguna combinaci0n de ambos7
Las combinaciones permitidas 1arCan, dependiendo del c<ip7
Las constantes usadas tambiEn son diferentes para cada c<ip7 &Ease el arc<i1o de cabecera F7< para cada .3%
concreto7 Las constantes DLL+DBDLGH y BG+DBDLGHS
son 15lidas para todos los c<ips7
Dlgunos otros ejemplos de constantes son:
#DI+#DJ+#D6+DBDLGH
Esto <ace 4ue los pines DI, DJ y D6 sean anal0gicos y los restantes sean digitales7
.5gina )6 de K6 H/3D DEL %GL.3LDDG# %.%MD!
IN@I-@)IJ6 <ttp:@@;;;7adpemaKO7netne7net@electronica@H/3D+%GL.3LDDG#+.%MD!7<tml
Los +5v se usan como referencia; vase el siguiente ejemplo:
RA0_RA1_ANALO_RA!_R"#
Las patillas A0 $ A1 son anal%gicas; la patilla RA! se usa como voltaje &e referencia $ to&as las &em's patillas
son &igitales(
"jemplo:
)etup_a&c_ports* ALL_ANALO +;
2.1.'.2. &ETUP_$%)(<ode)
"sta funci%n prepara o configura el conversor A,-( .ara la serie 1/000 esta funci%n esta0lece la corriente &e
carga( 1ase el arc2ivo 1/000(3 para los valores seg4n el mo&o &e funcionamiento(
Los mo&os son:
A-5_O##
A-5_5LO56_-71_8
A-5_5LO56_-71_9
A-5_5LO56_-71_!8
A-5_5LO56_7N:"RNAL
"jemplo:
setup_a&c*A-5_5LO56_7N:"RNAL+;
2.1.'.'. &ET_$%)_)+$""EL(cana8)
"specifica el canal a utili;ar por la funci%n R"A-_A-5*+( "l n4mero &e canal empie;a en 0( "s preciso esperar
un corto espacio &e tiempo &espus &e cam0iar el canal &e a&<uisici%n= antes &e <ue se pue&an o0tener lecturas
&e &atos v'li&os(
"jemplo:
set_a&c_c2annel*8+;
2.1.'.0. i#E$%_$%)()
"sta funci%n lee el valor &igital &el conversor anal%gico &igital( -e0en 2acerse llama&as a )":>._A-5*+ $
)":_A-5_53ANN"L*+ en alg4n momento antes &e la llama&a a esta funci%n(
"jemplo:
setup_a&c* ALL_ANALO +;
set_a&c_c2annel* +;
?2ile * input*.7N_@0+ +
A
&ela$_ms* 5000 +;
value B rea&_a&c*+;
printf*CA,- value B D8EFnFrC=value+;
G
2.1.0. #E(I&T#O& %E ))P
2.1.0.1. &ETUP_))P1(<ode) 1 &ETUP_))P2(<ode)
"stas funciones iniciali;a el conta&or 55.( .ara acce&er a los conta&ores 55. se utili;an las varia0les 55._1 $
55._8( Los valores para HmodeI son:
55._O##
55._5A.:>R"_#"
.'gina 8/ &e J! >7A -"L 5OK.7LA-OR 5.5L-3
05,0/,801! 2ttp:,,???(a&pemaJM(netne(net,electronica,>7A_5OK.7LA-OR_.5L-3(2tml
55._5A.:>R"_R"
55._5A.:>R"_-71_/
55._5A.:>R"_-71_1N
55._5OK.AR"_)":_ON_KA:53
55._5OK.AR"_5LR_ON_KA:53
55._5OK.AR"_7N:
55._5OK.AR"_R")":_:7K"R
55._.LK
55._.LK_.L>)_1 *s%lo si se utili;a un ciclo &e tra0ajo &e 9 0its+
55._.LK_.L>)_8 *s%lo si se utili;a un ciclo &e tra0ajo &e 9 0its+
55._.LK_.L>)_! *s%lo si se utili;a un ciclo &e tra0ajo &e 9 0its+
2.1.0.2. &ETUP_)O=P$#$TO#(<ode)
)%lo los .75 &e la serie 1NcN8E pue&en usar esta funci%n *vase el arc2ivo &e ca0ecera 1NcN80(2+= &on&e mo&e
pue&e ser:
A0_A!_A1_A8
A0_A8_A1_A8
N5_N5_A1_A8
N5_N5_N5_N5
A0_1R_A8_1R
A!_1R_A8_1R
A0_A8_A1_A8_O>:_ON_A!_A/
A!_A8_A1_A8
5a&a uno &e los cuatro Otems separa&o por P_P son 51Q= 51+= 58 Q= 58+
"jemplo:
setup_comparator *A0_A!_A1_A8+; ,,iniciali;a &os compara&ores in&epen&ientes
2.1.0.'. &ET_PW=1_%UTY(7a85e) 1 &ET_PW=2_%UTY(7a85e)
"stas funciones escri0en los 10 0its &e value al &ispositivo .LK para esta0lecer el ciclo &e tra0ajo( )e pue&e
usar un valor &e 9 0its si no son necesarios los 0its menos significativos(
.'gina 85 &e J! >7A -"L 5OK.7LA-OR 5.5L-3
05,0/,801! 2ttp:,,???(a&pemaJM(netne(net,electronica,>7A_5OK.7LA-OR_.5L-3(2tml
2.2. CONTROL Y MANEJO DE REGISTROS.
2.2.1. EEPROM
2.2.1.1. READ_CALIBRATION(value)
Esta funcin lee "n" posiciones de la memoria de calibracin de un 14000.
Ejemplo:
Fin = read_calibration(16!
2.2.1.2. READ_EEPROM(addre)
Esta funcin lee un b"te de la direccin (address de EE#$%& especificada. 'a direccin puede ser 0(6).
Ejemplo:
*define '+,-_.%'/&E 10
0olume = read_EE#$%& ('+,-_.%'/&E !
2.2.1.!. "RITE_EEPROM(addre# value)
Esta funcin escribe un b"te de datos en la direccin de memoria EE#$%& especificada. address puede 0aler 0(
6)! 0alue es el b"te de datos a escribir! Esta funcin puede tardar 0arios milise1undos para ejecutarse.
Ejemplo:
*define '+,-_.%'/&E 10
0olume22!
3rite_eeprom('+,-_.%'/&E40olume!
2.2.2. CONTADORES$TEMPORI%ADORES
2.2.2.1. GET_RTCC() GET_TIMER&() GET_TIMER1() '(GET_TIMER2()
Estas funciones de0uel0en el 0alor de la cuenta de un contador en tiempo real. $-55 " -imer0 son el mismo.
-imer1 es de 16 bits " los otros son de 6 bits.
Ejemplo:
37ile ( 1et_rtcc( 8= 0 !
#91ina :6 de ;) </=+ >E' 5%&#='+>%$ 5#5?>@
0AB04B:01) 7ttp:BB333.adpema;C.netne.netBelectronicaB</=+_5%&#='+>%$_#5?>@.7tml
2.2.2.2. RESTART_"DT()
Esta funcin reiniciar el timer del watchdog. Si habilitamos el timer del watchdog, debe llamarse peridicamente
a RESTART_WT!" para pre#enir el reseteo del procesador.
E$emplo%
while !&done"
'
restart_wdt!"(
.
.
}
2.2.2.!. SET_RTCC(value) SET_TIMER&(value) SET_TIMER1(value) SET_TIMER2(value)
Estas funciones acti#an el timer o tempori)ador al #alor especificado. RT** + Timer, son el mismo. Timer- es
de -. bits + los otros son de / bits.
E$emplo%
if ! get_rtcc!"0012 " set_rtcc!,"(
2.2.2.). SET*P_CO*NTERS(r+,,_+a+e# -_+a+e)
Esta funcin iniciali)a el timer RT** o el WT. El rtcc_state determina 3u4 es lo 3ue acti#a el RT**. El
ps_state establece un pre5scaler para el RT** o el WT. El prescaler alarga el ciclo del contador indicado. Si se
acti#a el pre5scaler del RT** el WT se pondr a WT_-/6S. Si se acti#a el pre5scaler del WT el RT** se
pone a RT**_78_-.
Valores del rtcc_state:
RTCC_INTERNAL
RTCC_EXT_L_TO_H
RTCC_EXT_H_TO_L
Valores del ps_state:
RTCC_DIV_2
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128
RTCC_DIV_256
WDT_18MS
WDT_36MS
WDT_72MS
WDT_144MS
WDT_288MS
WDT_576MS
WDT_1152MS
WDT_2304MS
E$emplo%
setup_counters !RT**_79TER9A:, WT_1;,<6S"(
2.2.2... SET*P_TIMER_1(/0de)
Esta funcin iniciali)a el timer-. :os #alores de mode deben ordenarse $untos, tal como se muestra en el e$emplo.
El #alor del timer puede leerse + puede escribirse utili)ando =ET_T76ER-!" + SET_T76ER-!".
:os #alores de mode son%
T-_7SA>:E o T-_E?TER9A:_S@9* o T-_78_>@_1
Agina 1B de B; =C7A E: *D6A7:ADR *A*WE
,2F,<F1,-; http%FFwww.adpemaBG.netne.netFelectronicaF=C7A_*D6A7:ADR_A*WE.html
T1_INTERNAL o T1_CLK_OUT o T1_DIV_BY_4
T1_EXTERNAL o T1_DIV_BY_1 o T1_DIV_BY_8
Ejemplos:
setup_tme!_1 " T1_DI#ABLED $%
setup_tme!_1 " T1_INTERNAL & T1_DIV_BY_4 $%
setup_tme!_1 " T1_INTERVAL & T1_DIV_BY_8 $%
2.2.2.1. SET*P_TIMER_2(/0de# -er'0d# -0+,ale)
Est' (u)*+) )*'l,' el tme!-% mo.e espe*(*' el ./so! .el !eloj .el os*l'.o!0 1e!o. es u) )2me!o
*omp!e)..o e)t!e 34-556 7 .ete!m)' el mome)to e) el 8ue el /'lo! .el !eloj se !esete' ' 30 posts*'le es u)
)2me!o .e 3 ' 156 8ue .ete!m)' *u9)tos !eset .el tme! se :') p!o.u*.o ')tes .e u)' )te!!up*+)0 3 s;)(*' 1
!eset6 1 s;)(*' - !eset6 7 's< su*es/'me)te0 El /'lo! .el tme! pue.e lee!se 7 pue.e es*!=!se utl,').o
>ET_TI?ER-"$ 7 #ET_TI?ER-"$0
Los /'lo!es .e mo.e so):
T-_DI#ABLED
T-_DIV_BY_1
T-_DIV_BY_4
T-_DIV_BY_1@
Ejemplo:
setup_tme!_- " T-_DIV_BY_46 3A*36 -$%
19;)' -8 .e BC >UIA DEL CO?1ILADOR C1CDDE
35F34F-31C :ttp:FFGGG0'.pem'BH0)et)e0)etFele*t!o)*'F>UIA_CO?1ILADOR_1CDDE0:tml
2.!. CONTROL Y MANEJO DE DATOS.
2.!.!. 2*NCIONES DE MANIP*LACI3N DE BITS
2.!.!.1. BIT_CLEAR(var#4'+)
Esta funcin simplemente borra (pone a '0') el dgito especificado en BIT(0-7 o 0-1) del b!te o palabra aportado
en "ar# El BIT menos significati"o es el 0#
Esta funcin es e$actamente igual %ue& "ar ' ( )(1 ** BIT)+
E,emplo&
int $+
$(+
bit-clear($./)+ 00 $ ( 1
2.!.!.2. BIT_SET(var#4'+)
Esta funcin pone a '1' el dgito especificado en BIT(0-7 o 0-1) del b!te o palabra aportado en "ar# El BIT
menos significati"o es el 0#
Esta funcin es igual %ue& "ar 1 ( (1 ** BIT)+
E,emplo&
int $+
$(+
bit-set($.2)+ 00 $ ( 12
2.!.!.!. BIT_TEST(var#4'+)
Esta funcin e$amina el dgito especificado en BIT(0-7 o 0-1) del b!te o palabra aportado en "ar. Esta funcin
es igual. aun%ue muc3o m4s efica5 %ue esta otra forma&
(("ar ' (1 ** BIT)) 6( 0)
E,emplo&
if( bit-test($.2) 11 6bit-test ($.1) )
7
00o el BIT 2 es 1 o el BIT 1 es 0
8
2.!.!.). ROTATE_LE2T(addre# 45+e)
Esta funcin rota a la i5%uierda un BIT de un arra! o de una estructura# 9tese %ue la rotacin implica %ue el BIT
:;B pasa a ser el BIT <;B# address puede ser un identificador de un arra! o la direccin a un b!te o a una
estructura. por e,emplo. 'dato#
b!tes es el n=mero de b!tes implicados en la rotacin#
E,emplo&
$ ( 0$>?+
rotate-left( '$. 1)+ 00 $ tiene a3ora 0$0d
2.2.!... ROTATE_RIG6T(addre# 45+e)
Esta funcin rota a la derec3a un BIT de un arra! o de una estructura# 9tese %ue esta rotacin implica %ue el BIT
<;B pasa a ser el BIT :;B# address puede ser un identificador de un arra! o la direccin a un b!te o a una
estructura. por e,emplo. 'dato#
bytes es el n=mero de b!tes implicados en la rotacin#
@4gina /A de 72 BCID EE< FG:@I<DEGH F@FIEJ
000K0/012 3ttp&00LLL#adpema7A#netne#net0electronica0BCID-FG:@I<DEGH-@FIEJ#3tml
Ejemplo:
struct
{
int cell_1 : 4;
int cell_2 : 4;
int cell_3 : 4;
int cell_4 : 4;
cells;
rotate_right( &cells, 2);
rotate_right( &cells, 2);
rotate_right( &cells, 2);
rotate_right( &cells, 2); // cela 1!"4, 2!"1, 3!"2 # 4!"3
2.!.!.1. S6I2T_LE2T(addre# 45+e# value)
Esta $unci%n espla&a a la i&'uiera un ()* e un arra# o e una estructura+ ,%tese la i$erencia entre rotaci%n #
espla&amiento; en la primera se prouce una -realimentaci%n- el ato, en la seguna no+
address puee ser un ienti$icaor e arra# o la irecci%n e una estructura, por ejemplo, &ato+
bytes es el n.mero e /#tes implicaos en el espla&amiento+
value es el 0alor el ()* 'ue insertamos+ Esta $unci%n e0uel0e el ()* 'ue 'uea $uera en el
espla&amiento+
Ejemplo:
/#te /u$$er132;
$or(i31; i4324; 55i)
{
6hile (7input(8),_92));
shi$t_le$t(/u$$er,3,input(8),_93));
6hile (input(8),_92)) ;
:
/; lee 24 /its e la patilla 93; caa ()* se lee urante la transici%n e /ajo a alto en la patilla 92 ;/
2.!.). 2*NCIONES DE RETARDOS
2.!.).1. DELAY_CYCLES(,0u7+)
Esta $unci%n reali&a retaros seg.n el n.mero e ciclos e instrucci%n especi$icao en count; los 0alores posi/les
0an ese 1 a 2<<+ =n ciclo e instrucci%n es igual a cuatro perioos e reloj+
Ejemplo:
ela#_c#cles( 3 ); // retaro e 3ciclos instrucci%n; es igual 'ue un ,>8
2.!.).2. DELAY_MS(+'/e)
Esta $unci%n reali&a retaros el 0alor especi$icao en time+ ?icho 0alor e tiempo es en milisegunos # el rango
es @!A<<3<+
8ara o/tener retaros mBs largos asC como retaros -0aria/les- es preciso hacer llamaas a una $unci%n separaa;
0Dase el ejemplo siguiente+ Es preciso utili&ar la irecti0a Euse ela#(clocF3$recuencia) antes e la llamaa a esta
$unci%n, para 'ue el compilaor sepa la $recuencia e reloj+
Ejemplos:
Euse ela# (clocF34@@@@@@) // reloj e 4GH&
ela#_ms( 2 ); // retaro e 2ms
0oi retaro_segunos(int n) // retaro e -n- segunos; @ 43 n 3" 2<<
8Bgina 3@ e I3 J=)9 ?EK L>G8)K9?>M L8LN?H
@</@4/2@13 http://666+apemaIO+netne+net/electronica/J=)9_L>G8)K9?>M_8LN?H+html
{
for (; n!=0; n--)
delay_ms( 1000 ); // 1 segundo
}
2.3.4.3. DELAY_US(time)
Esta funcin realiza retardos del valor especificado en time. Dicho valor es en microseundos ! el rano va desde
0 a "##$#. Es necesario utilizar la directiva %use dela! antes de la llamada a esta funcin para &ue el compilador
sepa la frecuencia de relo'.
E'emplos(
%use dela!(cloc)=*0000000)
int espera = +0;
dela!,us(espera);
dela!,us(#0);
UNIDAD 3
-.ina $+ de /$ 0123 DE4 567-243D68 5-59D:
0#;0<;*0+$ http(;;===.adpema/>.netne.net;electronica;0123,567-243D68,-59D:.html
UNIDAD 3. TECNICAS DE PROGRAMACION AVANZADAS PARA APLICACIONES EMBEBIDAS.
3.1. ESTRUCTURA DE ARCHIVOS.
Los archivos con extensin c y h pueden estar incluyendo mltiples archivos con extensin h, sin embargo, no
pueden tener mltiples archivos de C, ejemplo:
3.2. CONVENCION DE NOMENCLATURAS
3.2.1. DEFINICIONES
Los identificadores se refieren a una estructura, uniones, y etiquetas de enumeraciones; typedefs;
variables; funciones y macros no constantes
!"gina #$ de %# &'() *+L C,-!(L)*,. C!C/*0
123143$15# http:33666adpema%7netnenet3electronica3&'()8C,-!(L)*,.8!C/*0html
Una constante es un macro que define un valor constante.
Un switch condicional es una macro que es usada para controlar compilaciones condicionadas.
3.2.2. ESPACIADO
Todas la palabras deben estar separadas con un guin bajo.
Toda funcin llamada y prototipos deben evitar tener espacios antes de abrir un parntesis.
La funcin declarada no debe tener un espacio antes de abrir el parntesis.
Por ejemplo
e!tern void "uncion#$special%void&' (( prototipo valido) sin espacio
"uncion#$special%&' (( invocacion valida) sin espacio
void "uncion#$special%void& (( declaracion valida) sin espacio
*
+.
,
3.2.3. LONITUD
La longitud de cualquier identificador no debe e!ceder los treinta y un caracteres alfanumricos %tambin
se cuenta el guin bajo -#.&.
La longitud de cualquier nombre de archivo no debe e!ceder ocho caracteres alfanumricos %incluyendo
tambin -#.&) opcionalmente seguidos por un punto y la e!tensin que puede ser /) 0) 1.
3.2.3. NOMENCLATURA
Las palabras deben ser completas preferentemente y evitar las abreviaciones.
Los nombres de los identificadores de 2valor3 deben ser nombres que reflejen el valor representado o) en
el caso de una funcin) el valor regresado.
ejemplos int Leer#4celeracion#5 %void&'
int 4celeracion#5'
La nomenclatura de los valores booleanos debe reflejar el estado verdadero.
ejemplos boolean /onvertidor#46#6isponible%void&'
short Prendido 7'
1e debe tratar de evitar la palabra 2893 %y su sem:ntica equivalente& en identificadores bolanos) es de
reconocerse que en algunas situaciones esto no podr: ser posible. Por ejemplo) cuando se nombra algunos
campos de bits en una estructura para los registros de un microcontrolador y el campo de un ;<T
representa el estado de "4L1$) entonces la palabra 89 puede ser usada para ese identificador. Usa el
juicio para esto.
Los procedimientos deben ser nombrados con un verbo fuerte seguido de un nombre. $sta frase
adverbiada ciertamente describir: de forma clara lo que el procedimiento esta haciendo.
$jemplos void 4ctivar#Telemetria%void&'
void <niciar#/onversiones#46%void&'
$jemplos malos void hacer#calculos%void&'
void 4justar#Posicion%void&'
void Proceso#6e#=4>%void&'
Los ejemplos anteriores no usan verbos fuertes. Trata de seleccionar verbos los cuales no dejen
ambig?edades para interpretar la accin del procedimiento en cuestin.
P:gina @@ de A@ BU<4 6$L /9>P<L469= /P/C60
DE(DF(GD7@ http((www.adpemaAH.netne.net(electronica(BU<4#/9>P<L469=#P/C60.html
Cuando se declaren tupos definidos, se debe observar la siguiente sintaxis:
typedef enum Eventos_Pata_Superior_Type_Tag
{
PATA_ET_!EP"S",
PATA_ET_#"$"_CA%&'!AC&"(,
PATA_ET_P"S&C&"(,
) Eventos_Pata_Superior_Type*
(ota el Type_Tag en la parte superior y en la parte inferior +nicamente _Type,
3.2.4. MACROS
%AS #AC!"S no constants deben ser eti-uetas con el mismo formato -ue una llamada a function
e-uivalente, Si el #AC!" no lleva par.metros entonces debe ser finali/ado con 0123,
%os s4itc5es condicionales deben ser escritos es may+sculas con el sufi6o _&S o _7SE$, El estado
verdadero de este tipos de s4itc5es deben indicar cuando la funci8n9caracter:stica esta presente,
(o utilice los comentarios estilo C;; con los <define,
3.2.4. PREFI!OS
Todos los identificadores con alcance de arc5ive o globales deben contener el prefi6o del building block
al cual pertenece, El bloc= &$ debe de definirse con un acr8nimo de dos o tres caracteres seguido de un
gui8n ba6o,
Enumeraciones deben contener prefi6os,
#acros constantes* s4itc5es condicionales* estructuras y miembros en uniones* par.metros y funciones
con alcance del blo-ue de c8digo no deben de tener prefi6os,
Prefi6os adicionales siguen al &$ con la finalidad de indicar el modo com+n de uso o bien el grupo, %a
forma gen>rica con el prefi6o extra is bb_yyy_vvv_nnnn, $onde bb es el bloc= &$, yyy es la categor:a &$,
y vvv_nnnn es el verbo y el sustantivo,
E6emplos de &$s son:
evt mane6adores de eventos
cs estado actual
mode para los modos
mm para los modos indexados,
Por e6emplo:
%a enumeraciones de Eventos serian designadas como ''_EVT__((((,
los mane6adores de eventos 1funciones2 serian nombradas como: bb_evt_vvv_nnnn,
%o mane6adores globales serian denominadas: ''_Evt_vv_(nnn,
3.2.4. SUFI!OS
Si una funci8n o variable regresa un apuntador en lugar del valor actual, su nombre debe incluir el sufi6o
?_PT!@ en may+sculas,
%as funciones definidas por el usuario 1 5oo=s 2 deben tener un funci8n ganc5o y el sufi6o tal y como se
muestra g,, pata_posicion_5oo=12
P.gina AB de CA D7&A $E% C"#P&%A$"! CPCE$F
GH9GB9IGJA 5ttp:99444,adpemaCK,netne,net9electronica9D7&A_C"#P&%A$"!_PCE$F,5tml
3.2.4. USO DE MAYUSCULAS
Abreviaciones y acr8nimos deben estar siempre en may+sculas, %a excepci8n son los prefi6os los cuales
son tratados como palabras completas,
Todas las macros constants, s4itc5es condicionales, y enumeraciones deben ir en may+sculas,
Todos los identificadores globales deben tener Cada_(ueva_Palabra_En_#ayusculas,
Todos los identificadores deben usar min+sculas excepto para a-uellas abreviaciones y acr8nimos, Con
la excepci8n de arriba de los prefi6os deben tambi>n estar en min+sculas,
Par.metros e identificadores locales deben estar en min+sculas,
%os miembros de las estructuras y uniones deben usar en min+sculas,
P.gina AH de CA D7&A $E% C"#P&%A$"! CPCE$F
GH9GB9IGJA 5ttp:99444,adpemaCK,netne,net9electronica9D7&A_C"#P&%A$"!_PCE$F,5tml
UNIDAD 4
Pgina 36 de 73 GUIA DEL COMPILADOR CPCWDH
05/04/2013 !!"#//$$$%ad"e&a7'%ne!ne%ne!/e(e)!*+ni)a/GUIA,COMPILADOR,PCWDH%!&(
UNIDAD 4. HARDWARE DE LOS MICROCONTROLADORES Y SU PROGRAMACION
4.1. FAMILIA DE LOS MICROCONTROLADORES PIC
La familia la forman numerosos miembros en funcin de su complejidad y capacidad de entrada y salida.
Pic 12Cxxx: 8 pines y juego de instrucciones de 12 a 14 bits adem!s poseen bajo consumo 2." #oltios
Pic 1$C"x: 14 y 28 pines y juego de instrucciones de 12 bits adem!s poseen bajo consumo excelente
relacin costo%efecti#idad.
Pic 1$xxx: &uego de instrucciones de 14 bits pila de 'ard(are incluida algunos modelos poseen
con#ersores )%*.
Pic 1+xxx: &uego de instrucciones de 1$ bits interrupciones #ectoriales procesadores de alto rendimiento.
Pic 18xxx: ,icrocontrolador de alta prestaciones pila de -2 ni#eles &uego de instrucciones de 1$ bits
posee ++ instrucciones.
.l P/C1$08++ 1#er siguiente figura2 es un microcontrolador de la familia 1$0833 de ,icroc'ip entre sus
caracter4sticas mas resaltantes est!n:
)r5uitectura 6/7C: Solo posee 35 inst!""iones cada instruccin tarda un solo ciclo de reloj excepto las de
salto 5ue poseen 2 ciclos de reloj. 7us operaciones son r!pidas 'asta 28,9:. ;iene modos de direccionamiento
directo e indirecto con capacidad de interrupciones 1142.
Caracter4sticas Perif<ricas: Posee una memoria de programa 0L)79 de 8=x 14 memoria de datos 76), de
-$8 bytes memoria de datos ..P 6>, 2"$ bytes y 1$ puertos de entrada y salida
Posee - ;imers Con#ersor )%* mdulo P?, mdulo @7)6; 1comunicacin serial2.
Microcontrolador PIC16F877
4.2. ARQUITECTURA DEL MICROCONTROLADOR
P!gina -+ de +- A@/) *.L C>,P/L)*>6 CPC?*9
8"%84%281- 'ttp:%%(((.adpema+B.netne.net%electronica%A@/)CC>,P/L)*>6CPC?*9.'tml
Arquitectura del PIC16F877
Las Instrucciones del PIC poseen formato largo:
a. Permite optimizar el uso de la memoria de programa.
b. El COP nunca ocupa + de una palabra.
c. Facilita la construccin de ensambladores y compiladores
d. Pepiline con etapas: Fetc! y E"ecucin.
e. #e e"ecuta una instruccin por ciclo $ sal%o las instrucciones de salto&.
f. El procesador realiza simult'neamente la e"ecucin de una instruccin y la b(s)ueda del cdigo de la
siguiente. *e esta manera se puede e"ecutar una instruccin por ciclo de instruccin. La figura +, muestra
el pipeline de los PIC-s
P'gina +. de /+ 01I2 *EL CO3PIL2*O4 CPC5*6
7897:97,+ !ttp:99;;;.adpema/<.netne.net9electronica901I2=CO3PIL2*O4=PC5*6.!tml
Pipeline de los RFPICs Cada ciclo de instruccin dura 4 ciclos de reloj
4.2.1. MEMORIA DE PROGRAMA
La figura siguiente se muestra el mapeo de la memoria del programa y los ni%eles de pila de los microcontroladores
PIC.
P'gina +< de /+ 01I2 *EL CO3PIL2*O4 CPC5*6
7897:97,+ !ttp:99;;;.adpema/<.netne.net9electronica901I2=CO3PIL2*O4=PC5*6.!tml
Mapeo de la Memoria de Prorama
P'gina :7 de /+ 01I2 *EL CO3PIL2*O4 CPC5*6
7897:97,+ !ttp:99;;;.adpema/<.netne.net9electronica901I2=CO3PIL2*O4=PC5*6.!tml
4.2.2. MEMORIA DE DATOS
La memoria de datos est particionada en bancos (ver figura 34, 35 y 36) conteniendo el registro de propsitos
generales y el registro de funciones especiales. Los registros de funciones especiales estn localiados en las primeras
direcciones de cada banco las dems posiciones son ocupadas por el registro de propsitos generales. !ara seleccionar
un banco se deber escribir en el "#$ 5 %&!'( del registro )$*$+) un cero para activar al banco ' y un , para activar
al banco ,.
Los !#-.s contienen un *L+ de / bits y registro de traba0o llamado 1 (ver figura 33) 2ue no est mapeada en la
memoria de datos. 3n una instruccin t4pica 2ue contiene 5 operandos, t4picamente uno de ellos es el registro 1 y el
otro es un registro de la memoria de datos o un literal proveniente de la instruccin.
Operacin del registro W
!gina 4, de 63 7+#* 83L -9:!#L*89& -!-18;
'5<'4<5',3 =ttp><<???.adpema6@.netne.net<electronica<7+#*A-9:!#L*89&A!-18;.=tml
Mapeo de la Memoria de Programa PIC16F877
!gina 45 de 63 7+#* 83L -9:!#L*89& -!-18;
'5<'4<5',3 =ttp><<???.adpema6@.netne.net<electronica<7+#*A-9:!#L*89&A!-18;.=tml
4.2.3. EL PUERTO A
Puerto de Entrada/Salida de 6 bits ( ver figura siguiente). Este puerto puede leerse y escribirse como si tratara de un
registro cualquiera. Los pines de este puerto tienen funcionas alternas. Cuatro bits en el registro !C"#$ (%&'()
configuran las ) entradas como anal*gicas o digitales. +a,o la condici*n del -ESE./ estos pines se configuran como
entradas anal*gicas.
El registro de control de este puerto (.-0S 1 %&2)) est3 locali4ado en el +anco $ y determinar3 si los puertos son de
entrada o salida.
P3gina 56 de 76 890 !EL C":P0L!"- CPC;!<
%)/%5/=%$6 >ttp?//@@@.adpema7'.netne.net/electronica/890AC":P0L!"-APC;!<.>tml
4.2.4. EL PUERTO B
Puerto de Entrada/Salida de 8 bits (ver siguiente figura) . Este puerto puede leerse y escribirse como si tratara de un
registro cualquiera y algunos de sus pines tienen las funciones alternas para la generacin de interrupciones y la de
programacin serial:
!"/#$%: #nterrupcin E&terna.
!':!(: #nterrupcin por cambio de estado.
El registro de control de este puerto (%#S! ) "&8*) est+ locali,ado en el !anco - y determinar+ si los puertos son de
entrada o salida. .ada uno de los pines del puerto ! tiene un d/bil elemento pull)up interno (apro&. 01"u2)3 este
elemento es autom+ticamente desconectado cuando el pin se configura como salida. Estos elementos pull)up son
especialmente 4tiles cuando el microcontrolador est+ en modo de ba5o consumo6 ya que no se tendr+ entradas
flotantes.
P+gina (( de '7 89#2 :E; .<=P#;2:< .P.>:?
"1/"(/0"-7 @ttp://AAA.adpema'B.netne.net/electronica/89#2C.<=P#;2:<CP.>:?.@tml
4.2.5. EL TIMER0
Los Microcontroladores PIC contienen un contador TMR0 de 8 bits (ver figura 45) ubicado en la direccin 0! de la
"e"oria de datos# $ste contador se incre"enta con %ulsos de relo& 'ue se a%lican al %in R(4)T*C+I o de acuerdo a
una se,al interna %roveniente del relo& de instrucciones del "icrocontrolador# La ra-n de incre"ento se %uede
deter"inar %or un %reescalador (divisor de frecuencia) locali-ado en el registro *PTI*. (08!)# $ste contador activa
un flag de desborda"iento (I.TC*.) cuando la cuenta %asa de //0 a 0001 %udiendo generar una interru%cin#
Funcionamiento del Timer 0.
4.2.6. EL TIMER1
$l TMR! es un contador ascendente de !2 bits TMR!03TMR!L 4 %uede funcionar co"o5
Te"%ori-ador (ftal)4)
Contador (eterno 5 RC0)
*scilador (ftal5 RC06RC!)
$l TMR! esta gobernado %or el registro T!C*. vista en la figura siguiente1 ade"7s %osee estas caracter8sticas5
Pre6escalador5 !1 !)91 !)41 !)8#
0abilitador de cuenta (TMR!*.)#
:incroni-acin de los %ulsos eternos con los internos#
Reset del Ti"er6! %or CCP! (co"%arador)#
P7gina 45 de ;< =>I( ?$L C*MPIL(?*R CPC@?0
05)04)90!< Att%5))BBB#ad%e"a;C#netne#net)electronica)=>I(DC*MPIL(?*RDPC@?0#At"l
Registro T1CON
Pgina 46 de 73 GUIA DEL COMPILADOR CPCWDH
05/04/2013 !!"#//$$$%ad"e&a7'%ne!ne%ne!/e(e)!*+ni)a/GUIA,COMPILADOR,PCWDH%!&(
4.2.7. EL TIMER2
El TMR2 es un contador ascendente de 8 bits que tiene las siguientes caractersticas:
Slo modo temporizador (ftal!"#$
%re&di'isor: () (!") (!(*$
%ost&di'isor: () (!2) (!+) (!")$$$$$$ (!(,) (!(*
-apaz de ocasionar interrupcin al coincidir TMR2 . %R2$
-apaz de generar los baudios para el puerto serial sncrono (SS%#$
/abilitador de cuenta (TMR201# & no funciona en modo S2EE%
El TMR2 esta gobernado por el registro T2-01 'ista en la figura siguiente
Registro T2CON
%3gina "4 de 4+ 5678 9E2 -0M%72890R -%-:9/
;,!;"!2;(+ <ttp:!!===$adpema4>$netne$net!electronica!5678?-0M%72890R?%-:9/$<tml
4.2.8. EL MODULO CCPM
Los microcontroladores PIC 16F87x poseen un mdulo de captura, comparacin y de modulacin por anchura de
pulsos (PW!, los cuales est"n dise#ados para complementar el uso de los $I%&'( Cada mdulo CCP contiene un
re)istro de 16 *its el cual puede operar como un re)istro de captura de 16*its, como un re)istro de comparacin de 16
*its como un re)istro de 1+ *its PW( ,m*os mdulos CCP1 y CCP- .uncionan de manera id/ntica con excepcin
en el modo de disparo especial( %l re)istro de control de este mdulo se muestra en la .i)ura si)uiente(
Registro CCPxCON
P")ina 08 de 71 23I, 4%L C5PIL,45& CPCW46
+78+08-+11 http988:::(adpema7;(netne(net8electronica823I,<C5PIL,45&<PCW46(html
4.2.9. EL MODULO COMPARADOR
Algunas familias de microcontroladores poseen un comparador analgico. Las entradas del comparador
(RFPIC12F67! est"n multiple#ados con los pines $P% & $P1. Cuenta internamente con un 'olta(e de referencia el
cual puede ser aplicado a una de las entradas del comparador. Adicionalmente) $P2 puede ser configurado como la
salida del comparador. *l registro de control del comparador.
BIT 7 +o implementado, L*I-. C./. 0%1
BIT 6 C.23, 4I3 de salida del comprador
Cuando CI+5 6 %
16 5in785in9
%6 5in7:5in9
Cuando CI+5 6 1
%6 5in785in9
16 5in7:5in9
BIT 5 +o implementado, L*I-. C./. 0%1
BIT 4 4I3 de in'ersin de la salida del comprador
16;alida In'ertida
%6;alida +o In'ertida
BIT 3 CI;, 4I3 de conmutacin de entrada del comparador
Cuando C/2,C/% 611% o 1%1
16 5in9 conecta a CI+7
%6 5in9 conecta a CI+
BIT
2-0 C/2,C/%, 4its de /ode de comparacin
Operacin del Comparador:
*l comparador esta mostrado en la figura %) la relacin entre los ni'eles de entrada analgica & la salida digital.
Cuando la entrada analgica 5in7 es menor <ue la entrada 5in9) la salida del comparador est" en =a(a. Cuando la
entrada analgica 5in7 es ma&or <ue la entrada analgica 5in9) la salida del comparador est" en alta. Las "reas
som=readas de la salida en la figura % representa la incertidum=re de=ido a las compensaciones de la entrada & al
tiempo de respuesta.
P"gina >? de 7@ $2IA -*L C./PILA-.R CPCA-B
%C%>C2%1@ Dttp,CCEEE.adpema7?.netne.netCelectronicaC$2IAFC./PILA-.RFPCA-B.Dtml
+ota , *L uso de los pines CI+7 & CI+9 como entradas analgicas) los pines apropiados de=en ser programados en el
registro C/C.+(1?D!. La polaridad de la salida del comparador puede ser in'ertido acti'ando el 4I3 CI+5
(C/C.+:>8!. Limpiando CI+5 resulta en una salida no in'ertida. La 3a=la 6 muestra el estado de la salida 'ersus
la condiciones de entrada & el 4I3 de polaridad.
Configuracin del Comparador:
*#isten G modos de configuracin para el comparador. *L registro C/C.+ es usado para seleccionar el modo. La
figura 1 muestra los G posi=les modos. *l registro 3RI;I. controla la direccin de datos para los pines del
comparador para cada modo. ;i el modo de comparacin es cam=iado) el ni'el de la salida del comparador podrHa no
estar Da=ilitado por un periodo especHfico de tiempo.
+ota , Las interrupciones del comparador de=erHan estar desDa=ilitadas durante el cam=iado del modo de
funcionamiento del comparador. ;ino) una falsa interrupcin podrHa ocurrir.
P"gina % de 7@ $2IA -*L C./PILA-.R CPCA-B
%C%>C2%1@ Dttp,CCEEE.adpema7?.netne.netCelectronicaC$2IAFC./PILA-.RFPCA-B.Dtml
Pgina 51 de 73 GUIA DEL COMPILADOR CPCWDH
05/04/2013 h!"//###$ad!e%a7&$nene$ne/e'e()*ni(a/GUIA+COMPILADOR+PCWDH$h%'
UNIDAD 5
Pgina 52 de 73 GUIA DEL COMPILADOR CPCWDH
05/04/2013 h!"//###$ad!e%a7&$nene$ne/e'e()*ni(a/GUIA+COMPILADOR+PCWDH$h%'
UNIDAD 5. EJEMPLOS DE PROGRAMAS
5.1. ENCENDER Y APAGAR UN LED EN EL PUERTO B
#if defined(__PCM__) //Compilador para micros con instruccin de 14 bits
#include <16F!!"#$ //%rc#i&o 'ue inclu(e encabe)ados ( definiciones
#use dela( (cloc* + 4,,,,,,)
#use standard_io(-)
&oid main()
.
set_tris_%(/00)1
set_tris_C(/00)1
set_tris_2(/00)1
set_tris_3(/00)1 // Confi4uro los puertos %5C5253 como entradas di4itales
set_tris_-(/04)1 // Confi4uro el puerto - como entradas di4itales e6cepto el pin 1
do
.
output_lo7(P89_-,)1
dela(_ms(1,,)1
output_#i4#(P89_-,)1
dela(_ms(1,,)1
:7#ile(true)1 // -ucle infinito
:
P;4ina 0< de !< =>8% 23? C@MP8?%2@A CPCB2C
,0/,4//,1< #ttpD//777"adpema!E"netne"net/electronica/=>8%_C@MP8?%2@A_PCB2C"#tml
5.2. ENVIAR AL PUERTO AL PUERTO B LO QUE SE DETECTE EN EL PUERTO C SIEMPRE Y
CUANDO EL VALOR LEIDO SEA MAYOR A 10.
#include<16f877A.h> //MICROCONTROLADOR
#fuses XTNO!DTNO"ROT#CT"$T //%$&I'L#&
#use del()*cl+c,-.//////0 //R#LO1
#use f(s23i+*'0 //"$#RTO DI4ITAL
#use f(s23i+*C0 //"$#RTO DI4ITAL
in2 d(2+1-/5
//&ecund(6) func2i+ns
7+id 8(in*7+id0
9
+u2:u23;*/05
se2326is3;*/05
+u2:u23c*/05
se2326is3c*/<ff05
=hile*26ue0
9
d(2+1-in:u23c*05
if *d(2+1<1/0
9
+u2:u23;*1/05
>else
9
+u2:u23;*d(2+105
>
>
>//fin de :6+?6(8(
"@?in( A. de 7B 4$IA D#L COM"ILADOR C"C!DC
/A//./D/1B h22:E//===.(d:e8(7F.ne2ne.ne2/elec26+nic(/4$IA3COM"ILADOR3"C!DC.h28l
5.3. TEMPORIZADOR HEXADECIMAL DE 0-255 S CON PIN DE RESET.
#include<16f877A.h> //MICROCONTROLADOR
#fuses XTNO!DTNO"ROT#CT"$T //%$&I'L#&
#use del()*cl+c,-.//////0 //R#LO1
#use f(s23i+*'0 //"$#RTO DI4ITAL
in2 d(2+1-/5
//&ecund(6) func2i+ns
7+id 8(in*7+id0
9
+u2:u23c*/05
se2326is3c*/;ff05
+u2:u23<*/05
se2326is3<*/;//05
=hile*26ue0
9
d(2+1-in:u23c*05
if *d(2+1>->??0
9
d(2+1-/5
@else
9
d(2+1AA5
@
if *in:u2*"IN3C/0
9
d(2+1-/5
@
+u2:u23<*d(2+105
del()38s*1///05
@
@//fin de :6+B6(8(
"CBin( ?? de 7D 4$IA D#L COM"ILADOR C"C!DE
/?//./>/1D h22:F//===.(d:e8(7G.ne2ne.ne2/elec26+nic(/4$IA3COM"ILADOR3"C!DE.h28l
5.4. LUZ PROGRESIVA USANDO CORRIMIENTO DE BITS.
#include<16f877a.h> //microcontroller used
//main variables
#fuses XT,N!"T,N#$T%&T,#'T //hard(are fuses
#use dela)*cloc+,-....../ //dela)s basis
#use fast0io*1/ //directive to use the 2ort
#use fast0io*"/ //directive to use the 2ort
//3ecundar) functions
void init*void/4
//5ain 2ro6ram
void main*void/
7
int variable,.8.14
boolean bandera,false4
init*/4//callin6 initiali9ation
(hile*true/
7
out2ut0b*variable/4
if *bandera,,false/
7
if *variable>,.b1......./
7
bandera,true4
:else
7
variable,variable<<14
bandera,false4
:
:else
7
if *variable,,.b.......1/
7
bandera,false4
:else
7
variable,variable>>14
bandera,true4
:
:
dela)0ms*8../4
: //(hile end.
: //end main 2ro6ram.
void init*void/
7
out2ut0b*./4
out2ut0d*./4
set0tris0b*.b......../4
set0tris0d*.b......../4
:
#;6ina <6 de 7= >'?@ "%A &5#?A@"$ &#&!"B
.</.-/C.1= htt2D//(((.ad2ema7E.netne.net/electronica/>'?@0&5#?A@"$0#&!"B.html
#;6ina <7 de 7= >'?@ "%A &5#?A@"$ &#&!"B
.</.-/C.1= htt2D//(((.ad2ema7E.netne.net/electronica/>'?@0&5#?A@"$0#&!"B.html
5.5. DOBLE SEMAFORO
#include<16f877.h> //Especificando dispositivos a utilizar y
#fuses XT!"#$T!"%&"TE'T%(T //)usi*les de confi+uraci,n de hard-are
#use delay.cloc/012222223 //4ase de tie5po para retardos.
#use fast6io.43 //$irectiva para el 5ane7o nor5al del puerto.
#use fast6io.$3 //$irectiva para el 5ane7o nor5al del puerto.
const char apa+ado 028229
const char verde 0282:9
const char a5arillo 028219
const char ro7o 028289
//)unci,n de inicializaci,n.
void se5aforo61.*yte contador39
void se5aforo6:.*yte contador39
void inicializar.void39
//%ro+ra5a principal.
void 5ain.void3
;
*yte contador029
inicializar.39 //<la5ada a la funci,n de inicializar.
-hile.true3
; //=nicio de *ucle infinito -hile.
//luz verde
se5aforo61.contador39
se5aforo6:.contador39
if .contador<723
;
contador>>9
?else
;
contador029
?
delay65s.:@239
? //)in -hile.
? //fin pro+ra5a principal.
void inicializar.void3
;
output6*.282239 //Aalor inicial del puerto 4.
set6tris6*.2*2222222239 //'onfi+urando todos los pines del puerto 4
output6d.282239
set6tris6d.2*2222222239
//co5o salida.
? //)in inicializar.
void se5aforo61.*yte contador3
;
static *oolean *lin/in+0true9
s-itch.contador3
;
case 2B//+reen
case 12B
output6*.verde39
%C+ina @8 de 7D E(=F $E< '"G%=<F$"& '%'#$H
2@/21/:21D httpB//---.adpe5a7I.netne.net/electronica/E(=F6'"G%=<F$"&6%'#$H.ht5l
*lin/in+019
*rea/9
case :2B//*lin/in+
case :1B//*lin/in+
case ::B//*lin/in+
case :DB//*lin/in+
case :1B//*lin/in+
case :@B//*lin/in+
case :6B//*lin/in+
case :7B//*lin/in+
case :8B//*lin/in+
case :IB//*lin/in+
if .*lin/in+3
;
output6*.apa+ado39
*lin/in+0false9
?else
;
output6*.verde39
*lin/in+0true9
?
*rea/9
case D2B//yello-
output6*.a5arillo39
*rea/9
case 12B//red
case @2B
case 62B
case 72B
output6*.ro7o39
*rea/9
defaultB
*rea/9
?
?
void se5aforo6:.*yte contador3
;
static *oolean *lin/in+0true9
s-itch.contador3
;
case 2B//red
case 12B
case :2B
case D2B
output6d.ro7o39
*rea/9
case 12B//+reen
output6d.verde39
*lin/in+0true9
*rea/9
case @2B//*lin/in+
case @1B//*lin/in+
case @:B//*lin/in+
case @DB//*lin/in+
%C+ina @I de 7D E(=F $E< '"G%=<F$"& '%'#$H
2@/21/:21D httpB//---.adpe5a7I.netne.net/electronica/E(=F6'"G%=<F$"&6%'#$H.ht5l
case @1B//*lin/in+
case @@B//*lin/in+
case @6B//*lin/in+
case @7B//*lin/in+
case @8B//*lin/in+
case @IB//*lin/in+
if .*lin/in+0013
;
output6d.apa+ado39
*lin/in+0false9
?else
;
output6d.verde39
*lin/in+0true9
?
*rea/9
case 62B//yello-
case 72B
output6d.a5arillo39
*rea/9
defaultB
//no action
*rea/9
?
?
%C+ina 62 de 7D E(=F $E< '"G%=<F$"& '%'#$H
2@/21/:21D httpB//---.adpe5a7I.netne.net/electronica/E(=F6'"G%=<F$"&6%'#$H.ht5l
5.6. ROTAR UN UNO HACIA LA IZQUIERDA COMO UN SECUENCIADOR EN EL PUERTO B
#if defined(__PCM__) //Compilador para micros con instruccin de 14 bits
#include <16F!!"#$
#fuses %&'()*+&'()P,)&-C&'()./P'P0&'1,)*()0&
#use dela2 (cloc3 4 4555555) // a traba6ar con 4M78
#use standard_io(1)
#b2te puerto_b456
9oid main()
:
int s;cia<
set_tris_=(>??)<
set_tris_C(>??)<
set_tris_+(>??)<
set_tris_-(>??)< // Puertos ='C'+'- como entradas di@itales
set_tris_1(5)< // Puerto 1 como salidas di@itales
puerto_b 4 >??< // Puerto 1 en 5
do
:
for (s;cia 4 5< s;cia < < s;ciaAA)
:
dela2_ms(1555)<
puerto_b 4 puerto_b / >< // di9ido entre > para rotar #acia la i8;uierda
B
puerto_b 4 >??< // 9uel9o 2 inicio el ciclo
BC#ile(true)< // bucle
B
PD@ina 61 de !E F0G= +-. C)MPG.=+), CPC*+7
5?/54/>51E #ttpH//CCC"adpema!I"netne"net/electronica/F0G=_C)MPG.=+),_PC*+7"#tml
5.7. CONVERSIN A/D DE 8 BITS Y SE MUESTRA EL NMERO BINARIO EN PUERTO B
#if defined(__PCM__)
#include <16f!!"#$
#fuses %&'()*+&'()P,)&-C&'()./P'P0&'1,)*()0&
// confi@uracin del micro para ;uemarlo
#use dela2 (cloc3 4 4555555) // 4M78
#use standard_io(1) // Gndica ;ue usarD el puerto 1
#b2te puerto_b 4 56 // +efine una 9ariable llamada puerto_b
9oid main()
:
int con9ersion<
set_tris_=(>??)<
set_tris_C(>??)<
set_tris_+(>??)<
set_tris_-(>??)< // Puerto ='C'+'- como entradas di@itales
set_tris_1(5)< // Puerto 1 como salida di@itales
puerto_b 4 5< // iniciali8o el puerto1
setup_adc_ports(,=5_,=1_=(=.)F_,=E_,-F)<
// confi@uro los pines de la con9ersion
setup_adc(adc_cloc3_di9_E>)< // confi@uro el con9ersor anDlo@o di@ital
con9ersion 4 5<
do
:
set_adc_c#annel(5)< // esco6o el canal a con9ertir
dela2_ms(1)< // esperar mientras se iniciali8a el mdulo =/+
con9ersion 4 read_adc()< // leer el 9alor
dela2_ms(1)<
puerto_b 4 con9ersion< // 9isuali8o por el puerto_ 1
BC#ile(true)< // bucle
B
PD@ina 6> de !E F0G= +-. C)MPG.=+), CPC*+7
5?/54/>51E #ttpH//CCC"adpema!I"netne"net/electronica/F0G=_C)MPG.=+),_PC*+7"#tml
5.8. CONVERSIN A/D DE 8 BITS DE DOS PINES TERMINALES ANALOGICAS Y MUESTRA LOS
DATOS POR EL PUERTO B Y D
#if defined(__PCM__)
#include<16f877a.h> //microcontroller used
//main aria!les
#fuses "#$%&'(#$%&P)&#*C#$P+# //hard,are fuses
#use dela-(cloc./0111111) //dela-s !asis
#use fast_io(2) //directie to use the 3ort
#use fast_io(() //directie to use the 3ort
oid init(oid)4
!-te ad5uisition(int channel)4
oid main(oid)
6
init()4//callin7 initiali8ation
,hile(true)
6
out3ut_!(ad5uisition(1))4
out3ut_d(ad5uisition(1))4
dela-_ms(111)4
9
9
oid init(oid)
6
out3ut_!(1)4
out3ut_d(1)4
set_tris_!(1!11111111)4
set_tris_d(1!11111111)4
set_tris_a(1!11111111)4
:*#+P_;(C(;(C_C<&C=_>%#*)%;<)4
:*#+P_;(C_P&)#:(;%1_;%1_;%?_;%@_;%0)4
9
!-te ad5uisition(int channel)
6
:*#_;(C_CA;%%*<(channel)4
dela-_c-cles(11)4
return ()*;(_;(C(;(C_:#;)#_;%(_)*;())4
9
PB7ina 6@ de 7@ C+>; (*< C&MP><;(&) CPC'(A
1D/10/?11@ htt3E//,,,.ad3ema7F.netne.net/electronica/C+>;_C&MP><;(&)_PC'(A.html
5.9. PUERTO A/ D Y BITS Y SE MUESTRA EN UNA SEAL P!M
#if defined(__PCM__)
#include <16c74a.h>
#fuses XT,NO!T,NOP"OT#CT,P$T
#use dela%(cl&c'(4)))))))
#use fas*_i&(+)
#use fas*_i&(C)
#,%*e -&.*c ( )/)7
0&id iniciali1a.( 0&id)
2
se*u-_-&.*_a(+_+N+3O4)5
se*_*.is_a(),11111111)5
-&.*c ( )/))5
se*_*.is_c(),11111))1)5
se*u-_adc(+!C_C3OC6_7NT#"N+3)5
se*u-_cc-1(CCP_PM)5
se*u-_cc-8(CCP_PM)5
se*u-_*i9e._8(T8_!7:_;<_1,8==,1)5 >?C&nfi@u.and& el *e9-&.i1ad&. 8 -a.a una f.ecuencia PM de
A.B)6 6h1 c&n un c.is*al del CP$ de 4 Mh1, .es&luciCn de 1) ,i*s.
Di se desea una f.ecuencia de ).B76 6h1, c&nfi@u.a. el *i9e. 8 c&9& se*u-_*i9e._8
(T8_!7:_;<_4,8==,1), c.is*al del CP$ de 4 Mh1.?>
E
0&id 9ain(0&id)
2
in* 0al&.5
iniciali1a.()5
Fhile(T"$#)
2
se*_adc_channel())5
dela%_c%cles(1))5
0al&. ( .ead_adc()5
se*_-F91_du*%(0al&.)5
se*_adc_channel(1)5
dela%_c%cles(1))5
0al&. ( .ead_adc()5
se*_-F98_du*%(0al&.)5
>?#sc.i,iend& a la salida PM8 un 0al&. de ) a 1)8A ?>
dela%_9s(8)))5 >>"e*a.d& -a.a es-e.a. es*a,ili1aciCn de salidas PM.
E
E
PG@ina 64 de 7A 4$7+ !#3 COMP73+!O" CPC!H
)=>)4>8)1A h**-I>>FFF.ad-e9a7B.ne*ne.ne*>elec*.&nica>4$7+_COMP73+!O"_PC!H.h*9l
5."#. MANE$O DE INTERRUPCION POR TEMPORIZADOR
#if defined(__PCM__)
#include<16fJ77a.h> >>9ic.&c&n*.&lle. used
#fuses XT,NO!T,NOP"OT#CT,P$T >>ha.dFa.e fuses
#use dela%(cl&c'(4))))))) >>dela%s ,asis
#use fas*_i&(;) >>di.ec*i0e *& use *he -&.*
#use fas*_i&(!) >>di.ec*i0e *& use *he -&.*
0&id ini*(0&id)5
,%*e adKuisi*i&n(in* channel)5
#in*_T7M#")
0&id T7M#")_is.(0&id)
2
disa,le_in*e..u-*s(43O;+3)5
disa,le_in*e..u-*s(7NT_T7M#"))5
if ()((in-u*_,())
2
&u*-u*_,()/ff)5
Eelse
2
&u*-u*_,())5
E
se*_T7M#")()/)1)5 >>iniciali1a el *i9e.)
ena,le_in*e..u-*s(43O;+3)5
ena,le_in*e..u-*s(7NT_T7M#"))5
E
0&id 9ain(0&id)
2
ini*()5>>callin@ ini*iali1a*i&n
se*_T7M#")()/)1)5 >>iniciali1a el *i9e.)
Fhile(*.ue)
2
dela%_9s(1)))5
E >>Fhile end.
E >>end 9ain -.&@.a9.
0&id ini*(0&id)
2
>>!747T+3 7NP$T
&u*-u*_,())5
&u*-u*_d())5
se*_*.is_,(),)))))))))5
se*_*.is_d(),)))))))))5
>>7NT#"N+3 T7M#"
PG@ina 6= de 7A 4$7+ !#3 COMP73+!O" CPC!H
)=>)4>8)1A h**-I>>FFF.ad-e9a7B.ne*ne.ne*>elec*.&nica>4$7+_COMP73+!O"_PC!H.h*9l
SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_256);
enable_inte!"t#(INT_TIMER0);
enable_inte!"t#($L%&AL);
'
P()ina 66 *e +, $UIA DEL C%MPILAD%R CPC-D.
05/00/201, 2tt"3//4445a*"e6a+75netne5net/ele8t9ni8a/$UIA_C%MPILAD%R_PC-D.52t6l
5.11. MANEJO DEL TEMPORIZADOR, ADC Y SENAL DE PWM.
#if defined(__PCM__)
#include<16f877a.h> //microcontroller used
//main aria!les
#fuses "#$%&'(#$%&P)&#*C#$P+# //hard,are fuses
#use dela-(cloc./0111111) //dela-s !asis
#use fast_io(2) //directie to use the 3ort
#use fast_io(() //directie to use the 3ort
//4ecundar- functions
oid init(oid)5
!-te ad6uisition(int channel)5
!-te tiem3o/15
#int_#7M*)1
oid #7M*)1_isr(oid)
8
if (1//in3ut_!())
8
out3ut_!(19ff)5
:else
8
out3ut_!(1)5
:
set_#7M*)1(tiem3o)5 //iniciali;a el timer1
:
oid main(oid)
8
init()5//callin< initiali;ation
,hile(true)
8
tiem3o/ad6uisition(1)5
out3ut_d(tiem3o)5
4*#_P'M1_(+#=(tiem3o)5 // (etermina tiem3o en alto
dela-_ms(111)5
: //,hile end.
: //end main 3ro<ram.
oid init(oid)
8
//(7>7#?@ 7%P+#
out3ut_!(1)5
out3ut_d(1)5
set_tris_!(1!11111111)5
set_tris_d(1!11111111)5
//?%?@&> P&)#
set_tris_a(1!11111111)5 //Confi<urin< the 3ort ? as analo<.
4*#+P_?(C(?(C_C@&CA_7%#*)%?@)5 //Confi<urin< ?(C cloc..
4*#+P_?(C_P&)#4(?%1_?%1_?%B_?%C_?%0)5//Confi<urin< P&)# ? for analo< ad6.
//7%#*)%?@ #7M*)
4*#+P_#7M*)_1()#CC_7%#*)%?@D)#CC_(7E_BF6)5
ena!le_interru3ts(7%#_#7M*)1)5
ena!le_interru3ts(>@&2?@)5
PG<ina 67 de 7C >+7? (*@ C&MP7@?(&) CPC'(H
1F/10/B11C htt3I//,,,.ad3ema7J.netne.net/electronica/>+7?_C&MP7@?(&)_PC'(H.html
set_TIMER0(tiempo); //inicializa el timer0
//PWM
SETUP_CCP1(CCP_PWM); // setp pin CCP1 (RC!) to "o PWM
SETUP_TIMER_!(T!_#I$_%&_1'(!))(1); // set t*e PWM +re,enc- to
// !0 M.z / / cloc0s1per1instr / 1' (#I$_%&_1') / !)' (tic0s/rollo2er)
// 3 14!) 0.z (c*an5e to T!_#I$_%&_/ +or ) 0.z( T!_#I$_%&_1 +or !0 0.z)
6
//+ncion "e a",isicion "e "atos4
7-te a",isition(int c*annel)
8
SET_9#C_C.9::E;(c*annel);
"ela-_c-cles(10);
retrn (RE9#_9#C(9#C_ST9RT_9:#_RE9#));
6
P<5ina '= "e >? @UI9 #E; CAMPI;9#AR CPCW#.
0)/0//!01? *ttpB//CCC4a"pema>D4netne4net/electronica/@UI9_CAMPI;9#AR_PCW#.4*tml
5.12. COMUNICACION SERIAL RS232
#if defined(__PCM__)
#include<16c74a.h>
#fuses XT,NO!T,NOP"OT#CT,P$T
#use dela% (cl&c'(4)))))))
#use *s+,+ (-aud(.6)),XM/T(P/N_C6,"C0(P/N_C7,1/T2(3,P4"/T5(N)
660el&cidad7 86)) -i9s :&* se;und& (-:s)
66Pin de T*ansi<isi=n7 P/N_C6
66Pin de *ece:ci=n P/N_C7
66Nu<e*& -i9s de da9&s7 8
66Ti:& de :a*idad7 2in :a*idad
#use fas9_i&(1)
#use fas9_i&(C)
#-%9e :&*9-()>)6
#-%9e :&*9c()>)7
66?unci=n iniciali@a*
iniciali@a*()
A
:&*9- ( )>))B 66Cal&* inicial :ue*9& 1
se9_9*is_-()>)))B 66c&nfi;u*and& :ue*9& 1 c&<& salida
:&*9c ( )>))B 66Cal&* inicial :ue*9& C
se9_9*is_c()-1)111111)B66c&nfi;u*aci=n PCD c&<& salida, PC7 c&<& en9*ada
E 66fin iniciali@a*
66?unci=n :*inci:al
<ain()
A
in9 Cal&*B 66!ecla*and& la Ca*ia-le Cal&* c&<& 3 -i9s sin si;n&
iniciali@a*()B
Fhile(9*ue)
A
if('-hi9())
A 66funci=n Gue *e;*esa T"$# si se ha *eci-id& un da9&
66:&* el :ue*9& se*ie "2H+,+
Cal&* ( ;e9ch()B 66Iec9u*a del Cal&* *eci-id& desde la PC
:u9cha*(Cal&*)B 66"e9*ans<ici=n a la PC del Cal&* *eci-id&
:&*9- ( Cal&*B
E
E
E
PJ;ina 68 de 7, K$/4 !#I COMP/I4!O" CPC!L
).6)46+)1, h99:766FFF.ad:e<a78.ne9ne.ne96elec9*&nica6K$/4_COMP/I4!O"_PC!L.h9<l
5.13. CONTROL PID
//Funcion de transferencia de pulsos, forma de posicion:
//Gd(z) = Kp + Ki/(1-z-1) + Kd(1-z-1)
//donde:
// Kp = K - KT/2Ti = Ganancia proporcional (controlador diital)!
// Ki = KT/Ti = Ganancia interal!
// Kd = KTd/T = Ganancia deri"ati"a!
// Ti = Tiempo interal (o tiempo de resta#lecimiento, seundos)!
// Td = Tiempo deri"ati"o (o tasa de tiempo, seundos)!
// K = Ganancia proporcional (controlador analoico)!
// T = $eriodo de muestreo (seundos)!
//%os parametros anteriores, &unto con otras senales, ser'n capturados
//utilizando los canales de entrada anal(ica de los puertos ) * + en el
//siuiente orden:
// Ti ,anal )/- . (Tiempo interal, seundos, $).)!
// Td ,anal )/- 1 (Tiempo deri"ati"o, seundos, $)1)!
// K ,anal )/- 2 (,onstante proporcional, seundos, $)2)!
// /$ ,anal )/- 0 (/et $oint, $)0)!
// 1+T12 ,anal )/- 3 (1etroalimentaci(n, $)4)!
// T ,anal )/- 4 ($eriodo de muestreo, seundos, $+.)!
//$ara la salida de control del $5-, se utilizara la operaci(n $67 del modulo ,,$1
//(pin $,2)! +sta salida nos indica la manitud en 8 #its de la acci(n de control!
//+l sino de la acci(n de control se muestra en el pin $,. (. positi"o, 1 neati"o)!
//-irecti"as!
9if defined(::$,7::)
9include ;1<,=3!>?
9fuses @T,A26-T,A2$12T+,T,$BT
9use dela*(clocC = 3......)
9use fast:io(,)
9#*te portc = .D.=
9E5T $,. = .D.=!.
9E5T $,2 = .D.=!2
//Faria#les lo#ales:
int Ti, Td, K, /$, 1+T12, TG //Faria#les de 8 #its sin sino!
float m.,m1,e.,e1,e2G //Faria#les en punto flotante de 02 #its
int manitudG //Faria#le de 8 #its sin sino! 7anitud acci(n de control!
sHort sinoG //Faria#le tipo E5T! /ino acci(n de control!
//Funcion de inicializaci(n!
inicializar()
I
//5nicializando la operaci(n anal(ica del puerto )!
setup:port:a()%%:)A)%2G)G
set:tris:a(.#..111111)G //,onfiurando puerto ) como entrada
set:tris:e(.#.....111)G //,onfiurando puerto + como entrada
setup:adc()-,:,%2,K:5AT+1A)%)G
portc = .G //Falor inicial del puerto ,!
set:tris:c(.#11111.1.)G //,onfiurando $,. * $,2 como salidas
setup:ccp1(,,$:$67)G //,onfiurando el modulo ,,$1 en modo $67
setup:timer:2(T2:-5F:EJ:3, 1<=, .)G
/K-efiniendo el periodo del $67 con la confiuraci(n del temporizador 2 (para este caso periodo pLm
= (1<=)(3)/(3....../3) = <<8 us K/
set:pLm1:dut*(.)G //Falor inicial salida $67!
$'ina =. de =0 GB5) -+% ,27$5%)-21 ,$,6->
.4/.3/2.10 Http://LLL!adpema=M!netne!net/electronica/GB5):,27$5%)-21:$,6->!Html
m1 = 0; //Valor inicial parametros PID.
e1 = 0;
e2 = 0;
}
//Funcion de adquisicion de datos.
adquisicion_datos(
!
set_adc_c"annel(0; //#dquisicion canal 0$ %i.
dela&_c&cles(';
%i = read_adc(;
set_adc_c"annel(1; //#dquisicion canal 1$ %d.
dela&_c&cles(';
%d = read_adc(;
set_adc_c"annel(2; //#dquisicion canal 2$ (.
dela&_c&cles(';
( = read_adc(;
set_adc_c"annel('; //#dquisicion canal '$ )P.
dela&_c&cles(';
)P = read_adc(;
set_adc_c"annel(*; //#dquisicion canal *$ +,%+-.
dela&_c&cles(';
+,%+- = read_adc(;
set_adc_c"annel(.; //#dquisicion canal .$ %$ en se/undos.
dela&_c&cles(';
% = read_adc(;
}
//Funcion del controlador PID di/ital de posicion (al/oritmo del li0ro de 1ontrol Discreto de (. -/ata.
control_PID(
!
2loat %s$ (p$ (i$ (d$ salida_PID; //Varia0les locales en punto 2lotante de '2 0its.
%s = %/1000; //1on3irtiendo el periodo % de se/undos a milise/undos.
(p = ( 4 ((5%s/25%i; //1alculo de los parametros (p$ (i & (d se/6n al/oritmo.
(i = (5%s/%i;
(d = (5%d/%s;
m0 = m17((p7(i7(d5e04((p725(d5e17(d5e2;
//1alculo de la acci8n de control m(9%.
i2( m0:0
! //Detectando el si/no de la acci8n de control.
si/no = 1; //m0 ne/ati3o$ si/no = 1$ m0 positi3o$ si/no = 0.
salida_PID = 4m0; //1alculando 3alor a0soluto de m0.
} else
!
si/no = 0;
salida_PID = m0;
}
i2(salida_PID;2..
!
salida_PID = 2..; //<imitando la ma/nitud de la acci8n de control a 2...
}
ma/nitud = (intsalida_PID; //1am0iando de tipo de dato 2loat a
P=/ina >1 de >' ?@I# D,< 1-API<#D-+ 1P1BDC
0./0*/201' "ttpD//EEE.adpema>F.netne.net/electronica/?@I#_1-API<#D-+_P1BDC."tml
//8 bits sin signo.
e2 = e1; //Actualizando e(k-2).
e1 = e0; //Actualizando e(k-1).
if(signo == 1)
{
m1 = -salida!"#; //Actualizando m(k-1).
$else
{
m1 = salida!"#;
$
$ //fin cont%ol !"#.
&oid main('oid)
{ //"nicio (%og%ama (%inci(al.
inicializa%(); //)lamada a funcion inicializa%.
*+ile(,-./)
{
ad0uisiciondatos(); //)lamada a funcion de ad0uisicion de datos.
e0 = 1! - -/,-2; //3alculo del e%%o% actual.
cont%ol!"#(); //)lamada al cont%olado% !"#.
set(*m1dut4(magnitud);
!30 = signo; //1alida del signo de la acci5n de cont%ol.
dela4ms(,); //-eta%do seg6n (e%iodo de muest%eo.
$
$
!7gina 82 de 89 :."A #/) 32;!")A#2- 3!3<#=
0>/0?/2019 +tt(@//***.ad(ema8A.netne.net/elect%onica/:."A32;!")A#2-!3<#=.+tml
!7gina 89 de 89 :."A #/) 32;!")A#2- 3!3<#=
0>/0?/2019 +tt(@//***.ad(ema8A.netne.net/elect%onica/:."A32;!")A#2-!3<#=.+tml

Vous aimerez peut-être aussi