Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema - 7 Funciones en CCS PDF
Tema - 7 Funciones en CCS PDF
Introduccin
Las funciones permitidas por el compilador CCS las vamos a
considerar divididas en dos grandes bloques:
1.
2.
1.
* 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
INT_EXT
Prohbe la interrupcin
externa
INT_RB
INT_TIMER0 (RTCC)
INT_EEPROM
CCFF D.P.E.
Ejemplos:
DISABLE_INTERRUPS(GLOBAL)
disable_interrups(timer0)
Interrupciones para otros dispositivos:
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
* 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
INT_EXT
Permite la interrupcin
externa
INT_RB
INT_TIMER0 (RTCC)
INT_EEPROM
CCFF D.P.E.
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
EXT_INT_EDGE(edge)
RESET_CPU()
* 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
10
RESTART_CAUSE()
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( );
}
12
2.
*
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
15
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);
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()
18
INPUT(PIN)
19
////////////////////////////////////////////////////////////////// I/O
//
PORT_B_PULLUPS(), INPUT(),
//
OUTPUT_LOW(), OUTPUT_HIGH(),
//
OUTPUT_FLOAT(), OUTPUT_BIT()
#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
20
OUTPUT_BIT(pin,valor)
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
22
3.
*
Funciones de RETARDOS
DELAY_CYCLES(VALOR);
23
DELAY_MS(TIEMPO);
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.
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
26
4.
*
00000101b
00000001b
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);
00000101b
00001101b
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)
//x=0b11110000
x=0b00001111
30
ROTATE_RIGHT(address,bytes)
//x=0b00001111
x=0b10000111
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);
32
ROTATE_LEFTH(address,bytes)
// x= 0b10000001
x= 0b00000011
33
SHIFT_RIGHT(address,bytes,value)
34
SHIFT_RIGHT(address,bytes,value)
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)
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
}
38