Upload
saddam
View
399
Download
8
Embed Size (px)
Citation preview
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
DIRECTIVAS DEL COMPILADOR CCS
#INCLUDE <Nombre_fichero> o #INCLUDE “Nombre_fichero”
Esta directiva hace que el compilador incluya en el fichero fuente el texto que contiene el archivo
especificado en <Nombre_Fichero>.
Si el nombre del fichero se incluye entre los símbolos '< >' el compilador busca el fichero en el
directorio INCLUDE.
Si se pone entre comillas dobles " " el compilador busca primero en el directorio actual o
directorio de trabajo y si no lo encuentra, entonces lo busca en los directorios INCLUDE del
compilador.
Ejemplo:
#include <16C877A.H>
#include "reg_C84.h"
#FUSES opciones
Esta directiva define qué fusibles deben activarse en el dispositivo cuando se programe. Esta
directiva no afecta a la compilación; sin embargo, esta información se pone en el archivo de
salida.
Algunas de las opciones más usadas son:
1. OSCILADOR EXTERNO: LP, XT, HS, RC
XT: Oscilador a cristal hasta un máximo de 4MHz.
HS_ Oscilador a cristal hasta la Maxima frecuencia de trabajo del PIC, que
normalmente, es de 20MHz.
RC: oscilador basado en un circuito RC(Resistencia y Condensador. No son estables
en frecuencia. Son usados en aquellos casos donde no es necesario una precisión en
el tiempo de ejecución del programa.
LP: Osciladores a cristal hasta un máximo de 200KHz. El cristal más utilizado es de
32768Hz.
Ejemplo de Aplicación:
#FUSES HS // Oscilador a cristal tipo HS
#FUSES XT // Oscilador a cristal tipo XT
#FUSES LP // Oscilador a cristal tipo LP
#FUSES RC // Oscilador RC
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
2. PERRO GUARDIAN ( WATH DOG): WDT, NOWDT
El “WATCH DOG” o “Perro Guardian tiene la función de resetear al microcontrolador tras
un periodo de tiempo determinado. En funciones normales, no debería producirse este
reset automático. Su aplicación es muy útil cuando se diseñan aplicaciones que dependen
de recepción de valores por comunicación externa.
# FUSES WDT // Perro Guardian activado
#FUSES NOWDT // Perro Guardian Desactivado
3. TEMPORIZADOR DE ENCENDIDO (POWER-UP TIMER)
Este proporciona un reset al microcontrolador en el momento de conectar la fuente de
alimentación, lo que garantiza un arranque correcto. Se usan las siguientes opciones:
#FUSES PUT // Power-Up timer activado
#FUSES NOPUT // Power-Up timer desactivado
4. BROWNOUT RESET - FALLA DE ALIMENTACION
Origina un estado de reser en el momento en que se detecta una falla en el voltaje de
alimentación.
#FUSES BROWNOUT // Brownout reset activado
#FUSES NOBROWNOUT// Brownout reset desactivado
5. PROTECION DE LA MEMORIA DE PROGRAMA
Cuando se programa un Microcontrolador, debemos protegerlo para evitar que personas
inescrupulosas traten de extraerlo y clonar nuestro proyecto.
Para esto usamos las directivas;
#FUSES PROTECT // Memoria protegida
#FUSES NOPROTECT // Memoria no protegida
Ejemplo:
#fuses HS, NOWDT, NOPUT, NOPROTECT
#USE DELAY(opción)
Esta directiva indica al compilador la frecuencia del procesador, en ciclos por segundo, a la vez
que habilita el uso de las funciones DELAY_MS() y DELAY_US().
Opcionalmente podemos usar la función restart_WDT() para que el compilador reinicie el WDT
durante el retardo.
Ejemplos:
#use delay (clock=20000000)
#use delay (clock=4000000)
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
#BIT
Permite crear una nueva variable de un bit de tamaño, que es colocada en la memoria del PIC
en la posición del byte x y el byte y. esto es muy útil para acceder de una manera sencilla a los
registros. Por supuesto, estas variables pueden ser empleadas de la misma manera que
cualquier otra variable tipo short. El formato de #BIT es el siguiente:
#BIT nombre = x,y
Donde nombre es un nombre de variable CCS valido, x es una constante o una variable CCS
valida e y es una constante de 0 a 7.
Estos son algunos ejemplos de uso:
#BIT T0IF = 0xb.2
T0IF = 0; // limpia el flag de interrupción del timer 0
Int resultado ;
#resultado_primer_bit = resultado.0
If (resultado_primer_bit)
{…………………………… }
#BYTE
Permite crear una nueva variable de un Byte de tamaño, que es colocada en la memoria del
PIC en la posición del byte x.
Esta es una herramienta muy útil para acceder de una manera sencilla a los registros. Por
supuesto, estas variables pueden ser empleadas de la misma manera que cualquier otra
variable tipo int. El formato de #BYTE es el siguiente:
#BYTE nombre = x
Donde nombre es un nombre de variable CCS válido, y x es una constante o una variable CCS
válida.
Estos son algunos ejemplos de uso:
#BYTE STATUS = 3
#BYTE PORTB = 6
#DEFINE La instrucción #define tiene la siguiente forma:
#DEFINE <label> value
<label> es la etiqueta que usaremos en nuestro programa.
Value es el valor que estamos asignando a esta etiqueta.
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
Las instrucciones #DEFINE no generan codigo ASM, si no que el preprocesador realiza los
reemplazos que ellas indican en el momento de la compilación. El uso de #DEFINE permite
construir programas más ordenados y fáciles de mantener.
Veamos algunos ejemplos de #DEFINE
#DEFINE TRUE 1
Cada vez que en nuestro programa aparezca la etiqueta TRUE, el precompilador la reemplazará
por 1.
#DEFINE pi 3.14159265359
Cada vez que en nuestro programa aparezca la etiqueta pi, el precompilador la reemplazará por
3.14159265359
#DEFINE MENOR_DE_EDAD (EDAD < 18)
.
if MENOR_DE_EDAD
printf(“JOVEN”);
El ejemplo anterior permite una mayor claridad en el programa. Por supuesto, no hay que
abusar de #DEFINE, porque podemos obtener el efecto contrario, haciendo nuestros programas
bastante difíciles de comprender.
#DEFINE es una potente herramienta para la creación de macroinstrucciones, ya que soporta el
uso de variables. Veamos algunos ejemplos de esto: #DEFINE var(x,y) unsigned int x=y;
var(a,1)
var(b,2)
var(c,3)
Cuando el preprocesador se encuentra con el código anterior, hace lo mismo que si hubiésemos
escrito lo siguiente: unsigned int a=1;
unsigned int b=2;
unsigned int c=3;
Como puedes ver, #DEFINE puede hacer mucho por tus programas.
VOID Void significa que la función no devolverá ningún parámetro. Supongamos que la función
ejemplo ( ) no debe regresar ningún valor luego de ser llamada. Su prototipo debería ser como
sigue:
void ejemplo( );
Además, podemos usar void para para indicar que la función no recibe parámetros:
void ejemplo2(void);
En el ejemplo, la función ejemplo2( ) no recibe parámetros, ni devuelve ningún valor.
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
LA FUNCIÓN MAIN( )
Como hemos visto, el lenguaje C permite la utilización de funciones. Pe ro hay una función
especial, llamada main( ) que obligatoriamente debe estar presente, y es el punto de entrada a
todo programa en C que escribamos.
La función main( ) tiene la siguiente forma:
Void main( ) {
instruccion;
instruccion;
.
.
instruccion;
}
Donde instrucción; puede ser cualquier instrucción válida del CCS o una llamada a otra función.
COMENTARIOS EN C Hay dos formas de poner comentarios en C:
Poniendo doble barra, esta forma es práctica para comentar una línea.
Ejemplo:
//Este texto es un comentario.
//y este otro también.
la otra forma es meter el texto a comentar dentro de estos símbolos /* mi
comentario*/. La ventaja de este sistema es que podemos comentar bloques de textos
enteros.
Ejemplo:
/* Mi comentario empieza aquí.....
Más comentarios ..
y termina aquí */
El comentar nuestro código es una buena costumbre que no debemos pasar por alto, ya que si pasado
un tiempo queremos volver a un programa y modificar alguna parte de él ayuda mucho el que su
código esté comentado. Otra forma en la que se utilizan los comentarios es a la hora de depurar
código, en vez de estar borrando y escribiendo trozos de código que no funcionan correctamente los
comentamos, de esta forma el compilador no los tratará como código fuente y podremos realizar
ajustes y pruebas de una manera más fácil. Muchas veces también vemos que revisando código que
han hecho otras personas hay partes del código que están comentadas esto es para hacerlo más
funcional, es decir, por poner un ejemplo, si utilizas el PIC 16F877 des comenta esta parte y si utilizas
otro PIC lo dejas comentado, de esta manera comentando o descomentando unas cuantas líneas
podemos utilizar el programa en varias situaciones.
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
DIRECTIVAS DEL COMPILADOR PARA GESTION DE PUERTOS
#USE STANDARD_IO (port)
Esta función afecta directamente al registro de puertos TRISx y además se asegura que cada vez
que se utilice un pin del puerto sea configurado como I/O creando el código necesario. Esta es la
directiva por defecto.
EJEMPLO: #use standard_IO(A)
#USE FAST_IO (port)
Esta directiva se utiliza al principio del programa, en la parte de configuración de PIC, y su uso nos
obliga a utilizar la siguiente directiva:
Set_tris_x (valor);
FAST_IO no nos ayuda modificando el registro TRISx, por ello, hay que asegurarse utilizando el
"Set_tris_x (valor);".
Ejemplo: #use fast_io(A)
#use fast_io(B)
SET_TRIS_X(valor)
Esta directiva nos permite escribir directamente en el registro TRISx con el valor para configurar
los puertos como I/O.
Cada bit del valor corresponde a un pin del puerto y como mencionamos anteriormente, un "0"
significa que el pin quedará configurado como salida y un "1" como entrada.
Ejemplo: set_tris_A(0x00)
set_tris_b( 0x0f ); //En hexadecimal
set_tris_d( 0b00001111 ); //En binario
#USE FIXED_IO (Puerto_Outputs=pin_x#, pin_x#...)
Este método para modificar el registro TRISx hará que el compilador genere el código necesario
para definir los puertos tal y como lo indica la directiva.
En ésta solo se indican cuáles son los terminales que serán utilizados como salida sin tener en
cuenta los demás ya que los configurará como entradas.
Ejemplo:
#use fixed_io(a_outputs=PIN_A2 ,PIN_A3)
PORT_X_PULLUPS ( valor)
Esta función activa/desactiva las resistencias pullups en las entradas del puerto B. El valor puede
ser TRUE (activadas) o FALSE (desactivadas).
Ejemplos: port_b_pullups(TRUE);
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
DIRECTIVAS PARA GESTION DE PUERTOS: ENTRADAS
INPUT(PIN) - EJM: INPUT(PIN_A0);
Esta función retorna el estado del pin indicado. El método de E/S es dependiente de las directivas
Ejemplo: input(pin_A0);
While (!input(PIN_B0))
INPUT_X()
Esta función ingresa un byte del puerto. La dirección del registro es cambiado en acuerdo con la
directiva especificada #USE *_IO. Por defecto con STANDARD I/O
Ejemplo: input_A();
INPUT_STATE(PIN)
Lee el valor del pin sin cambiar el sentido del terminal.
Ejemplo: input_state(PIN_A0);
BIT_TEST (VARIABLE, BIT)
Esta función examina el dígito especificado en bit(0-7 o 0-15) del byte o palabra aportado en var.
Ejemplo:
if( bit_test(x,3) || !bit_test (x,1) ) //o el bit 3 es 1 o el bit 1 es 0
{
}
DIRECTIVAS PARA GESTION DE PUERTOS: SALIDAS
OUTPUT_X(VALUE)
Envía un BYTE al Puerto correspondiente.
Ejemplo: output_b(0x81);
output_b(0B10000001);
OUTPUT_BIT(PIN,VALUE)
Coloca el valor 0 o 1 en un pin I/O especifico.
Ejemplo: output_bit(PIN_C0,1);
output_bit( PIN_B0, 0); // es lo mismo que output_low(pin_B0);
output_bit( PIN_B0,input( PIN_B1 ) ); // Hace que pin_B0 adopte el nivel lógico de pin_B1
output_bit( PIN_B0,shift_left(&data,1,input(PIN_B1)));
ouput_bit(i,shift_left(&data,1,input(PIN_B1)));
OUTPUT_HIGH(PIN)
Colocan al pin seleccionado en nivel lógico ALTO.
Ejemplo: output_high(pin_B0);
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
OUTPUT_LOW(PIN)
Colocan al pin seleccionado en nivel lógico BAJO.
Ejemplo: output_low(pin_B0);
OUTPUT_TOGGLE(PIN)
Cambia el estado del pin cada vez que se ejecuta la función, de "0" a "1" y "1" a "0".
Ejemplo: output_toggle(pin_B0);
OUTPUT_FLOAT(PIN)
Pin de entrada, permitiendo que esté en un estado flotante simulando una salida en colector
abierto.OUTPUT_DRIVE(PIN)
Ejemplo: output_float(pin_B0);
BIT_CLEAR(VARIABLE, BIT)
Simplemente pone a cero un bit especificado (0-7,0-15 o 0-31) dependiendo del tipo de variable.
Esta función equivale a: var &= ~(1<<bit);
int x;
x=5; //101
bit_clear(x,2); // x es ahora: 001
BIT_SET(VARIABLE, BIT)
Esta función pone a nivel lógico “1” el bit especificado (0-7, 0-15 o 0-31) en la variable. El bit
menos significativo es 0. Esta función es similar a la:. Var | = (1 << bit);
Ejemplo:
int x;
x=5;
bit_set(x,3); // x = 13
SWAP(VARIABLE)
Esta función intercambia el nibble alto con el nibble bajo del byte dado. Esto es lo mismo que:
byte = (byte << 4) | (byte >> 4);
Ejemplo:
x=0x45;
swap(x); // x ahora tiene 0x54
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
FUNCIONES DE ROTACION DE DATOS
ROTATE_LEFT(ADDRESS, BYTES)
Esta función rota a la izquierda un bit de un array o de una estructura. Nótese que la rotación
implica que el bit MSB pasa a ser el bit LSB.
ADDRESS puede ser un identificador de un array o la dirección a un byte o a una estructura,
por ejemplo, &dato.
BYTES es el número de bytes implicados en la rotación.
Ejemplo:
x = 0x86;
rotate_left( &x, 1); // x tiene ahora 0x0d
ROTATE_RIGHT(ADDRESS, BYTES)
Esta función rota a la derecha un bit de un array o de una estructura. Nótese que esta rotación
implica que el bit LSB pasa a ser el bit MSB.
ADDRESS puede ser un identificador de un array o la dirección a un byte o a una estructura, por
ejemplo, &dato.
BYTES es el número de bytes implicados en la rotación.
Ejemplo:
struct {
int cell_1 : 4;
nt 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); // celda 1->4, 2->1, 3->2 y 4->3
FUNCIONES DE DESPLAZAMIENTO DE DATOS
SHIFT_LEFT(ADDRESS, BYTES, VALUE)
Esta función desplaza a la izquierda un bit de un array o de una estructura. Nótese la diferencia
entre rotación y desplazamiento; en la primera se produce una 'realimentación' del dato, en la
segunda no.
ADDRESS puede ser un identificador de array o la dirección de una estructura, por ejemplo,
&dato.
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
BYTES es el número de bytes implicados en el desplazamiento. value es el valor del bit que
insertamos. Esta función devuelve el bit que queda fuera en el desplazamiento.
Ejemplo:
byte buffer[3];
for(i=1; i<=24; ++i){
while (!input(PIN_A2));
shift_left(buffer,3,input(PIN_A3));
while (input(PIN_A2)) ;
}
/* lee 24 bits de la patilla A3; cada bit se lee durante la transición de bajo a alto en la patilla A2
*/
SHIFT_RIGHT(address, bytes, value)
Esta función desplaza a la derecha un bit de un array o de una estructura. Nótese la diferencia
entre rotación y desplazamiento; en la primera se produce una 'realimentación' del dato, en la
segunda no.
ADDRESS puede ser un identificador de array o la dirección de una estructura, por ejemplo,
&dato.
BYTES es el número de bytes implicados en el desplazamiento.
VALUE es el valor del bit que insertamos. Esta función devuelve el bit que queda fuera en el
desplazamiento.
Ejemplo:
struct { byte time;
byte command : 4;
byte source : 4;
} msg;
for(i=0; i<=16;++i) {
while(!input(PIN_A2));
shift_right(&msg,3,input(PIN_A1));
while (input(PIN_A2)) ;
}
/* lee 16 bits de la patilla A1; cada bit se lee en la transición de bajo a alto
en la patilla A2 */
for(i=0;i<8;++i)
output_bit(PIN_A0, shift_right(&data,1,0));
/ * desplaza 8 bits y los saca por el Pin_A0; primero sale el LSB * /
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
CONEXIONES BASICAS DEL MICROCONTROLADOR ENTRENADOR PIC16F877A
ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I
Tec. NICANOR ALMIDON 956410288
PROGRAMADOR USB PICKIT2