clase 02 gestion de puertos - directivas

12
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

Upload: saddam

Post on 21-Jan-2018

403 views

Category:

Education


8 download

TRANSCRIPT

Page 1: Clase 02   gestion de puertos - directivas

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

Page 2: Clase 02   gestion de puertos - directivas

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)

Page 3: Clase 02   gestion de puertos - directivas

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.

Page 4: Clase 02   gestion de puertos - directivas

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.

Page 5: Clase 02   gestion de puertos - directivas

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.

Page 6: Clase 02   gestion de puertos - directivas

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);

Page 7: Clase 02   gestion de puertos - directivas

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);

Page 8: Clase 02   gestion de puertos - directivas

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

Page 9: Clase 02   gestion de puertos - directivas

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.

Page 10: Clase 02   gestion de puertos - directivas

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 * /

Page 11: Clase 02   gestion de puertos - directivas

ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I

Tec. NICANOR ALMIDON 956410288

CONEXIONES BASICAS DEL MICROCONTROLADOR ENTRENADOR PIC16F877A

Page 12: Clase 02   gestion de puertos - directivas

ELEKTRONIKA INDUXTRIAL MIKROKONTROLADORES I

Tec. NICANOR ALMIDON 956410288

PROGRAMADOR USB PICKIT2