PROGRAMAR EN PIC C COMPILER [CCS - PIC - C] Para las personas que están un poco más familiarizadas a hacer programas en lenguaje C o sus derivados, en esta sección les traigo un manual de como programar un PIC usando el lenguaje C, pero como siempre un poco de teoría para que estén familiarizados un poco.
es un compilador C que contienen operadores estándar del lenguaje C funciones incorporados en !i!liotecas que PIC C Compiler es son específicas a los registros de PIC, proporcionando a los desarrolladores una herramienta poderosa para el acceso al hard"are las funciones del dispositivo desde el nivel de lenguaje C.
#l compilador de CC$ %Custom Computer $ervices& contiene más de '() funciones integradas que simplifiquen el acceso al hard"are, mientras que la producción eficiente altamente optimizado código. $e incluen funciones de hard"are del dispositivo de características tales como*
+ emporizadores módulos P- + Convertidores / 0 1 + de datos on 2chip ##P34 + 5C1 controladores + emoria e6terna !uses + #ntre otras...
5a pagina oficial de CC$ nos dice lo siguiente*
CC$ desarrolló el primer compilador de C para microcontroladores icrochip hace más de 7( a8os contin9a ofreciendo soluciones de soft"are a los desarrolladores de aplicaciones integradas que utilizan dispositivos PIC : 1$C C; dsPIC :.
/unque cada programa de CC$ tienen sus limitantes a lo que me refiero es que dependiendo de la versión que tengas podrás programar algunos tipos de PIC*
odos CC$ compiladores tienen optimización de nivel profesional están disponi!les en configuraciones de soft"are fle6i!les que se ajustan a los requisitos del proecto. 5as nuevas licencias incluen* los derechos iniciales de descarga, renovaciones de mantenimiento opcionales li!re de tecnología de apoo para la vida 9til del producto. odos los compiladores son compati!les con herramientas de terceros, tales como icrochip P5/=: and P5/=: >.
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
FORMATOS DE ARCHIVOS (COMUNES): .c #ste es el archivo de código fuente que contiene el código en C. .h $e trata de archivos estándar o personalizados de ca!ecera utilizados para definir pines, registros,funciones directivas del ?procesador.
.hex #l compilador genera archivos @#> estándar que son compati!les con todos los programadores. PIC #sta directiva define al compilador la arquitectura hard"are utilizada. #sto determina la memoria 3/ 34 así como el juego de instrucciones. Para los chips %uCAs, memorias, etc& con más de 7B !tes de 3/ se puede seleccionar entre punteros de D o E !its. Para usar punteros de E !its ha que a8adir +FE después del nom!re del chip %uC, memoria, ...& o en una nueva línea después de la declaración del chip. $e puede o!tener informaciGon so!re un dispositivo con el programa PICC@IP$.
E!emplo": #device PIC16C67 *=16 #device PIC16C74
#device *=16
################################################################### $I%RERIAS E&TERNAS:
I'ro*cci+': e' *' pro,r-m- ANSI C p-r- "i"em-" e microco'rol exi"e' / ipo" e -rchi0o" .h: el -rchi0o el microco'rol-or p-ric*l-r 1*e "e e"2 *ili3-'o 4 l-" li5rer6-" el pro,r-m-. Am5o" lle0-' l- ermi'-ci+' 7.h7 #l archivo header del microcontrolador contiene las equivalencias que usa el compilador entre los nom!res de los puertos, registros, !its se8ales con su dirección física en el microcontrolador. Por ejemplo, para el compilador CC$, vea los archivos EH7D/.h, EHDD.h, EHDD/1C.h .
5os archivos .h del programa tam!ién se conocen como li!rerías ó !i!liotecas. 5as que están siempre integradas en todos los compiladores /<$I C, como por ejemplo Jstdli!.hK, se conocen como li!rerías estándar.
#n seguida se dan detalles con respecto a am!os tipos de archivos .h
#n el caso del compilador CC$, de!e incluirse la directiva Linclude EH7D/.h ó EHDD.h. #l uso de las comillas dirige al compilador a !uscar ese archivo en la misma carpeta en donde está el proecto generado desde P5/= I1#. $i se usa la directiva Linclude JEH7D/.hK, el compilador !usca el archivo en la carpeta devices en donde se instalaron originalmente los drivers para cada microcontrolador.
5I=3#3I/$ 1#5 P34M3//* tam!ién llamadas !i!liotecas. #stos archivos header contienen las funciones que ha!rán de usarse en el programa principal ó en alguno de los otros archivos header.
Como ventaja adicional para los programadores al crear sus propias li!rerías, es permitir que esas funciones puedan ser utilizadas por otros programadores.
;n archivo .h puede contener las llamadas directivas del preprocesador de C, como Ldefine e Linclude, así como las funciones. Puede tam!ién contener la declaración de otros archivos .h, que son indispensa!les para la operación de algunas de las funciones, incluendo las llamadas li!rerías estándar del propio compilador C como son stdio.h ó string.h.
################################################################### FUSI%$ES
#sta directiva define qué fusi!les de!en a ctivarse en el dispositivo cuando se programe. #sta directiva no afecta a la compilaciónN sin em!argo, esta información se pone en el archivo de salida. $i los fusi!les necesitan estar en formato Paralla6, ha que agregar P/3 en opciones. ;tilizar la utilidad PICC@IP$ para determinar qué opciones son válidas para cada dispositivo. 5a opción $-/P tiene la función especial de intercam!iar, los !tes alto !ajo de los datos que no son parte del programa, en el archivo @e6. #sta información es necesaria para algunos programadores de dispositivos. /lgunas de las opciones más usadas son* LP, XT, HS, RC WDT, NOWDT PROTECT, NOPROTECT PUT, NOPUT (Poe! U" Tie!$ %ROWNOUT, NO%ROWNOUT P&R (P'!'') o!'+ -e-$ SW&P
E!emplo:
Lfuses @$,-1 LH;$#$ <45OP
################################################################### DE$A8 #sta directiva indica al compilador la frecuencia del procesador, en ciclos por segundo, a la vez que ha!ilita el uso de las funciones 1#5/Q$%& 1#5/Q;$%&. 4pcionalmente podemos usar la función restartQ-1%& para que el compilador reinicie el -1 durante el retardo.
E!emplo": #-e de'. (coc/=0$
#-e de'. (coc/=20, REST&RT3WDT$
################################################################### VARIA%$ES $-" 0-ri-5le" p*ee' moi9ic-r "* 0-lor - lo l-r,o e *' pro,r-m-.
#n un programa, las varia!les pueden tomar dos formas* varia!les locales ó varia!les glo!ales. 5as varia!les locales se declaran adentro de una función %después del signo R & solo son válidas en esa función. $u valor su espacio en memoria son eliminados al salir de la función por tanto no pueden ser usadas en otra parte del programa. Por tanto, pueden usarse nom!res idénticos de varia!les locales en distintas funciones sin que esto genere ning9n error por parte del compilador.
5os argumentos ó parámetros de cualquier función son siempre varia!les locales. Por ejemplo, en la función sum%int a,int !&N las varia!les a ! son locales.
#n contraste, las varia!les glo!ales se declaran generalmente arri!a de la función main su valor puede ser modificado utilizado tanto por la función main como por el resto de las funciones del programa. #s recomenda!le, para evitar confusiones al programar, usar nom!res de varia!les glo!ales locales distintos.
C S-'-r T4pe
De9-*l T4pe
short char int long long long float dou!le
intE unsigned intD intD intE int'7 float'7 <0/
%-"ic T4pe" T4pe#Speci9ier $ize
i' i'; i'< i'=/
;nsigned E !it num!er D !it num!er E !it num!er '7 !it num!er
9lo-=/
'7 !it float
3ango $igned ( to E <0/ ( to 7BB 2E7D to E7) ( to BB'B 2'7)D to '7)) ( to 27ES)SD'SD to S7TST)7TB 7ES)SD'S) 2E.B 6 E(SB to '.S 6 E('D
1igitos E07 72' S2B T2E( )2D
;na varia!le puede ser definida como glo!al con un nom!re cualquiera. 5as varia!les glo!ales se declaran antes de la función main% &. no es necesario nom!rarlas como varia!les glo!ales
5as varia!les glo!ales pueden posteriormente ser pasadas como argumento a una función. #n este caso, la varia!le ingresa a la función con otro nom!re un valor inicial, posteriormente es automáticamente considerada local dentro de esa función. #l programador de!e evitar confusiones utilizando siempre nom!res de varia!les glo!ales locales diferentes.
5as varia!les pueden declararse al mismo tiempo en que son inicializadas. Por ejemplo*
int !F77, char "e!UBVFR7',SS,DE,T7,BW, float flujoF'B.7'N
################################################################### CONSTANTES $i delante del identificador ponemos CONST entonces, el identificador es tratado como constante. 5as constantes de!en ser inicializadas no pueden cam!iar en tiempo de ejecución.
una constante es un valor fijo que no puede variar durante el programa. 5as constantes pueden ser n9meros enteros o reales se pueden definir de 7 maneras. 5a primera es usar la directiva del preprocesador* Ldefine pi '.ESE am!ién podemos almacenar las constantes directamente en la memoria H5/$@ mediante la declaración* const float piF'.ESE, const signed int miXF2)N $i se trata de un arreglo, entonces usamos* const signed int "e!UBVFR7',SS,2DE,T7,2BWN const char questUE(VFRpresionF WN
EXPRESIONES
Constantes E7' (E7'
1ecimal 4ctal
(6E7' (!(E((E( A6A AY(E(A AY6A a!cdef
@e6 =inario Carácter Carácter octal Carácter especialN 6 puede ser* Zn,t,!,r,f, A, Yd,v[ Cadena %el carácter nulo se agrega al final&
ARRA8S E!emplo": 5os arreglos pueden definirse como sucesiones de valores constantes ó varia!les que son almacenados en memoria H5/$@, o en 3/ respectivamente. 5os strings son arreglos formados de caracteres /$CII, terminados con un caracter <;55.
const signed int "e!UBVFR7',SS,2DE,T7,2BWN es un arreglo de constantes se almacenan en memoria H5/$@. $u valor no puede modificarse.
const char "o!U'(VF5/$ C/3/C#3I$IC/$ /$ IP43/<#$ 1#5 1I$P4$IIO4 $4<N este arreglo se almacena en la memoria H5/$@. 5as comillas indican al compilador que se trata de un string. 4!serve que no es necesario el uso de corchetes.
signed int "e!UBVFR7',SS,2DE,T7,2BWN es un arreglo de varia!les inicializadas con un valor se almacenan en 3/, pero pueden modificarse a lo largo de un programa. Cada elemento del arreglo puede accesarse a través de su su!índice, por ejemplo, en el arreglo "e!* "e!U(VF7' , "e!UBVF2B
!te const H/C43#$ USV F RD, E, S, E7DWN
################################################################### COMENTARIOS:
Para escri!ir un comentario en la linea de codigo son la misma manera de hacerlo en C, así que si quieren escri!ir una linea de un comentario solo de!en poner 00 en seguida su comentario
OPERADORES MATEMATICOS
5os operadores aritméticos se usan para realizar operaciones matemáticas. $e listan en la siguiente ta!la*
Oper-or
De"cripci+'
E!emplo
\
$uma %enteros o reales&
resul F varE \ var7
2
3esta %enteros o reales&
resul F varE 2 var7
+
ultiplicación %enteros o reales& 1ivisión %enteros o reales& Cam!io de signo en enteros o reales óduloN resto de una división entera
resul F varE + var7
0 2 ]
resul F varE 0 var7 2varE rango F n U/EV] 7B
5os !its de precisión con los que tra!ajan dependen de los rangos de varia!les que se ocupan.
OPERADORES DE COMPARACI>N
$u misión es comparar dos operandos dar un resultado entero*
E %verdadero&N ( %falso&.
OPERADOR
DESCRIPCI>N
FF ^F J K JF KF
Igual 1iferente enos que aor que enso o igual que aor o igual que
OPERADORES $>?ICOS
/l igual que los operadores relacionales, éstos devuelven E %verdadero&, ( %falso& tras la
evaluación de sus operandos.
OPERADOR
DESCRIPCI>N
__ ll `
/<1 lógico 43 lógico <4 lógico
OPERADORES DE ASI?NACI>N #n C es mu com9n encontrarnos u usar el siguiente tipo de sinta6is i F i \ EN a sea de crecimiento o decremento, para un contador o alg9n uso. /unque tam!ién la e6presión anterior se puede escri!ir así i \F E. /hora dejare en la ta!la sig. los demás*
4perador \F 2F +F 0F ]F JJF KKF _F `F F bF
1escripción /signación suma /signación resta /signación multiplicación /signación división /signación resto de división /signación desplazamiento a la izquierda /signación desplazamiento a la derecha /signación /<1 de !its /signación 43 de !its /signación 43 e6clusivo de !its /signación negación de !its
OTROS
OPERADOR :: < > ??
FUNCION I5c!ee5+o Dec!ee5+o De-"'8'ie5+o ' ' I89ie!d' De-"'8'ie5+o ' ' De!ec;' O"e!'ci5 &ND O"e!'ci5 OR O"e!'ci5 OR EXCLUSI@&
A
O"e!'ci5 NOT (Co"ee5+o ' 1$
################################################################### FUNCIONES
OPERADOR
FUNCION
/=$%6& /C4$%6&
Oalor /!soluto+ %completo& 3egresa el arco coseno de un valor. #l valor de retorno está en el rango U(,piVradianes. 3egresa el arco seno de un valor. #l valor de retorno está en el rango U2 pi07, pi07Vradianes. 3egresa el arco seno de un valor. #l valor de retorno está en el rango U2 pi07, pi07Vradianes. #sta función convierte la cadena de caracteres apuntada por ptr en un valor de tipo entero. /cepta argumentos en decimal en he6adecimal. #sta función convierte la cadena de caracteres apuntada por ptr en un n9mero entero largo %long&. /cepta argumentos en decimal en he6adecimal. 4!tiene el valor entero más peque8o, maor que el n9mero real 6, es decir, hace un redondeo por e6ceso del n9mero real 6. Calcula la función e6ponencial del n9mero real 6. Calcula el valor entero más grande, menor que el n9mero real 6, es decir, hace un redondeo por defecto del n9mero real 6. 4!tiene el valor a!soluto del entero largo 6. Calcula el logaritmo natural del n9mero real 6. Calcula el logaritmo decimal o !ase2diez del n9mero real 6. 4!tiene la raíz cuadrada del n9mero real 6.
/$I<%6& //<%6& i=&TOI(c;'! *"+!$ i=&TOL(c;'! *"+!$ CEIL()$ EXP()$ ?B?i LOOR()$ L&%S()$ LO()$ LO1()$ SRT()$
CONDICIONES
CODICI>N
E@EMP$O
if %e6pr& condicionN Uelse condiciónNV
if %6FF7B& 6F(N else 6F6\EN
"hile %e6pr& condicionN
"hile %getQrtcc%&`F(& putc%n&N
do condicion "hile %e6pr&N
do R putc%cFgetc%&&N W "hile %c`F(&N
for %e6prENe6pr7Ne6pr'& condiN
for %iFENiJFE(N\\i& printf%]uYrYn,i&N
s"itch %e6pr& R case ce6pr* condicionN 00uno o mas casos Udefault*condicionV ... W
s"itch %cmd& R case (* printf%cmd (&N!reaXN case E* printf%cmd E&N!reaXN default* printf%!ad cmd&N!reaXN W
return Ue6prVN
return %B&N
goto la!elN
goto loopN
la!el* stmtN
loop* i\\N
!reaXN
!reaXN
continueN
continueN
################################################################### i9 i9#el"e Condiciones para hacer decisión* i9 %e6pr& stmt2EN Uel"e stmt27NV $e llevará aca!o la primera acción si el if fue correcto sino realizará la segunda e6presión am!ién puede tener una estructura de m9ltiples decisiones, o un if anidado. i9 %e6pr& stmtN el"e i9 %e6pr& stmtNV ...
el"e stmtNV #n estos casos de estructura la hara en orden primero verá el primer if si es verdadero sino continuara revisando cada if si son verdaderos si alguno de ellos si es verdadero entonces ejecutara esa e6presión si ninguno es verdadero entonces ejecutara la ultima e6presión con el else. #jemplo* if %6FF7B& 6FEN else 6F6\EN
################################################################### Bhile Condición que se repetirá continuamente hasta que que el usuario lo requiera %o ponga un !reaX en otra condición&. 5a e6presión se eval9a la sentencia se ejecuta hasta que se convierte en falsa en cuo caso la ejecución contin9a después de la declaración.
#jemplo* "hile %getQrtcc%&`F(& putc%AnA&N
################################################################### o#Bhile 1ifiere de "hile for loop en que la condición de terminación se comprue!a en la parte inferior del loop en lugar de en la parte superior por lo que el cuerpo del loop siempre se ejecuta al menos una vez. #jemplo*
o statement
Bhile %e6pr&N ################################################################### 9or %e6prENe6pr7Ne6pr'& 5as e6presiones son instrucciones de control de loop. e6prE es la inicialización, e6pr7 es la compro!ación de la terminación e6pr' es re2inicialización. Cualquiera de ellos puede ser omitido. #jemplo* for %iFENiJFE(N\\i& printf%]uYrYn,i&N
################################################################### "Bich ;sado para tomar m9ltiples decisiones $inta6is* s"itch %e6pr& R case constE* stmt sequenceN !reaXN ... Udefault*stmtV W #sto pone a prue!a si la e6presión coincide con uno de los valores las ramas constantes en consecuencia.
$i ninguno de los casos se cumple se ejecuta el caso predeterminado. 5a ruptura provoca una salida inmediata, de lo contrario el control salta al siguiente caso. #jemplo* s"itch %cmd& R case (*printf%cmd (&N !reaXN case E*printf%cmd E&N !reaXN default*printf%!ad cmd&N !reaXN W
###################################################################
Re*r' co'i'*e 5re-: re*r' ;na sentencia de retorno permite una salida inmediata de un interruptor o un !ucle o función tam!ién devuelve un valor. return %B&N
co'i'*e 5a sentencia continue hace que la siguiente iteración del !ucle envolvente %"hile, for, 1o& para comenzar. #sto hace que la parte de prue!a que se ejecutará inmediatamente en caso de hacer mientras pasa el control de paso a la re2 inicialización en caso de for. continueN
5re- #sto hace que el !ucle más interior que encierra %o s"itch& para ser salido inmediatamente. !reaXN
################################################################### SU%RUTNA (FUNCIONES) Para las personas familiarizadas a tra!ajar en C se les hará conocido el termino función, para los que alguna vez tra!ajaron en un PIC el termino su!rutina es familiar. Pero en CC$ es lo mismo, son lineas de codigo que se ocupan varias veces pero para evitar escri!ir de más se mandar a llamar para que se ejecuten ahorrar el codigo.
5os argumentos que pueden pasarse como entradas de una función pueden ser valores constantes, varia!les, o incluso arreglos o strings.
Oeamos un ejemplo mu sencillo con una función para sumar 7 varia!les.
int velocidadE,velocidad7N
int suma%int a,int !&N
00se declaran 7 varia!les como valores enteros con signo
00antes de la función main es necesario declarar la función suma
#sta declaración significa* define una función cuo nom!re es suma que cuenta con 7 valores de e ntrada cuos nom!res son a ! que se almacenarán en memoria, como valores enteros con signo %int&. /demás, el valor de retorno de la función %return value&, declarado del lado izquierdo, es otro valor entero con signo. 4!serve como al valor de retorno no se le asigna ning9n nom!re de varia!le, de!ido a que el nom!re mismo de la función tomará ese valor.
void main%void& R
00aquí se declara la función principal, que es el inicio del programa.
velocidadEFDN velocidad7F'N
00se inicializa el valor de las varia!les.
P43=Fsuma%velocidadE,velocidad7&N
for%NN&N
00los valores de velocidadEFD velocidad7F' se pasan a la función.
00fin del programa, loop so!re sí mismo
W
#l programa principal llama a la función suma. #l valor de velocidadE se transfiere a la varia!le a velocidad7 se transfiere a la varia!le !. Como en este caso e6iste un valor de retorno, el nom!re de la función toma ese valor, como se muestra en el ejemplo. #l resultado de la suma %EE&, se transfiere al Puerto =, aparece en los 5#1$, en formato !inario. #n seguida se muestra el desarrollo de la función suma*
int suma%int a,int !&R
int cN
00se declara c como varia!le local
cFa\!N
return %c&N
00este es el inicio de la función suma.
00aquí se efect9a la suma
W
00la función regresa al programa principal. 5a función toma el valor de c.
/l llamar a la función, las varia!les pueden tam!ién llevar el mismo nom!re que los argumentos de la función. #ste ejemplo funcionaría igualmente, llamando a la función con los nom!res de varia!les a !, en lugar de velocidadE velocidad7, siempre cuando dichos nom!res hu!iesen sido declarados anteriormente como varia!les glo!ales. #n este caso, las instrucciones utilizadas serían* aFDN !F'N P43=Fsuma%a,!&N
5a misma función opera correctamente si se le llama usando constantes como argumentos. Por ejemplo* suma%E(,'B&. #n este caso el valor de retorno sería SB.
#l compilador está limitado a tra!ajar con parámetros por referencia. #sto aumenta la legi!ilidad del código así como la eficacia de algunos procedimientos. 5os dos procedimientos siguientes son iguales pero sólo el segundo opera con parámetros por referencia* 5cio53'(i5+*),i5+*.$ F G * dec'!'ci5 de ' 5ci5 * G %+6`FB&N +F+6\'N W 5cio53'(<',
5cio53B(',B$ G* ''d' ' ' 5ci5 *G
5os argumentos de entrada0salida usados en cualquier función son siempre varia!les locales, es decir, si fueron previamente definidas como varia!les glo!ales, su valor se modifica adentro de la función, al regresar de la función la varia!le permanece con el mismo valor con el que entró. Por ejemplo* en la función !cd%c&, la varia!le c ingresó a la función con un valor de 7S. 5a función modifica este valor cFS al terminar la función. $in em!argo, en el programa principal, la varia!le c co ntinuará teniendo el valor 7S.