Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CCS Compiler
CCS Compiler
El CCS Compiler
es una herramienta útil para programar microcontroladores PIC, en la
cual están incluidas muchas librerías para el manejo de puertos,
protocolos de comunicación y entre otros.
# FUSE
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:
LP, XT, HS, RC (Tipo de oscilador)
WDT, NOWDT (Activación del Watch Dog Timer)
PROTECT, NOPROTECT (Protección del código)
PUT, NOPUT (Temporizador de arranque)
BROWNOUT, NOBROWNOUT (Detección de caídas
de tensión de la fuente de alimentación)
Ejemplo #fuse HS, WDT.
Directivas de preprocesado
#INT_XX
Estas directivas especifican que la función que le sigue
es una función de interrupción. Las funciones de
interrupción no pueden tener ningún parámetro. Como es
natural, no todas las directivas pueden usarse con todos
los dispositivos. Las directivas más comunes son las
siguientes:
#INT_EXT: Interrupción externa
#INT_TRCC: Desbordamiento del TIMER0 (RTCC)
#INT_RB: Cambio en los pines B4, B5, B6, B7
#INT_AD: Conversor A/D
#INT_TIMER1: Desbordamiento del TIMER1.
#INT_TIMER2: Desbordamiento del TIMER2
#INT_CP1: Modo captura de datos por
CCP1
#INT_CCP2: Modo captura por CCP2
Directivas de preprocesado
#USE DELAY (Clock = Frecuencia):
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().
Ejemplo: #USE DELAY (CLOCK = 4000000)
Input(pin)
Devuelve el estado '0' o '1' de la patilla indicada en pin. El método de acceso de I/O depende de la última
directiva #USE *_IO utilizada. El valor de retorno es un entero corto.
Ejemplo : if (Input(Pin_B0)==1)
Output _high(pin)
Pone a 'uno' el pin indicado. El método de acceso de I/O depende de la última directiva #USE *_IO utilizada.
Ejemplo : Output_high(PIN_C0)
Output_low(pin)
Pone a 'cero' el pin indicado. El método de acceso de I/O depende de la última directiva #USE *_IO.
Ejemplo : Output_low(PIN_D0)
Funciones
FUNCIONES DISCRETAS DE I/0
Port_b_pullups(flag)
Esta función activa/desactiva las resistencias pullups en las entradas del puerto B. Flag puede ser TRUE (activa)
o FALSE (desactiva).
Ejemplo: Port_b_pullups(false)
Set_ tris_puerto(Valor)
Estas funciones permiten escribir directamente los registros tri-estado para la configuración de los puertos (configurar
pines de entrada y salida)
Esto debe usarse con FAST_IO(), cuando se accede a los puertos de I/O como si fueran memoria, igual que cuando se
utiliza una directiva #BYTE. Cada bit de value representa una patilla. Un '1' indica que la patilla es de entrada y un '0'
que es de salida.
Delay_ms(Valor)
Esta función realiza retardos del valor especificado en tiempo. Dicho valor de tiempo es en milisegundos y
el rango es 0-65535.
Para obtener retardos más largos así como retardos 'variables' es preciso hacer llamadas a una función
Separada.
Delay_us(Valor)
Esta función realiza retardos del valor especificado en tiempo. Dicho valor es en microsegundos y el rango va
desde 0 a 65535. Es necesario utilizar la directiva #use delay antes de la llamada a esta función para que el
compilador sepa la frecuencia de reloj.
FUNCIONES PARA LA MANIPULACIÓN DE BITS
Bit_clear (Var, Bit)
Esta función simplemente borra (pone a '0') el dígito especificado en bit(0-7 ó 0-15) del byte o palabra aportado en var. El
bit menos significativo es el 0.
Bit_set(Var, bit)
Esta función pone a '1' el dígito especificado en bit(0-7 o 0-15) del byte o palabra aportado en var.
Rotate_left(Dirección, 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. Dirección 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 = 0*50
Rotate_left(&X, 1) ; 0*A0
float voltaje=0;
int8 suma=0;
int contador=10;
VARIABLES globales y locales
Las variables de finidas en un programa pueden ser de tipo LOCAL o GLOBAL . Las variables locales sólo
se utilizan en la función donde se encuentran declaradas; las variables globales se pueden utilizar en
todas las funciones del programa. Ambas deben declararse antes de ser utilizadas y las globales deben
declararse antes de cualquier función y fuera de ellas. Las variable globales son puestas a cero cuando
se inicia la función principal main().
VARIABLES globales y locales
Las variables pueden ser de fi nidas con:
AUTO : (usada por defecto, no hace falta que se indique) donde la variable existe mientras la función
esta activa. Estas variables no se inicializan a cero. Su valor se pierde cuando se sale de la función.
STATIC : Una variable local se activa como global, se inicializa a cero y mantiene su valor al entrar y salir
de la función.
Un valor 0 (cero) en estos registros indica que el terminal correspondiente del puerto es
de salida, mientras que un valor 1(uno) indica que será de entrada.
Manejo de puertos en C compiler
A través de la RAM Se de finen los registros PORTx y TRISx como bytes y se sitúan
en la posición correspondiente de la memoria RAM .
Una vez definidas estas variables se pueden configurar y controlar los puertos a
través de los comandos de asignación.
TRISA = 0xFF; // 8 terminales de entrada
TRISB = 0x00; // 8 terminales de salida
TRISC = 0x0F; // 4 terminales de mayor peso de salida, 4 terminales de
// menor peso de entrada
Lectura de puertos:
valor = PORTA; // Asigna el dato del puerto A a la variable valor.
Manejo de puertos en C compiler
Manejo de sentencias:
TRISD=0x0F;
if (PORTD & 0x0F) PORTD |= 0xA0; // comprueba los 4 terminales de
// menor peso del puerto D y si son
// 1111 saca por los 4 terminales de
// mayor peso el dato 1010.
Existen unas funciones de C que permiten trabajar bit a bit con los registros o
variables definidas previamente.
Estas funciones son las siguientes:
bit_clear (var,bit); // Pone a 0 el bit especí fi co (0 a 7) de la variable.
bit_set (var , bit); // Pone a 1 el bit especí fi co (0 a 7) de la variable.
bit_test (var , bit); // Muestra el bit especí fi co (0 a 7) de la variable.
swap (var); // Intercambia los 4 bits de mayor peso por los 4);
// menor peso de la variable los 4 de bit_set (PORTC ,
Manejo de puertos
El compilador nos ofrece funciones predefinidas que nos ayudan a trabajar con los puertos
Ejemplos:
Ejemplos:
If-Else
While
Do-While
For
Switch-Case
Return
Break, Continue y Goto
IF-ELSE
Con la ayuda del comando IF-ELSE se pueden tomar decisiones
sentencias;
}
En las expresiones del FOR la inicialización es una variable a la cual se le asigna un
valor inicial con el que controlar el bucle.
La condición de finalización sirve para evaluar ANTES de ejecutar las sentencias si
es cierta o no, en el caso de ser cierta se ejecutan las sentencias y en caso contrario
se sale del FOR .
Evalúa la expresión y en orden a la CONSTANTE adecuada realiza las sentencias asociadas. Si ninguno
de los CASE corresponde a la CONSTANTE se ejecuta DEFAULT (este comando es opcional).
El comando BREAK provoca la salida de SWITCH , de lo contrario se ejecuta el siguiente CASE . NOTA
No pueden existir dos CASE con la misma CONSTANTE
Ejemplo de Switch en diagrama de bloque
While y Do-While
Se utiliza para repetir sentencias.
Do
DO-WHILE se diferencia del WHILE y del FOR en la
{ condición de finalización, la cual se evalúa al final del
sentencias; bucle, por lo que las sentencias se ejecutan al menos una
} while (expresión); vez.
No afectan a la compilación por lo que pueden ser tan extensos como el programador quiera.
Se pueden colocar en cualquier parte del programa y con dos formatos:
Componentes
proteus ISIS:
PIC16F876, RES,
LED-BLUE y SW-
SPST-MOM.
Ejemplo de programa
#include <16F876.h>
#fuses XT,NOWDT
#use delay( clock = 4000000 ) // Reloj de 4 MHz
#BYTE TRISB = 0x86 // TRISB en 86h.
#BYTE PORTB = 0x06 // PORTB en 06h
#BYTE OPTION_REG = 0x81 // OPTION_REG en 81h.
void main()
{
bit_clear(OPTION_REG,7); // Habilitación Pull-up
bit_set(TRISB,0); // B0 como entrada
bit_clear(TRISB,1); // B1 como salida
bit_clear(PORTB,1); // Apaga el LED
while (1)
{
if (bit_test(portb,0) == 1 ) // Si RB0 es 1, apaga el LED
bit_clear(portb,1);
else
bit_set(portb,1); // Si RB0 = 0, enciende el LED
}
}
Display
Display ¿COMO LO CONECTAMOS AL PIC?
Para poder trabajar directamente con el PIC sin hacer uso de un 7447 o 7448 (conversor de BCD a 7
segmentos), para poder visualizar los números del 0 al 9 en un display cátodo común
LCD
El LCD(Liquid Crystal Dysplay) o pantalla de cristal líquido es un dispositivo empleado para la visualización de
contenidos, mediante carácteres, símbolos o pequeños dibujos dependiendo del modelo.
Por ejemplo un LCD de 16x2, esto quiere decir que dispone de 2 filas de 16 caracteres cada una.
Los píxeles de cada símbolo o carácter, varían en función de cada modelo.
¿Cómo se conecta?
Pines de alimentación:
Vss: Gnd
Vdd: +5 voltios
Vee: corresponde al pin de contraste,( se puede regular con un potenciómetro de 10K)
Pines de control:
RS: Corresponde al pin de selección de registro de control de datos (0) o registro de datos(1). Es decir el pin RS funciona
paralelamente a los pines del bus de datos. Cuando RS es 0 el dato presente en el bus pertenece a un registro de
control/instrucción. y cuando RS es 1 el dato presente en el bus de datos pertenece a un registro de datos o un carácter.
RW: Corresponde al pin de Escritura(0) o de Lectura(1). Permite escribir un dato en la pantalla o leer un dato desde la
pantalla.
E: Corresponde al pin Enable o de habilitación. Si E(0) esto quiere decir que el LCD no esta activado para recibir datos,
pero si E(1) se encuentra activo y se puede escribir o leer desde el LCD.
La librería viene configurada de esta manera Pero se puede configurar de otra manera, según el puerto deseado
void main()
{
lcd_init();
while(true)
{
lcd_gotoxy(1,1);
printf(lcd_putc," HOLA MUNDO ");
delay_ms(1000);
lcd_gotoxy(1,1);
printf(lcd_putc," BIENVENIDOS ");
delay_ms(1000);
lcd_gotoxy(1,1);
printf(lcd_putc,“L. de D. de S. logicos");
delay_ms(1000);
}
}
Practica LCD
Realizar programa en lenguaje c que realice la suma de dos números y muestre el resultado en un
panel LCD de 16x2. Los dos números son de 4 bits
En la primera fila del panel se escribirá la expresión “Suma de: “ y el valor de los sumandos
separados por el signo +. En la segunda fila se escribirá el valor de la suma.