Sunteți pe pagina 1din 55

Entorno de Desarrollo Integral

para el PIC18FX5XX

MG. ING. JAVIER CAMILO POMA PALACIOS


Pampas, setiembre 2018
IDE para el PIC18FX5XX
Software
 CCS-C v5.070, MikroC, PICBASIC Pro (editor,
compilador, simulador, depurador).
 CGRAMdesigner, LCD_CGRAM (Generador de
caracteres alfanuméricos para LCD).
 LabVIEW 2016, Visual Basic, Visual C++,
Java (para realizar el aplicativo).
Simulación Hardware y Software
PROTEUS ISIS 8.6 sp2, Protel, Multisim 14.
Programador por puerto USB
Win800, PICkit2 clone, PICkit3.
Compilador CCS
Compiladores del CCS
PCB
Genera código para microcontroladores con 12
bits en memoria de programa.

PCM
Genera código para microcontroladores con 14
bits en memoria de programa.

PCH
Genera código para microcontroladores con 16
bits en memoria de programa (PIC18FX5XX).
IDE-CCS
CCS
Comentarios
Informan el significado de cada parte del
programa. Son ignorados por el compilador y
puede ser colocado en cualquier parte; excepto
en medio de una palabra reservada, del nombre
de una función o del nombre de una variable.

Ejem.

/* Esto es un comentario */

// Esto es un comentario, se extiende hasta el final de la línea.


Estructura básica de un programa en C
Directivas del procesador
Las directivas son palabras reservadas que permiten en otras cosas, un control
básico del código y del flujo en el proceso de compilación; proporcionan al
compilador, etc.

Declaraciones
Establece los nombres y los atributos de las constantes y variables globales.
Tipos de datos constantes utilizados en el programa.
Tipos de variables utilizados en el programa.

Funciones
{Es un colección de declaraciones locales, definiciones, expresiones y sentencias
para realizar una determinada tarea}.

Función principal
{Toda la programación en C contienen una función principal llamada “main”, donde
el programa empieza la ejecución. Las llaves indican el inicio y el punto final del
programa}.
Estructura básica de un programa en C
ESTRUCTURA DE UN PROGRAMA EN C DE CCS
1. COMENTARIO SOBRE EL PROYECTO.
 Nombre del archivo.
 Descripción sobre que realiza el sistema.
 Autor-año.
2. CONFIGURACIÓN DEL MICROCONTROLADOR
3. LIBRERÍAS A INCLUIR (ARCHIVOS .C, .H)
4. VALORES INICIALES PARA LOS MÓDULOS A UTILIZAR
5. DECLARACIÓN DE CONSTANTES
6. DECLARACIÓN DE VARIABLES
7. TRATAMIENTO DE INTERRUPCIONES
8. FUNCIONES (SUBRUTINAS)
9. VALORES INICIALES PARA LOS MÓDULOS A UTILIZAR
10.INICIO DE PROGRAMA
Configuración de periféricos del PIC
Configuración faltantes
11.BUCLE DEL PROGRAMA
12.FIN DE PROGRAMA
Estructura básica de un programa en C
// Directivas del procesador
#INCLUDE <18F2550.h>
#DEVICE ADC=10
#FUSES HSPLL,PUT,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN
#USE delay(clock=48000000)
#DEFINE USB_EP1_TX_ENABLE USB_ENABLE_BULK //Turn on EP1(EndPoint1) for IN bulk/interrupt transfers

// Declaraciones
Static char valor[8]; //Vector donde almacenamos datos recibidos
Char P_dato,dato1,dato2,dato3,dato4; //Dato a ejecutar
Int8 adc_lo_2=0; //Contiene el LSB del valor del ADC
Int16 read_adc;

// Funciones
FUNCION_1 ( )
{
//Instrucciones;
}
FUNCION_2 ( )
{
//Instrucciones;
}

// Funcion principal
VOID MAIN()
{
set_tris_b(0x00); //Configuracion puerto B como salida
output_b(0x00); //Limpiamos el puerto B
set_tris_c(0b00111000);

// Continúan las instrucciones o llamado las funciones


} //Fin de programa
Directivas en C del procesador
En un programa, las directivas se reconocen fácilmente porque comienzan por el
símbolo #. El compilador dispone de 6 tipos básicos de directivas.

1. Directivas derivadas del estándar de C, que permiten, entre otras funciones, un


control básico del código y del flujo en el proceso de compilación:

#DEFINE
#ELIF
#ELSE
#ENDIF
#ERROR
#IF
#IFDEF
#IFNDEF
#INCLUDE
#LIST
#NOLIST
#PRAGMA
#UNDEF
Directivas en C del procesador
2. Directivas asociadas a las bibliotecas precompiladas, que proporcionan al
compilador información relacionada con estas bibliotecas:

#USE DELAY
#USE FAST_IO
#USE FIXED_IO
#USE I2C
#USE RS232
#USE STANDARD_IO

3. Directivas relacionadas con la especificación del dispositivo, por un lado, para


definir los mapas de memoria y el juego de instrucciones, y por otro, incluir
información necesaria para la programación del dispositivo en los ficheros de
salida de la compilación:

#DEVICE
#ID
#FUSES
#TYPE
Directivas en C del procesador
4. Directivas para identificar las características especiales de una función:
#INLINE
#INT_DEFAULT
#INT_GLOBAL
#INT_xxxxx
#SEPARATE

5. Directivas de control del compilador, referidas a la compilación del código del programa:
#CASE
#OPT
#ORG
#PRIORITY

6. Directivas de control de la memoria del microcontrolador, para gestionar y reservar el uso de


determinadas zonas de memoria para variables:
#ASM
#BIT
#BYTE
#ENDASM
#LOCATE
#RESERVE
#ROM
#ZERO_RAM
Directivas en C del procesador
Ejemplos:
 La directiva #USE delay (clock=frec) indica al compilador

la frecuencia de reloj de funcionamiento del PIC.


frec es la frecuencia y se denota: (4M=4MHz=4000000).
 Se utiliza para generar retardos en software con las

funciones:
delay_us(microseg);
delay_ms(miliseg);
 Otros usos:

#USE delay(clock=8000000) //8MHz


#USE delay(crystal=12MHz,clock=16MHz)
#USE delay(clock=48000000)
CCS
Constantes

123 Decimal
0123 Octal
0x123 Hexadecimal
0b010101011 Binario
'A' Carácter
'\010' Carácter Octal
'\xA5' Carácter Hex.
“Cadena” Cadena de caracteres
\n,\r,\b,\t Caracteres especiales
CCS
Tipos de datos
CCS
Variable
La variable consistente en una caja en la que podemos
guardar algo, podemos disponer de muchas y tiene en su
frente su nombre; solo se pueden guardar en ellas
determinados tipos de objetos.
tipo_variable identificador [=valor_inicial];
 tipo_variable = Tipo de dato de la variable.
 Identificador = Nombre asignado a la variable.
 valor_inicial = Valor inicial almacenado en la memoria asignada

Ejm.
Int b; int c =10; signed int8 i=-1,j=4,k=3,l=8,m=-1,n=4,w;
char abc,institucion, frase=”Dios mi Salvador”;
int8 recibe[2]; int8 modo[4]={40,50,60,80};
int8 envia[1]
CCS
Las variables deben ser declaradas antes de
ser utilizadas.
Pueden ser declaradas como locales o
globales.
Pueden ser definidas como:
 AUTO: La variable existe mientras la
función está activa.
 STATIC: Una variable local se activa como
global.
 EXTERN: Permite el uso de variables en
programas de múltiples archivos.
IDE para CCS
Conversiones entre tipos
CCS nos permite mezclar diferentes tipos de variables dentro de una
misma expresión. Y existen un conjunto de reglas que nos permiten
saber que de que tipo será el resultado de la misma.
Ejm.
int a = 250, b = 10; c = a*b;

c no contendrá el valor 2500 como podría paracer a simple vista, por


que el tipo de c no se módica. CCS calcula a*b y obtiene
efectivamente el resultado 2500, pero c sólo contendrá los 8 bits
menos significativos, es decir el decimal 196.

Si hubiésemos hecho:
int8 a = 250, b = 10;
long c= a*b; /* el valor almacenado en c hubiese sido efectivamente
2500 */
Funciones

Conjunto de sentencias repetitivo agrupadas


bajo un nombre.
Pueden ser “llamadas” desde cualquier parte
del programa tantas veces como sea
necesaria su ejecución.
Pueden devolver valores y recibir parámetros
o argumentos.
Deben ser declaradas antes de llamarlas.
Pueden agruparse en ficheros de librerías.
Funciones
Las funciones son los elementos principales de un programa
en C.
Son bloques en los cuales se realiza una tarea específica.
Un programa en C está formado por la función main () que
es el bloque principal, por funciones propias del programador
y por funciones de librerías propias del compilador.

Una característica importante de las funciones, es que


pueden recibir parámetros y que pueden devolver un valor.
La misma función nos puede servir para varios casos, con
tan solo variar el valor de los parámetros. El compilador de
CCS incluye muchas funciones "built-in" (listas para usarse)
en sus librerías para el control directo de muchos de los
recursos del PIC, para utilizarlas sólo necesitamos saber los
parámetros que reciben y los valores que devuelven.
Funciones

[tipo_dato] identificador ([tip_par1 ,tipo_par2,…])


{
//sentencias
[return();]
}

 tipo_dato = tipo de dato devuelto por la


función.
 Identificador = nombre de la función.
 tip_parX = nombre y tipo de los argumentos.
Funciones
Llamada a una función
Para ejecutar una función hay que llamarla. La llamada a una función
consta del nombre de la misma y de una lista de argumentos o valores
a pasar denominados parámetros actuales, separados por comas y
encerrados entre paréntesis.
Cuando el programa llama a una función, la ejecución del programa
se transfiere a dicha función. El programa retorna a la sentencia
posterior a la llamada cuando acaba esa función. La sintaxis de una
llamada a una función es:
nombre(parámetros);

donde:
nombre-> es el identificador con que es definida la función a la que
queremos llamar.
parámetros-> es la lista de valores que se asignan a cada parámetro
de la función (en caso de que tenga), separados también por comas.
Funciones
Valores devueltos
Todas las funciones, excepto aquellas de tipo void, devuelven un valor. Este valor se especifica
explícitamente en la sentencia return y si no existe ésta, el valor es 0.

La forma general de return es:

return expresión;

Tres observaciones sobre la sentencia return:


a) La sentencia return tiene dos usos importantes. Primero, fuerza a una salida inmediata de la
función, esto es, no espera a que se llegue a la última sentencia de la función para acabar.
b) Return no es una función sino una palabra clave del C, por lo tanto no necesita paréntesis
como las funciones, aunque también es correcto: return(expresión); pero teniendo en cuenta
que los paréntesis forman parte de la expresión, no representa una llamada a una función.
c) En las funciones de tipo void se puede hacer:

y de esta forma se provoca la salida inmediata de la función.

Ejemplo.

int multiplica (int x, int y)


{
return (x*y);
}
IDE para CCS
Variables locales
Si una variable se declara dentro de una función, será
"visible" solo dentro de ésta:

Ejm.
funcion1 ()
{char abc;
.
.
.}

En el ejemplo anterior, la variable tipo Char llamada abc


solo podrá utilizarse dentro de la funcion1(). Si
intentamos utilizarla fuera de ella, el compilador nos dará
un error.
IDE para CCS
Variables globales
Si declaramos una variable fuera de cualquier función, el
alcance de esta será global, es decir estará disponible en
cualquier parte de nuestro programa.

main()
{ char abc;
.
.
.}
funcion1()
{
.
.
.}
La variable tipo char llamada abc podrá utilizarse dentro de main() o
de funcion1().
Estructuras de control repetitivas

• Ciclos

– Mientras que: WHILE

– Hasta que: DO-WHILE

– Número de veces: FOR


Mientras que: WHILE

while(a<100)
a<100?
{ No
a++; Si
}
//puede que no se
//ejecute ninguna
//vez a=a+1
Mientras que: WHILE
instrucción1;
“evaluable”
WHILE(condición) a verdadero
instrucción2; o falso.
Palabra
reservada instrucción3;
Se repite mientras
instrucción1; se evalúe “verdadero”

WHILE(condición)
{ instrucción2;
instrucción3;
instrucción4;
Bloque
}
instrucción5;
Hasta que: DO-WHILE

do
{
a++; a=a+1
}
while(a<100)

//el bucle se
//ejecuta al menos a<100?
No
//una vez
Si
Hasta que: DO-WHILE
instrucción1;
do “evaluable”
instrucción2; a verdadero
while(condición); o falso
Palabra instrucción3;
reservada
instrucción1;
Se repite mientras
Do se evalúe “verdadero”
{ (Igual que el while)
instrucción2;
instrucción3;
instrucción4;
}
while(condicion);
Bloque
instrucción5;
Número de veces: FOR
for (n=1;n<=10;n++)
{
n=1
contador=n;
}
n<=10?
No
Si

contador=n

n=n+1
Número de veces: FOR
instrucción 1;
for (inicio; termino; incremento o decremento)
instrucción 2;
instrucción 3;

instrucción 1;
for (inicio; termino; incremento o decremento)
{
instrucción 2;
instrucción 3;
}
instrucción 4;
Número de veces: FOR

0
1
int i; 2
for(i=0;i<10;i++) 3
4
{ 5
printf(“%d\n\r”,i); 6
} 7
8
9
Número de veces: FOR

0 - 10
int i,j; 1-9
2-8
for(i=0,j=10;((i<10)&&(j>0));i++,j--) 3-7
4-6
{ 5-5
printf("%d - %d\n\r",i,j); 6-4
7-3
} 8-2
9-1
ESTRUCTURAS DE CONTROL

Controlan el flujo de un algoritmo


 Secuencial
 Selectiva
 Repetitiva
Secuencial

4
Selectiva (Si-entonces): IF
La sentencia if permite decidir, ejecutar o no una instrucción o
un bloque de instrucciones.
Sintaxis
if (condición)
Instrucción o bloque;

Un bloque es una secuencia de instrucciones englobadas entre


llaves (“{ }”).
La condición esta formada por una expresión booleana.

Verdadero
condición

Falso sentencias
Selectiva (Si-entonces): IF

if (a==0)
{ a=0?
Si
b=10
b=10; No
}
instrucion1;
instrucion2; Otras instrucciones

instrucion3;
Selectiva (Si-entonces): IF

instruccion1;
if(condición)
instrucción2; “evaluable”
instrucción3;  Si es verdadero, se
ejecuta instrucción2.
Palabra
reservada  Si es falso, se ejecuta
instrucción3.
instrucción1;
if(condición) Bloque
{
instrucción2; “evaluable”
Bloque
instrucción3;  Si es verdadero, se
instrucción4; ejecuta Bloque.
}  Si es falso, se ejecuta
Instrucción5; instrucción5.
Selectiva (Si entonces-sino) IF - ELSE
La sentencia if – else permite decidir entre ejecutar una instrucción (o
un bloque de instrucciones) y otra instrucción (o un bloque de
instrucciones) Sintaxis
if (condición)
Instrucción o bloque;
else
Instrucción o bloque;

Falso Verdadero
condición

sentencias sentencias
Selectiva (Si entonces-sino) IF - ELSE

if (a==0)
{
b=10; Si
} a=0? b=10

else c=5; No

c=5
Selectiva (Si entonces-sino) IF - ELSE

if (a==0) Si
a=0? b=10
b=10;
else if (a>0) No

b=5;
No Si
else b=0; a>0?

b=0 b=5
Selectiva (Si entonces-sino) IF - ELSE

instruccion1; instrucción1;
if(condición) if(condición)
instrucción2; {
instrucción2;
else
instrucción3;
instrucción3;
instrucción4;
Instruccion4;
}
else
{
instrucción5;
instrucción6;
Palabra Se ejecuta si
}
reservada la “condición”
es verdadera Instrucción7; “condición”
falsa
Selectiva (Si entonces-sino) IF - ELSE

Instrucción 1; Instrucción 1;
If (condición 1)
If (condición 1)
{
instrucción2; instrucción2;
else }
else
if (condicion2) {
instrucción 3; if (condición 2)
else {
instrucción 3;
if (condición 3) }
instruccion4; else
{
Instrucción 5;
if (condición 3)
{
instrucción 4;
}
}
}
instrucción 5;
Selectiva (En el caso de) CASE

La sentencia switch permite elegir entre varias alternativas.


Sintaxis
switch (<expresión>)
{
case <constante>:[case <constante>:]<sentencias>;break;
...
[default:<sentencias>;break;]
}
Selectiva (En el caso de) CASE

switch (A)
{
case 0: Si
B=10; A=0? B=10
break; N
case 1: o
Si
B=20; A=1? B=20
break;
case 2: N
o
B=30;
Si
break; A=2? B=30
default:break;
} N
o
Selectiva (En el caso de) CASE
Variable
por analizar
switch(<var>) Valores de
{ <var>
case <op1>:
instrucción 1;
instrucción 2;
break;
case <op2>: Ìr al termino
Palabras instrucción 3;
reservadas instrucción 4;
break;
default :
instrucción 5;
instrucción 6;
Termino }
de casos
Operadores de asignación
Permiten asignar valores a las variables. Tenemos las siguientes.
Operador Descripción
+= Asignación de suma. x+=y es lo mismo que x=x+y
-= Asignación de resta. x-=y es lo mismo que x=x-y
*= Asignación de multiplicación. x*=y es lo mismo que x=x*y
/= Asignación de división. x/=y es lo mismo que x=x/y
%= Asignación de resto de división. x%=y es lo mismo que x=x%y
Asignación de desplazamiento a la izquierda. x<<=y es lo mismo
<<=
que x=x<<y
Asignación de desplazamiento a la derecha. x>>=y es lo mismo
>>=
que x=x>>y
&= Asignación de AND de bits. x&=y es lo mismo que x=x&y
|= Asignación de OR de bits. x|=y es lo mismo que x=x|y
Asignación de OR exclusivo de bits (XOR). x^=y es lo mismo que
^=
x=x^y
Operadores aritméticos
Permiten la realización de operaciones matemáticas en nuestros
programas.

Operador Descripción Ejemplo


+ Suma Resul = var1 + var2
- Resta Resul = var1 - var2
* Multiplicación Resul = var1 * var2
/ División Resul = var1 / var2
Módulo (Resto de una división
% Resul = var1 % var2
entera)
Incrementa en uno el valor del Var1=Var1 + 1
++
operando
Decremento en uno el valor del Var1=Var1 - 1
--
operando
sizeof Tamaño en bytes de un
operando
Operadores relacionales
Compara a dos operando y devuelve 1 (verdadero) ó 0 (falso) según el
resultado de la expresión. Se utilizan principalmente para elaborar
condiciones en las sentencias condicionales e iterativas que se verán
más adelante. Los operadores relacionales permiten comparar valores
o expresiones aritméticas.
En C el valor 1 se interpreta como verdadero y el 0 como falso.
Operador Significado
== Igualdad que
!= Diferente que
> Mayor que
< Menor que
>= Mayor o igual que
<= Menor o igual que
?: Expresión condicional
Operadores lógicos
Operadores Lógicos: Al igual que los operadores
relacionales, éstos devuelven 1 (verdadero), 0
(falso) tras la evaluación de sus operandos. La
tabla siguiente ilustra estos operadores.
Existen 4 operadores lógicos en C: and = &&, or =
||, not = !, xor = ^. Los operadores lógicos tienen
una prioridad más baja que los operadores
relacionales.
Operador Descripción
! NO lógico
&& Y lógico
|| O lógico
^ Xor lógico
Operadores lógicos
Operadores de manejo de bits: Operador Descripción
Estos operadores permiten ~ Negación de bits (complemento a 1)
actuar sobre los operandos para & Y de bits (AND)
modificar un solo bit, los | O de bits (OR)
operandos sólo pueden ser de ^ O exclusivo de bits (XOR)
>> Desplazamiento a la derecha
tipo entero (incluyendo el tipo
<< Desplazamiento a la izquierda
char).

Operadores para manejar punteros: En el lenguaje C está muy difundido el


uso de punteros, este compilador permite su uso y los operadores que utiliza
para ello son los siguientes:
Operador Descripción
& Operador de dirección
* Operador de inderección
-> Acceder a los miembros de una estructura por medio de punteros
Ejemplos
1>2 =0 falso
3<5 =1 verdadero
(7 – 4) == 3 =1 verdadero
17 >= (5 + 12) = 1 verdadero
i = 3; j = 7;
i * j != 21 =0 falso
float a=0.1;
(3*a – 0.3) == 0 = 0 falso (OJO con los reales)
3>1>0 =1 verdadero
Asignar a una variable la mayor de otras dos:
a = 17; b = 15;
c = a*(a>=b) + b*(b>=a); c = 17 a>=b = 1 y b>=a = 0
Ejemplos de operadores lógicos

x > 5 || x == 3 //verdadero para x = 3, 6, 7, ...


! (x == 7) && x % 2 != 0 //verdadero para x = 1, 3, 5, 9, 11, ...
x <= -1 || x > 5 || x ==2 //verdadero para x = …, -2, -1, 2, 6, 7, 8, ...

En el siguiente fragmento de programa se despliegan solo


los múltiplos de 7 o cuadrados perfectos, verifique.
if(num % 7 == 0 || [sqrt(num)-floor(sqrt(num))]==0)
Ejercicios para los grupos N° 2

1. Si a = 15, b = 20, c = 30
Determine el valor de verdad de la expresión:
( ( a > b ) || ( a < c )) && (( a == c ) || ( a >= b ))

2. Para que valores de x la expresión es verdad.


(x <= -1 || x > 5 || x ==4) && (! (x == 5) && x % 2 != 0)

3. Señale el valor de verdad de:

a) 5 == 7 && 7 < 12 || 10 < 56


b) 9 < 12 && 12 > 7 ^ 4>-15
c) 9 < 12 && 12 > 15
d) 12 == 12 || 15 < 7
e) 7 > 5 || 9 < 12
f) 4 == 4 ^ 9 > 3

S-ar putea să vă placă și