Está en la página 1de 29

Microcontroladores

pic
II PARTE
COMPILADOR CCS
CODIGO

COMPILADOR

.LST
.sta .tre
.HEX
.PJT
.SYM
.err
.cof
Programador

DEBUG
Simulado en software
O real en Hardware
Arquitectura Básica de un
Programa
 Declaraciones Globales
 Declaración de funciones

 Función principal

Main()
{
variables locales;
bloque de sentencias;
llamadas a funciones;
}
 Definición de Funciones

Funcion_1 {
variables locales de la función;
bloque de sentencias;
llamadas a otra/s funcione/s;
}
VARIABLES
 Se utilizan para nombrar posiciones de memoria RAM; se
deben declarar obligatoriamente antes de utilizarlo, para ello
se debe utilizar el nombre y el tipo de dato que se manejara,
se define de la siguiente manera.

TIPO NOMBRE_VARIABLE [=VALOR]

TIPO: Hace referencia a cualquiera de los tipos de datos


vistos anteriormente.

NOMBRE_VARIABLE: puede ser cualquier nombre.

VALOR: Opcional, sirve inicializar la variable con un valor


inicial.
Variables
 Las variables pueden ser definidas como:
AUTO:
Usado por defecto, la variable existe mientras la función
donde esta definido esta activo, su valor se pierde cuando se
sale de la función
STATIC:
Una variable local se activa como global, se inicializa a cero, y
mantiene su valor al entrar y salir de la función donde esta
definido.
EXTERN:
Permite el uso de variables en compilaciones múltiples.
Función
 una función es un grupo de instrucciones con
un objetivo en particular y que se ejecuta al
ser llamada desde otra función o
procedimiento. Una función puede llamarse
múltiples veces e incluso llamarse a sí misma
(función recurrente).
Declaracion de una Función
 Al igual que hemos visto con las variables, las funciones
deben declararse, para lo que usaremos los prototipos.
 Un prototipo es una declaración de una función. Consiste en
una presentación de la función, exactamente con la misma
estructura que la definición, pero sin cuerpo y terminada con
un ";". La estructura de un prototipo es:

Tipo_Funcion Nombre_funcion (<lista_parámetros>);


Definición de una Función
 Una definición contiene además las instrucciones
con las que la función realizará su trabajo, es
decir, su código.
 Las funciones tienen el siguiente formato en ccs.
Tipo_funcion nombre_funcion(<lista_Parametros>){
<instrucción 1>
<instrucción 2>
<instrucción 3>
. . .
<instrucción n>
}
Tipos de Datos en CCS
OPERADORES CCS
De Asignación
OPERADORES EN CCS
 Aritméticos
OPERADORES EN CCS
 Relacionales Lógicos Punteros

 De BITs
CONDICIONAL IF-ELSE

Esta condicional es usado para tomar decisiones logicas

If(condición) If(x==25)
<sentencias>; X=0;
else Else
x=x+1;
<sentencias>;

SINTAXIS EJEMPLO
CONDICIONAL IF-ELSE IF
Es usado para tomar múltiples decisiones

If(condicion1) if(x==1)
<instrucciones>; output_high(PIN_B0);
Else if(condicion2) then Else if(x==2)
<instrucciones>; output_high(PIN_B1);
Else Else
<instrucciones>; output_high(PIN_B2),

SINTAXIS EJEMPLO
LAZO WHILE
Se utiliza para repetir sentencias, la condición se evalua y la sentencia
Se ejecuta mientras la condición es verdadera, cuando es falso se sale
Del While

While(condición)  While(x<20)
{ {
<sentencias>; Output_toggle(PIN_B0);
delay_ms(500);
}
X++;
}

SINTAXIS EJEMPLO
LAZO FOR
Esta sentencia permite realizar un bucle repetidamente en base a una
condición, la cual suele estar basada en el valor de un contador que
se actualiza después de cada ejecución del bucle.

for ( <inicio> ;<condición> ;


 For(i=0;i<50;i++)
<incremento> ) {
{ printf(“%u”,i);
   <sentencias>;
} delay_ms(10);
}

SINTAXIS EJEMPLO
FUSES DEL PIC 16F84
Fuses del PIC 16F84A
  OSC (Oscilador):
Es el modo de oscilación que va a usar el Pic. 

Cada vez que el Pic recibe un pulso eléctrico del oscilador da un paso para ejecutar una instrucción (4
impulsos para completar una), por lo que podemos decir que es una señal que le recuerda al Pic que
tiene que seguir avanzando. 

Según esto, el pic puede usar 4 tipos de oscilador:


 XT

para frecuencias no mayores de 4 Mhz. La condición básica importante para que este oscilador
funcione es que los condensadores C1 y C2 deberán ser iguales.
 LP (Low Power)

para frecuencias entre 32 y 200 Khz. Este oscilador es igual que el anterior, con la diferencia de que el
PIC trabaja de una manera distinta. Este modo está destinado para trabajar con un cristal de menor
frecuencia, que, como consecuencia, hará que el PIC consuma menos corriente.
 HS (High Speed) para frecuencias comprendidas entre 4 y 20 MHz.

Habremos de usar esta configuración cuando usemos cristales mayores de 4 MHz. La conexión es la
misma que la de un cristal normal.
 RC (Resistor/Capacitor) para frecuencias no mayores de 5.5 Mhz.  Por último tenemos el oscilador tipo

RC que es el más económico por que tan solo se utiliza un condensador no polarizado y una
resistencia. Este tipo de oscilador proporciona una estabilidad mediocre en la frecuencia generada y
podrá ser utilizado para aquellos proyectos que no requieran precisión.
Fuses del PIC 16F84A
WDT
 
El famoso "perro guardián" del PIC se configura aquí.
Esta es una capacidad del microcontrolador
de autorresetearse. Es muy útil ante descuidos de
programación, por ejemplo, si este se queda en un
bucle infinito, esta propiedad lo sacará de él.
Reseteándolo.
Su funcionamiento es sumamente sencillo. Simplemente
es un registro que debemos borrar cada cierto tiempo.
Si pasa un tiempo X (entre 2.5ms y 2.5 seg) y ese
registro no ha sido borrado, el PIC se resetea.
Fuses del PIC 16F84A
PWRT
Si activamos este fuse, lo que conseguimos es que se
genere un retardo en la inicialización del
microcontrolador. Esto se usa para que la tensión se
estabilice, por lo que se recomienda su uso.
CP
Activando este fuse tendremos la garantía de que el
código que escribamos en el PIC no pueda ser leído por
otra persona, para que no nos lo copien, modifiquen,
etc. (Code Protection). Esto no impide que el PIC
funcione como siempre, ni que no se pueda sobrescribir
su contenido. Lo único que nos impide es leerlo.
COMENTARIOS
La finalidad de los comentarios es facilitar la comprension de las
distintas sentencias del programa.
No afecta la compilación; se puede utilizar en cualquier lugar del
programa y con dos formatos.

 //. indica el comienzo del comentario y termina en el final de la misma


linea

//aquí se escribe una caracteristica de la sentencia

/* y */ se utiliza al inicio y al final del comentario, este puede abarcar varias
lineas; con /* indicamos el comienzo del comentario y con */ indicamos el fin del
comentario.

/* este comentario
puede abarcar
varias lineas * /
DIRECTIVAS DE PREPROCESADOR
 Las directivas de preprocesador comienzan con el simbolo # y continuan con un
comando especifico

 #device chip //permite definir el pic con el //que se realizara la compilación

Ejemplo: #device pic16f84

 #device fuses options /*permite definir la palabra configuracion para programar un PIC */

Ejemplo: #fuses xt,wdt,put,protect

 #include “nombre_archivo”/*permite incluir un archivo en el programa*/

Ejemplo:#include<16f84.h>

 #use delay(clock=speed) //Define la frecuencia del oscilador del PIC

 Ejemplo: #use delay(clock=20M)


FUNCIONES DE I/O
Gestion de Puertos I/O
El compilador ofrecen funciones predefinidas para trabajar con los puertos.

 Output_high(pin).- pone en estado logico alto a pin.

Ejemplo: output_high(pin_b2);// pin_b2 seteado a 1

 Output_low(pin).- pone en estado lógico bajo a pin.

Ejemplo: output_low(pin_b2); //pin_b2 seteado a 0

 Input_x().-se obtiene el valor en el puerto correspondiente

Ejemplo: valor=input_b() //obtiene el valor del puertob

 Set_tris_x(valor).- carga el registro tris con el valor(0 a 255)

Ejemplo: set_tris_a(0xff) // configura todos los pines del puerto a como entrada
Funciones Asociados a un terminal o
pin
 El parametro PIN se define en un archivo
include(16f84.h)
 PIN_Xn: X  PUERTO
N  Numero de PIN
Ouput_low(PIN); // Setea a 0 PIN
Output_high(PIN); //Setea a 1 PIN
Ouput_bit(PIN,VALOR); //Setea PIN=VALOR
Ouput_toggle(PIN); //Invierte el estado de PIN
 Valor=Input(PIN); //Lee el valor de PIN
DIRECTIVAS TIPO #USE *_IO
 USE FAST_IO(PUERTO).-

Esta directiva especifica que el compilador no ejecuta ningún cambio de dirección en


los puertos y da por entendido que la persona que programa asigna y se asegura el
valor que corresponde a los registros TRIS antes de realizar una operación IO. Esta
asignación de las direcciones debe hacerse ejecutando la instrucción set_tris_A(),
set_tris_B(), etc. antes de realizar alguna acción con el puerto en cuestión.
 
Características:

Requiere un conocimiento completo de la ejecución del programa y de todas las posibilidades


que pueden sucederse.

 no hay mas direccionamiento de puertos de lo necesario.

Ahorro de memoria.

Reducción del tiempo de ejecución.


DIRECTIVAS DE TIPO #USE *_IO
 #USE STANDARD_IO(Puerto):
Al colocar esta directiva en el programa el compilador cambiara
el registro TRIS correspondiente antes de realizar alguna
operacion con los puertos GPIO.

Este método es para principiantes, pues desliga al programador


el tener que conocer de la configuración de todos los puertos y
lo único que tiene que hacer es ejecutar la acción que desea.

El inconveniente de este método es que el compilador ejecuta la


instrucción set_tris cada vez que hay que ejecutar una operación
de salida o entrada sin importar el estado anterior del puerto, lo
que resulta en un código no optimizado en general mas largo de
lo necesario.
DIRECTIVAS DE TIPO #USE *_IO
 #USE FIXED_IO(Puerto):
El compilador se encarga de generar el
codigo para definir los puertos de acuerdo
con la información que indica la
directiva(donde solo se indican los terminales
de salida) sin tener en cuenta si la operación
es de entrada o salida.
INTERRUPTORES Y PULSADORES
 Estos dispositivos permiten introducir un
nivel lógico “0” o “1” según la posición en que
se encuentren, cerrado o abierto.
Controlar un led conectado al pin 0 del puerto
B de acuerdo al estado en que se encuentra un
pulsador conectado al pin 0 del puerto A

También podría gustarte