Está en la página 1de 38

Funciones del compilador CCS

Introduccin
Las funciones permitidas por el compilador CCS las vamos a
considerar divididas en dos grandes bloques:
1.
2.

Funciones del C estndar


Funciones propias del microcontrolador

Las primeras no se desarrollarn en este tema mientras que las


segundas sern objeto de estudio.
En un primer momento se explicarn dentro de cada grupo
aquellas que se puedan utilizar con el dispositivo 16F84,
amplindose el estudio segn se vaya precisando.
CCFF D.P.E. MDULO DE PROYECTOS

Funciones de manejo del microcontrolador


Se pueden dividir en los siguientes grupos:
1.
2.
3
4
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

Funciones de control del procesador


Funciones de I/O discreta
Funciones de manipulacin de byte/bits
Funciones de temporizadores/contadores
Funciones de retardos
Funciones para la EEPROM interna
Funciones para el LCD
Funciones de I/O con el bus I2C
Funciones de entrada A/D
Funciones CCP
Funciones de I/O PSP
Funciones de Voltaje de referencia
Funciones de I/O SPI a dos hilos
Funciones de I/O serie RS232
CCFF D.P.E. MDULO DE PROYECTOS

1.

Funciones de control del procesador

* DISABLE_INTERRUPS(LEVEL)
Esta funcin desactiva la interrupcin especificada en level.
El nivel GLOBAL prohbe todas las interrupciones, aunque
estn habilitadas o permitidas. Las interrupciones que
podemos manejar son:
INTERRUPCIN

EFECTO

GLOBAL

Prohbe todas las


interrupciones

INT_EXT

Prohbe la interrupcin
externa

INT_RB

Prohbe la interrupcin por


cambio de nivel en RB

INT_TIMER0 (RTCC)

Prohbe la interrupcin por


overflow del timer0

INT_EEPROM
CCFF D.P.E.

Prohbe la interrupcin por


finalizacin de escritura en
MDULO DE PROYECTOS
la EEPROM

Ejemplos:
DISABLE_INTERRUPS(GLOBAL)
disable_interrups(timer0)
Interrupciones para otros dispositivos:

INT_TIMER1 INT_TIMER2 INT_AD

INT_CCP1

INT_CCP2

INT_PSP

INT_COMP INT_I2C

INT_AD

INT_CP1

INT_SSP

INT_TBE

INT_RDA

INT_ADOF

INT_RC

INT_BUTTON

CCFF D.P.E. MDULO DE PROYECTOS

* ENABLE_INTERRUPS(LEVEL)
Esta funcin activa la interrupcin especificada en level. El
nivel GLOBAL permite todas las interrupciones que estn
habilitadas o permitidas de forma individual. Las
interrupciones que podemos manejar (F84) son:
INTERRUPCIN

EFECTO

GLOBAL

Permite todas las


interrupciones

INT_EXT

Permite la interrupcin
externa

INT_RB

Permite la interrupcin por


cambio de nivel en RB

INT_TIMER0 (RTCC)

Permite la interrupcin por


overflow del timer0

INT_EEPROM
CCFF D.P.E.

Permite la interrupcin por


finalizacin de escritura en
la EEPROM
MDULO DE PROYECTOS

Ejemplos:
disable_interrups(GLOBAL); //Prohbe todas las interrupciones
enable_interrups(INT_RB);
//Permite la INTerrupcin por cambio
//de nivel en los pines RB4:RB7
enable_interrups(INT_EXT); //Permite la INTterrupcin EXterna
enable_interrups(INT_RTCC); //Permite la interrupcin del timer0
enable_interrups(global);
//Permite todas las interrupciones
//anteriores

CCFF D.P.E. MDULO DE PROYECTOS

EXT_INT_EDGE(edge)

Esta funcin determina el flanco de activacin de la


interrupcin externa. E flanco puede ser de subida ( L_TO_H)
o de bajada (H_TO_L) .
Ejemplo:
ext_int_edge(L_TO_H);
// interrupcin externa
//activa con el flanco de
*
SLEEP()
Esta funcin pone al micro en modo de bajo consumo.
Ejemplo:
SLEEP();
// micro en estado de reposo
CCFF D.P.E. MDULO DE PROYECTOS

RESET_CPU()

Esta funcin resetear la CPU, no necesita parmetros ni


devolver ningn valor, el efecto es poner el contado de
programa con el valor 00h
Ejemplo:
if (checksum!= 0)
reset_cpu();

CCFF D.P.E. MDULO DE PROYECTOS

* CLEAR_INTERRUPT( level)
Esta funcin pondr a cero el flag indicado en level.
Ejemplo:
clear_interrupt(int_timer1);

//pon a 0 el flag de la
//interrupcin del timer 1

CCFF D.P.E. MDULO DE PROYECTOS

10

RESTART_CAUSE()

Esta funcin devolver la razn por la que se ha producido el


ltimo reset del procesador. Los valores de retorno pueden
ser:
WDT_FROM_SLEEP

salida del modo de reposo por


desboramiento del perro guardin
WDT_TIME_OUT
reset por desbordamiento del perro
guardin
MCLR_FROM_SLEEP salida del modo de bajo consumo por
activacin de Master Clear
NORMAL_POWER_UP reset al conectar la alimentacin

CCFF D.P.E. MDULO DE PROYECTOS

11

Ejemplo:
En el siguiente ejemplo utilizamos la funcin restart_cause, en
funcin del valor devuelto realizamos lo siguiente:
1. si la causa ha sido que el perro guardin ha sacado el micro
del estado de reposo NO HACEMOS NADA
2. Si la causa fue un reset por desbordamiento del perro
guardin dentro de la ejecucin de un programa, se llama a
una funcin que se ha creado handle_error( ) error de
manipulacin
switch (restart_cause( )) {
case WDT_FROM_SLEEP: ;
case WDT_FROM_TIMEOUT:
handle_error( );
}

CCFF D.P.E. MDULO DE PROYECTOS

12

2.
*

Funciones de I/O discreta


SET_TRIS_A(VALOR); SET_TRIS_B(VALOR)

Estas funciones permiten escribir directamente los registros


de configuracin de los puertos A y B respectivamente.
Ejemplos:
SET_TRIS_A(0X1F); // A0 HASTA A4 COMO ENTRADAS
SET_TRIS_B(0X0F); // B0 HASTA B3 COMO ENTRADAS
// B4 HASTA B7 COMO SALIDAS

CCFF D.P.E. MDULO DE PROYECTOS

13

Estas
funciones se utilizan con la directivas del
preprocesador:
#use standart_io (port) #use fast_io (port) y
#use fixed_io (puerto.)
Directiva #USE STANDART (port)
Esta directiva afecta a la forma en que el compilador generar el
cdigo de entrada y salida de las instrucciones que siguen.
La directiva estar en vigor hasta que se encuentre otra directiva
#use xxx_io.
Standard_io es el mtodo que se utilizar por defecto el
compilador para las operaciones de E / S en todos los puertos .
Al utilizar esta directiva, el compilador generar cdigo para
hacer una E/S, en la serie 5X de procesadores; esto requiere un
byte de RAM para cada puerto serie estndar de I /O.
Ejemplo: #use standart_io( A)
CCFF D.P.E. MDULO DE PROYECTOS

14

Directiva #USE FAST(port)


Con esta directiva
las funciones input y output no
reprograman los pines de los puertos cada vez que se utilizan, con
lo que el cdigo generado es menor, el programador deber haber
fijado previamente la direccin de los pines del puerto mediante el
correspondiente SET_TRIS_X(valor).
Ejemplo: #use fast_io(A)
Directiva #USE FIXED_I0(puerto_OUTPUTS=pinx#,pin_x)
Con esta directiva las funciones input y output, reprograman
los pines de los puertos cada vez que se utilizan, con lo que el
cdigo generado es mayor, sin embargo nos ahorramos una
posicin de RAM por cada uno de los puertos utilizados.
Ejemplo: #use fixed_io(a_outputs=PIN_A2, PIN_A3)

CCFF D.P.E. MDULO DE PROYECTOS

15

Directivas para otros dispositivos:

SET_TRIS_C (VALOR) SET_TRIS_D (VALOR) SET_TRIS_E (VALOR)

CCFF D.P.E. MDULO DE PROYECTOS

16

* OUTPUT_X( valor)
output_a (valor);
output_B (valor);
valor: es un entero de 8 bits que representa el dato que
enviamos al puerto. El registro de direccin se cambia de
acuerdo con lo especificado en la ltima directiva # USE * _IO.
Ejemplo:
OUTPUT_B(0xf0);
//saca 0xf0 por el puerto B
Directivas para otros dispositivos:

output_x (valor);

x puede adoptar el valor desde a


hasta k dependiendo del nmero de
puertos del dispositivo utilizado
CCFF D.P.E. MDULO DE PROYECTOS

17

INPUT_x()

Value = input_a( )
Value = input_b( )
Parmetros: Ninguno
Retorna: un entero de 8 bits que representa el dato de entrada al
puerto.
El registro de direccin se cambia de acuerdo con lo especificado en
la directiva # USE * _IO. Por defecto con el estndar de I/O antes de
la entrada de datos se programa la direccin como todo entradas.
temperatura = input_b();
sensores = input_a();
Directivas para otros dispositivos:
Value = input_x()

X puede adoptar el valor desde a


hasta k dependiendo del nmero de
CCFFpuertos
D.P.E. MDULO
DE PROYECTOS
del dispositivo
utilizado

18

INPUT(PIN)

Devuelve el estado 0 1 de la patilla indicada en pin. El


mtodo de acceso de I/O depende de la ltima directiva #USE
*IO utilizada, el valor de retorno es un entero corto.
Ejemplo:
while ( !input(PIN_B1) ); // espera hasta que el pin B1 sea 1
Los pines o patillas de los dispositivos estn definidos en el
archivo de cabecera que hayamos utilizado
Si estamos utilizando el PIC 16F84, habremos escrito:
#include <16F84.H>
La asignacin de pines que hay en dicho archivo son:

CCFF D.P.E. MDULO DE PROYECTOS

19

////////////////////////////////////////////////////////////////// I/O

// Discrete I/O Functions: SET_TRIS_x(), OUTPUT_x(), INPUT_x(),

//
PORT_B_PULLUPS(), INPUT(),

//
OUTPUT_LOW(), OUTPUT_HIGH(),

//
OUTPUT_FLOAT(), OUTPUT_BIT()

// Constants used to identify pins in the above are:

#define PIN_A0
#define PIN_A1
#define PIN_A2
#define PIN_A3
#define PIN_A4

40
41
42
43
44

#define PIN_B0
#define PIN_B1
#define PIN_B2
#define PIN_B3
#define PIN_B4
#define PIN_B5
#define PIN_B6
#define PIN_B7

48
49
50
51
52
53
54
55

CCFF D.P.E. MDULO DE PROYECTOS

20

OUTPUT_BIT(pin,valor)

Esta funcin saca el bit dado en valor (0 1) por la patilla


especificada en pin
El mtodo de acceso de I/O depende de la ltima directiva #USE
*IO utilizada
Ejemplos:
output_bit( PIN_B0, 0); // pone a 0 el pin _B0);
output_bit( PIN_B0,input( PIN_B1 ) );// pone B0 igual que B1
OUTPUT_LOW(pin)
Esta funcin pone a 0 la patilla especificada en pin, El mtodo de
acceso de I/O depende de la ltima directiva #USE *IO utilizada
Ejemplo:
output_low( PIN_B0); // pone a 0 el pin _B0);

CCFF D.P.E. MDULO DE PROYECTOS

21

OUTPUT_HIGH(pin)
Esta funcin pone a 1 la patilla especificada en pin, el mtodo de
acceso de I/O depende de la ltima directiva #USE *IO utilizada
Ejemplo:
output_high( PIN_A1); // pone a 1 el pin _A1);
PORT_B_PULLUPS(flag)
Esta funcin activa/desactiva las resistencias de PULL UP del
puerto b flag puede ser TRUE (activa) o FALSE (desactiva)
Ejemplo:
port_b_pullups(TRUE) ;// las resistencias de pull up activadas

CCFF D.P.E. MDULO DE PROYECTOS

22

3.
*

Funciones de RETARDOS
DELAY_CYCLES(VALOR);

Esta funcin realiza un retardo igual al nmero de ciclos


especificado en VALOR, el rango permitido para valor va desde
1 hasta 255.
Ejemplos:
delay_cycles (1); // retardo de 1 ciclo, equivale a 1 NOP
delay_cycles(255); // retardo de 255 NOP

CCFF D.P.E. MDULO DE PROYECTOS

23

DELAY_MS(TIEMPO);

Esta funcin realiza un retardo de tantos milisegundos como


especifique TIEMPO, el rango permitido para valor va desde 0
hasta 65535.
Antes de utilizar esta funcin deberemos especificar al
compilador la frecuencia del reloj, mediante la directiva:
#use delay (clock=4000000)
Ejemplo:
#use delay (clock=4000000) // frecuencia del reloj
delay_ms(100); // retardo de 100 milisegundos
En el caso de que se quieran obtener retardos superiores a 65535
milisegundos, se debern hacer llamadas a una funcin separada.

CCFF D.P.E. MDULO DE PROYECTOS

24

Ejemplo:
Construimos un retardo de n segundos basndonos en un retardo
de 1 segundo
#use delay (clock=4000000) // frecuencia del reloj
void retardo_segundos(int n){
for(;n!=0;n--)
// se ejecuta n veces
delay_ms (1000);
// retardo de 1 segundo
}
n es un valor entre 0 y 255
Para efectuar los retardos no se utilizan los timers. Si las
interrupciones estn habilitadas el tiempo que se emplea en
atender a cualquier interrupcin no se cuenta para efectuar el
retardo.

CCFF D.P.E. MDULO DE PROYECTOS

25

* DELAY_US(TIEMPO);
Esta funcin realiza un retardo de tantos microsegundos
como especifique TIEMPO, el rango permitido para
(TIEMPO) va desde 0 hasta 65535.
Ejemplo:
#use delay (clock=4000000) // frecuencia del reloj
delay_us(100); // retardo de 100 microsegundos
int retardo = 33;
// valor s que queremos retardar
delay_us (retardo)
//llamada a la funcin de retardo

CCFF D.P.E. MDULO DE PROYECTOS

26

4.
*

Funciones de MANIPULACIN DE BIT/BYTE


BIT_CLEAR(var,bit)

Esta funcin pone a 0 el bit especificado del byte o palabra


sealado en var; los valores permitidos son 0:7 en el caso de la
variable sea 1 byte y de 0:15 en el caso de palabras.
El bit LSB (menos significativo es el 0).
Esta funcin es igual a : var &= ~(1<<bit);
Ejemplo:
int x;
x=5;
bit_clear(x,2);

//declaramos una variable


//inicializamos la variable
//
x es ahora 1 =

00000101b
00000001b

CCFF D.P.E. MDULO DE PROYECTOS

27

* BIT_SET(var,bit)
Esta funcin pone a 1 el bit especificado del byte o palabra
sealado en var; los valores permitidos son 0:7 en el caso de la
variable sea 1 byte y de 0:15 en el caso de palabras.
El bit LSB (menos significativo es el 0).
Esta funcin es igual a : var |= ~(1<<bit);
Ejemplo:
int x;
x=5;
bit_set(x,3);

//declaramos una variable


//inicializamos la variable
//
x es ahora 13d =

00000101b
00001101b

CCFF D.P.E. MDULO DE PROYECTOS

28

* BIT_TEST(var,bit)
Esta funcin retorna el valor 0 o1 que posee bit especificado
del byte o palabra sealado en var; los valores permitidos son 0:7
en el caso de la variable sea 1 byte y de 0:15 en el caso de
palabras.
El bit LSB (menos significativo es el 0).
Esta funcin es igual, aunque mucho mas eficaz que:
((var &(1<<bit))!=0;
Ejemplo:
if( bit_test(x,3) || !bit_test (x,1) ){
//si el bit 3 o el bit 1 es 0
}
CCFF D.P.E. MDULO DE PROYECTOS

29

SWAP(lvalue)

Esta funcin intercambia los 4 bits de menor peso de la


variable lvalue con los 4 de mayor peso.
LVALUE es una variable de un byte
La funcin es igual a: byte = (byte << 4) | (byte >> 4);
Ejemplo:
x=0xf0;
swap(x);

//x ahora es 0x0f

//x=0b11110000
x=0b00001111

CCFF D.P.E. MDULO DE PROYECTOS

30

ROTATE_RIGHT(address,bytes)

Esta funcin rota a la derecha un bit de un array o de una


estructura. La rotacin hace que el bit de menor peso (LSB) pasa
a ser el de mayor peso (MSB).
address puede ser un identificador de un array o la direccin a un
byte o a una estructura; por ejemplo, &dato.
bytes es el nmero de bytes implicados en la rotacin.
Ejemplos:
x=0x0f;
rotate_right(&x,1); //x ahora es 0x17

//x=0b00001111
x=0b10000111

CCFF D.P.E. MDULO DE PROYECTOS

31

ROTATE_RIGHT(address,bytes)

struct {
int cell_1 : 4;
int 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);

// cell_1->4, 2->1, 3->2 and 4-> 3

CCFF D.P.E. MDULO DE PROYECTOS

32

ROTATE_LEFTH(address,bytes)

Esta funcin rota a la izquierda un bit de un array o de una


estructura. La rotacin hace que el bit de mayor peso (MSB)
pasa a ser el de menor peso (LSB).
address puede ser un identificador de un array o la direccin a un
byte o a una estructura; por ejemplo, &dato.
bytes es el nmero de bytes implicados en la rotacin.
Ejemplos:
x=0x81;
rotate_lefth(&x,1);//x ahora es 0x03

// x= 0b10000001
x= 0b00000011

CCFF D.P.E. MDULO DE PROYECTOS

33

SHIFT_RIGHT(address,bytes,value)

Esta funcin desplaza a la derecha un bit de un array o de una


estructura.
La diferencia entre rotacin y desplazamiento es que en la
rotacin se produce la realimentacin del dato y en la segunda
no.
address puede ser un identificador de un array o la direccin a un
byte o a una estructura; por ejemplo, &dato.
bytes es el nmero de bytes implicados en el desplazamiento.
value es el valor que introducimos, es decir el que ocupar la
posicin de mayor (MSB) puede ser 0 1.
La funcin retorna el bit que queda fuera en el desplazamiento,
en este caso el LSB.
CCFF D.P.E. MDULO DE PROYECTOS

34

SHIFT_RIGHT(address,bytes,value)

Esta funcin desplaza a la derecha un bit de un array o de una


estructura.
La diferencia entre rotacin y desplazamiento es que en la
rotacin se produce la realimentacin del dato y en la segunda
no.
address puede ser un identificador de un array o la direccin a un
byte o a una estructura; por ejemplo, &dato.
bytes es el nmero de bytes implicados en el desplazamiento.
value es el valor que introducimos, es decir el que ocupar la
posicin de mayor (MSB) puede ser 0 1.
La funcin retorna el bit que queda fuera en el desplazamiento,
en este caso el LSB.
CCFF D.P.E. MDULO DE PROYECTOS

35

Ejemplo:
/* lee 16 bits por la patilla A1; cada bit se lee cuando ocurre una
transicin de 0 a 1 en el pin A2 */
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)) ;}
// This shifts 8 bits out PIN_A0, LSB first.
for(i=0;i<8;++i)
output_bit(PIN_A0,shift_right(&data,1,0));
CCFF D.P.E. MDULO DE PROYECTOS

36

SHIFT_LEFT(address,bytes,value)

Esta funcin desplaza a la izquierda un bit de un array o de una


estructura.
La diferencia entre rotacin y desplazamiento es que en la
rotacin se produce la realimentacin del dato y en la segunda
no.
address puede ser un identificador de un array o la direccin a un
byte o a una estructura; por ejemplo, &dato.
bytes es el nmero de bytes implicados en el desplazamiento.
value es el valor que introducimos, es decir el que ocupar la
posicin de mayor (MSB) puede ser 0 1.
La funcin retorna el bit que queda fuera en el desplazamiento,
en este caso el LSB.
CCFF D.P.E. MDULO DE PROYECTOS

37

Ejemplo:
/* lee 24 bits por la patilla A3; cada bit se lee cuando ocurre una
transicin de 0 a 1 en el pin A2 */
byte buffer [3];
for(i=1; i<= 24;++i){
while(!input(PIN_A2)); //esperamos mientras A2 = 1
shift_left(buffer,3,input(PIN_A3));
while(input(PIN_A2));// esperamamos mientras A2=0
}

CCFF D.P.E. MDULO DE PROYECTOS

38

También podría gustarte