LENGUAJE C EN LOS MICROCONTROLADORES PIC - MICROPROCESADORES II
←
→
Transcripción del contenido de la página
Si su navegador no muestra la página correctamente, lea el contenido de la página a continuación
Tipos de datos en CCS TIPO TAMAÑO RANGO DESCRIPCION int1 1 bit 0a1 Binario short int 8 bits 0 a 255 Entero int8 int16 16 bits 0 a 65535 Entero de 16 bits long int32 32 bits 0 a 4294967295 Entero de 32 bits float 32 bits +/-1,175*10e-38 a +/-3,402*10e38 Coma flotante o real char 8 bits 0 a 255 Carácter void sin valor signed int8 8 bits -128 a 127 Entero con signo singed int16 16 bits -32768 a 32767 Entero Largo con signo signed int32 32 bits -2e31 a 2e31 - 1 Entero 32 bits con signo 1
Tipos de datos en CCS Las constantes se pueden especificar en decimal, octal, hexadecimal o binario Ejemplo Tipo 123 Decimal 0123 Octal 0x123 Hexadecimal 0b010010 Binario x' carácter ' \010 ' carácter octal ' \xA5 ' carácter hexadecimal También se definen caracteres especiales, algunos como: \n cambio de linea \r retorno de carro \t tabulacion \b backspace 2
Variables Las variables pueden ser GLOBALES o LOCALES. Son globales cuando se pueden usar en cualquier parte del programa, mientras que las locales solo se usan dentro de la función en la cual están declaradas. Las variables globales se declaran antes de cualquier función y se inician en 0 al inicio del main(). #include #USE delay (clock = 4000000) int16 counter; // variable global void FUNCION (void) { char K, kant = ‘0’; //variables locales } void main( ) { int8 temp; //variable local } 3
Operadores OPERADORES ARITMETICOS OPERADORES DE ASIGNACIÓN Operador Significado Operador Ejemplo Descripción + Suma += a += b suma a con b y almacena el resultado en a - Resta -= a -= b resta b de a y almacena el resultado en a *= a *= b multiplica a con b y almacena el resultado en a * Multiplicación /= a /= b divide a entre b y almacena el resultado en a / División %= a %= b divide a entre b y el residuo se almacena en a % Residuo desplaza a a la izquierda la cantidad de bit -- Decremento = b indicada en b Hace una AND bit a bit entre a y b almacenando &= a &= b el resultado en a Hace una OR bit a bit entre a y b almacenando el |= a |= b resultado en a Hace una XOR bit a bit entre a y b almacenando ^= a ^= b el resultado en a 4
Operadores condicionales Un operador condicional se usa para comparar 2 o más valores y obtener como resultado un valor lógico (verdadero o falso). OPERADORES RELACIONALES OPERADORES LÓGICOS Operador Significado Operador Significado < Suma ! NOT > Resta && AND >= Multiplicación || OR 10) && (valor
Funciones Una función es un conjunto de instrucciones que se realiza cuando se requiere un proceso específico dentro de la secuencia normal del programa en C. La funciones deben llevar un nombre, un valor de retorno (entero, booleano, real, o en caso de no retornar usar void), y una lista de parámetros (valores de entrada para realizar cálculos con ellos). Una función se declara antes de usarse y generalmente la lista de funciones se indica antes del main. Estructura de la función: Ejemplo: float trunca (float a) { Tipo_Dato Nombre_Funcion(tipo param1, param2,…) float b; { b = floor(a); instrucciones; a = a – b; a = a * 100; } a = floor(a); a = a * 0.01; a = b + a; Para devolver un valor se usa return return (a); } 6
Funciones Se debe recordar que una función retorna el mismo tipo de dato que se ha declarado en el nombre de la función. En el caso de no devolver nada se finaliza con return. También se puede finalizar la función sin return, usando solo la llave de cierre “}”. Ejercicios: 1. Escriba una función en C que reciba un valor entero cualquiera y retorne un 0 si el número es par y un -1 si el número es impar. 2. Escriba una función en C que tome dos valores enteros de entrada a y b y los ordene de menor a mayor. Utilice la función printf () (Ver archivo ccs_c_manual.pdf) para mostrarlos ordenados. La función no tiene valores de retorno. 3. Escriba una función en C que cuando sea llamada muestre con printf() el mensaje “bienvenido” y luego genere un tiempo de espera de 500 milisegundos (usar la función delay_ms). 7
Declaraciones de Control CCS es un lenguaje para microcontroladores que se basa en el Lenguaje C tradicional, por lo tanto son válidas las siguientes estructuras que permiten controlar el flujo del programa: • If-Else • While • Do-While • For • Switch-Case • Return • Break, Continue y Goto Igualmente en CCS se pueden realizar los comentarios que sean necesarios para aclarar algunas partes del programa. Para comentario de línea se usa doble slash “//”, lo que se escriba en ese renglón será considerado comentario a partir de estos caracteres. Y para comentario de bloque se inicia el comentario con slash asterisco “/*” y se escriben los comentarios en distintos renglones si se quiere hasta encontrar el final de comentario de bloque con asterisco slash “*/”. 8
Directivas de preprocesado Estas son las instrucciones que van al inicio de todo programa y comienzan con el simbolo #. EJ: • #DEVICE chip, para definir el PIC que se va a compilar. #DEVICE PIC16F84 • #FUSES options, para definir la palabra de configuración al programar el PIC #FUSES XT, NOWDT, PUT, NOPROTECT El significado de las opciones puede verse por el menu View– Valid Fuses. • #INCLUDE “filename”, permite incluir un fichero en el programa #INCLUDE • #USE DELAY (CLOCK = SPEED), sirve para definir la frecuencia del oscilador del PIC y también ayuda al compilador para los cálculos de tiempo en funciones de retardo temporal. #USE DELAY (CLOCK = 4000000) 9
Gestión de los Puertos De acuerdo a la familia del PIC se tienen microcontroladores de 2 a 5 Puertos nombrados alfabéticamente de la A a la E. Cada puerto puede tener hasta 8 terminales como máximo. Entrada/salida Configuración PORTA TRISA PORTB TRISB PORTC TRISC PORTD TRISD PORTE TRISE SALIDA DE DATOS : 0 ENTRADA DE DATOS: 1 La asignación es individual correspondiente a cada terminal del puerto. 10
Gestión de los Puertos En lenguaje C se pueden gestionar los puertos de 2 formas: 1. Declarando los registros TRISX y PORTX definiendo su posición en la memoria RAM. • La directiva usada para definir la posición es #BYTE Ej: #BYTE TRISA = 0x85 #BYTE PORTA = 0x05 • Una vez definidas se pueden usar para configurar puertos y escribir o leer el estado de estos. Ej: TRISA = 0xF0; //Puerto A: 4 MSB salida y 4 LSB entrada . PORTA=0x0A; //Escribe dato 00001010 en el puerto A. valor = PORTA; //Lee el puerto A y almacena en la variable valor • Se pueden usar expresiones condicionales Ej: if(PORTD & 0x0F) PORTD |= 0x0A; /* Con esto se comprueban los 4 terminales de menor peso del puerto D y si son 1111 saca por los 4 terminales de mayor peso el dato 1010. */ • Hay funciones que permiten trabajar bit a bit con los registros o variables definidas previamente. Algunas son: bit_clear(var, bit), bit_set(var, bit), bit_test(var, bit) y swap(var). 11
Gestión de los Puertos 2. Usando las directivas específicas del compilador (#USE FAST_IO, #USE FIXED_IO, #USE STANDARD_IO). • En estos casos es posible usar funciones más completas que permiten manipular el puerto completo o un bit de estos. • Algunas funciones que se usan para manipulación de puertos son: output_X(), input_X(), set_tris_X(valor), port_b_pullups(valor), get_trisX(). • Algunas para manipulación de bits son: output_low(pin*), output_high(pin*), output_bit(pin*, valor), output_toggle(pin*), output_float(pin*), input_state(pin*), input(pin*). NOTA: pin* tiene la forma PIN_Xn donde X es el puerto y n es el número del pin de ese puerto, así entonces, PIN_B3 se refiere al pin 3 del puertoB. • Al usar la directiva FAST_IO es necesario asegurarse que los registros TRIS estén correctamente definidos. Revisar los ejemplos pic_ccs001 a pic_ccs003 y el archivo Ejemplo 1 realizado en Proteus!! 12
Multiplexación de display 7 Segmentos • Es posible controlar el encendido de más de un display de 7 segmentos con una cantidad reducida de pines si se utiliza la técnica de multiplexación temporal. • Para lograr esta característica es necesario aprovechar el terminal común de estos displays para que solamente un display se encuentre encendido en un instante de tiempo determinado y así al hacer activaciones secuenciales muy rápidas de cada display, el efecto de apagado y encendido no puede ser notado por el ojo humano y dar la impresión que TODOS están encendidos a la vez cuando en realidad no es así. • Para este fin es posible utilizar pines de un puerto que controlen la salida hacia cada segmento de todos los displays y otro puerto que controle las señales comunes (ánodo ó cátodo según el display). Un retardo de 50 milisegundos es suficiente para evitar parpadeos en la visualización (puede variar alrededor de este valor en la práctica). Revisar el ejemplo pic_ccs004 y el archivo ejemplo 2 en Proteus! 13
También puede leer