Anda di halaman 1dari 38

Funciones del compilador CCS

Introduccin
CCFF D.P.E. MDULO DE PROYECTOS 2
Las funciones permitidas por el compilador CCS las vamos a
considerar divididas en dos grandes bloques:
1. Funciones del C estndar
2. 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 3
Funciones de manejo del microcontrolador
Se pueden dividir en los siguientes grupos:
1. Funciones de control del procesador
2. Funciones de I/O discreta
3 Funciones de manipulacin de byte/bits
4 Funciones de temporizadores/contadores
5. Funciones de retardos
6. Funciones para la EEPROM interna
7. Funciones para el LCD
8. Funciones de I/O con el bus I2C
9. Funciones de entrada A/D
10. Funciones CCP
11. Funciones de I/O PSP
12. Funciones de Voltaje de referencia
13. Funciones de I/O SPI a dos hilos
14. Funciones de I/O serie RS232
CCFF D.P.E. MDULO DE PROYECTOS 4
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
overflowdel timer0
INT_EEPROM
Prohbe la interrupcin por
finalizacin de escritura en
la EEPROM
CCFF D.P.E. MDULO DE PROYECTOS 5
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 6
* 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
overflowdel timer0
INT_EEPROM
Permite la interrupcin por
finalizacin de escritura en
la EEPROM
CCFF D.P.E. MDULO DE PROYECTOS 7
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 8
* 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 9
* 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 10
* 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 11
* 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 12
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 13
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 14
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 estaren 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 15
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 deberhaber
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 16
Directivas para otros dispositivos:
SET_TRIS_C (VALOR) SET_TRIS_D(VALOR) SET_TRIS_E (VALOR)
CCFF D.P.E. MDULO DE PROYECTOS 17
* OUTPUT_X( valor)
output_a (valor);
output_B (valor);
valor: esun enterode 8 bits querepresentael datoque
enviamosal 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 18
* 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
puertos del dispositivo utilizado
CCFF D.P.E. MDULO DE PROYECTOS 19
* 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) ); // esperahastaqueel pin B1 sea 1
Los pines o patillasde losdispositivosestndefinidosen el
archivode cabeceraquehayamosutilizado
Si estamosutilizandoel PIC 16F84, habremosescrito:
#include <16F84.H>
Laasignacinde pines quehayen dichoarchivoson:
CCFF D.P.E. MDULO DE PROYECTOS 20
////////////////////////////////////////////////////////////////// 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 40
#define PIN_A1 41
#define PIN_A2 42
#define PIN_A3 43
#define PIN_A4 44
#define PIN_B0 48
#define PIN_B1 49
#define PIN_B2 50
#define PIN_B3 51
#define PIN_B4 52
#define PIN_B5 53
#define PIN_B6 54
#define PIN_B7 55
CCFF D.P.E. MDULO DE PROYECTOS 21
* 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 queB1
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 22
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) ;// lasresistenciasde pull up activadas
CCFF D.P.E. MDULO DE PROYECTOS 23
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 24
* 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 casode quese quieranobtener retardossuperioresa 65535
milisegundos, se debernhacer llamadasa unafuncinseparada.
CCFF D.P.E. MDULO DE PROYECTOS 25
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 26
* 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 27
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; //declaramos una variable
x=5; //inicializamos la variable 00000101b
bit_clear(x,2); // x es ahora 1 = 00000001b
CCFF D.P.E. MDULO DE PROYECTOS 28
* 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; //declaramos una variable
x=5; //inicializamos la variable 00000101b
bit_set(x,3); // x es ahora 13d = 00001101b
CCFF D.P.E. MDULO DE PROYECTOS 29
* 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 30
* 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; //x=0b11110000
swap(x); //x ahora es 0x0f x=0b00001111
CCFF D.P.E. MDULO DE PROYECTOS 31
* 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).
addresspuede ser un identificador de un arrayo la direccin a un
byteo a una estructura; por ejemplo, &dato.
byteses el nmero de bytesimplicados en la rotacin.
Ejemplos:
x=0x0f; //x=0b00001111
rotate_right(&x,1); //x ahora es 0x17 x=0b10000111
CCFF D.P.E. MDULO DE PROYECTOS 32
* 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 and4->3
CCFF D.P.E. MDULO DE PROYECTOS 33
* 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).
addresspuede ser un identificador de un arrayo la direccin a un
byteo a una estructura; por ejemplo, &dato.
byteses el nmero de bytesimplicados en la rotacin.
Ejemplos:
x=0x81; // x=0b10000001
rotate_lefth(&x,1);//x ahora es 0x03 x=0b00000011
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.
addresspuede ser un identificador de un arrayo la direccin a un
byteo a una estructura; por ejemplo, &dato.
byteses el nmero de bytesimplicados 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
* 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.
addresspuede ser un identificador de un arrayo la direccin a un
byteo a una estructura; por ejemplo, &dato.
byteses el nmero de bytesimplicados 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 36
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 37
* 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.
addresspuede ser un identificador de un arrayo la direccin a un
byteo a una estructura; por ejemplo, &dato.
byteses el nmero de bytesimplicados 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 38
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
}