LENGUAJE C PARA MICROCONTROLADORES



Documentos relacionados
MICROPROCESADORES II LENGUAJE C EN LOS MICROCONTROLADORES PIC

MICROCONTROLADORES II (FAMILIA PIC16F87X) LENGUAJE C PARA PICS

UNIVERSIDAD DE OVIEDO

Elementos de un programa en C

Dependiendo del dispositivo usado, se tienen hasta 5 puertos de entrada/salida disponibles: PORTA PORTB PORTC PORTD PORTE

Universidad Nacional de Ingeniería Arquitectura de Maquinas I

Lección 2 Introducción al lenguaje C

Práctica 3 Gestión de puertos de entrada

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

1. Presentación del lenguaje C Creado en 1972 por D. Ritchie Lenguaje de propósito general Portátil o transportable (generalmente) Inicialmente de niv

Introducción al lenguaje C

Palabras reservadas de C++ y C. Una palabra reservada no puede declararse como un identificador, esto haría un conflicto entre conectores y funciones.

Introducción a las sentencias de control

Programación estructurada (Introducción a lenguaje C)

Laboratorio de Arquitectura de Redes. Datos en lenguaje C

Lenguaje C Elementos de un Programa. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006

El lenguaje C. if (a>3) { printf("hola"); // bloque printf("%d",a); // de getch(); //código } Partes de un programa en C.

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina

Tipos de Datos en C. Palabras reservadas en C

TIPOS DE DATOS BASICOS EN LENGUAJE C

Los 7 elementos básicos de la programación de PIC en C

Tipos de datos y Operadores Básicos

TUTORIAL II parte A. Observemos el diagrama de pines del microcontrolador 16F877A:

Datos y tipos de datos

Lección 3 Sentencias de control

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Lenguajes de programación

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Tema 2. El lenguaje JAVA

Segundo Parcial Programación en Mikro C PIC16F877

Empieza con // y termina con la siguiente línea de código. Son ignorados por el programa y no ocupan espacio en memoria.

TEMA 5 LA MEMORIA DE DATOS MEMORIA RAM D.P.E. DESARROLLO DE PROYECTOS 1

Unidad II Fundamentos de C++ M.C. Juan Carlos Olivares Rojas

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Tema 3 Constantes, Variables y Tipos

Funciones Definición de función

LENGUAJE. Tema 2 Elementos de un programa

3. Tipos primitivos de dato

CAPITULO 2: VARIABLES Y CONSTANTES

Lenguaje de Programación: C++ Repaso de Material C++

Programación I Teoría I.

Estructuras de Datos Declaraciones Tipos de Datos

Una expresión es una combinación de uno o más operandos y operadores para obtener un resultado.

MICROCONTROLADORES. 1. El PIC 16F84A es un microcontrolador de: a) 16 bits b) 8 bits c) 4 bits d) 32 bits e) 64 bits

Tema 4. Control de flujo. Programación Programación - Tema 4: Control de Flujo

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Tema 3. Estructuras de control

Microprocesadores. Introducción al Lenguaje C - Parte III. Prof. Luis Araujo. Universidad de Los Andes

Sintaxis de los aspectos generales de un lenguaje de programación

Cuales son los tipos de instrucciones que se utilizan en la programación?

Tipos de variables. Lenguaje C. Departamento de Electrónica. Tipos de datos, variables y constantes. Fundación San Valero

Microprocesadores. Introducción al Lenguaje C - Parte IV. Prof. Luis Araujo. Universidad de Los Andes

Introducción a Java. Introducción a Java. Programación I

Estructura de datos y Programación

PIC MICRO ESTUDIO Reloj en tiempo real RTCU2 Clave: 719

Programación En Lenguaje C

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

JavaScript Básico. Elementos Básicos: Comentarios: Literales: Valores que puede tomar una variable o una constante.

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

MANUAL BÁSICO DEL LENGUAJE SQL

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

Expresión, Operador, Operando, Asignación, Prioridad

Tema 05: Elementos de un programa en C

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Tema 2 Anexo: Aspectos básicos

TEMA 02 TIPOS, OPERADORES Y EXPRESIONES

Lenguaje C, segundo bloque: Sentencias de control

UNIDAD 2 Descripción de un programa

Operadores aritméticos. / División operando enteros o reales si operandos son entero resultado es entero. Resto de caso resultado real

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

La siguiente función configura el puerto como entrada y realiza su lectura: input_x( )

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Aprendiendo a programar Microcontroladores PIC en Lenguaje C con CCS

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

Lenguaje C, tercer bloque: Funciones

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Una función es un miniprograma dentro de un programa. Las funciones contienen varias

Repaso Lenguaje C Área de Servicios Programación (Ing. Elect. y Prof. Tec.), Programación I (TUG y TUR) y Electrónica programable (TUE)

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Laboratorio de Arquitectura de Redes. Entrada y salida estándar

Operadores. Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++.

Estructura de un programa en Java. Tipos de datos básicos. class miprimerprograma{ // comentario, no es parte del programa

Laboratorio de Arquitectura de Redes. Sentencias de control en lenguaje C

Programación Estructurada

FUNDAMENTOS PARA LA CONSTRUCCIÓN DEL CÓDIGO A PARTIR DEL ALGORITMO

Manejo de Entrada-Salida. Arquitectura de Computadoras

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INFORMÁTICA GRADO EN INGENIERÍA INFORMÁTICA. ESTRUCTURA DE COMPUTADORES

ORGANIZACIÓN INTERNA + INTRODUCCIÓN AL ENSAMBLADOR

Programación Estructurada. Sesión 2:El lenguaje de programación C

1. Detalle de los Comandos:

Transcripción:

LENGUAJE C PARA MICROCONTROLADORES 1

Compilador CCS para PICs. Escribir funciones en C. Manejo de estructuras de control de flujo en C. Gestión de puertos del PIC con CCS. Laboratorio 1 (propuesta). ING. LEWIN LÓPEZ L. MICROPROCESADORES II 1

CCS PIC COMPILER Un compilador convierte un lenguaje de alto nivel a instrucciones en código máquina. Un cross-compiler es un compilador que funciona en un procesador (normalmente en PC) diferente al procesador objeto. Varios compiladores C tiene como procesador objetos los PICmicro tal es el caso de HiTECH, MicroChip y CCS. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 2

Los elementos básicos de un programa en C Directivas de preprocesado Indican al compilador cómo debe generar el código máquina. Programas Bloques de programa. Siempre debe incluirse una llamada main(). Sentencias Instrucciones que definen lo que hace el programa y la secuencia de ejecución del mismo. Comentarios Imprescindibles como documentación del código fuente. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 3

VARIABLES Una variable es un nombre asignado a una o varias posiciones de memoria RAM. En C es necesario declarar todas las variables antes de poder utilizarlas, indicando el nombre asignado y el tipo de datos que en ella se van a almacenar(opcionalmente también el valor inicial asignado). tipo nombre_variable[=valor]; p.e.: int i; LostiposdedatosaceptadosenCestándarsoncinco: char(carácter) int(entero) float(coma flotante en 32 bits) double(coma flotante en 64 bits) void(sin valor) Las variables pueden ser locales o globales. Las variables locales sólo pueden ser usadas en la función en que se declaran, mientras que las variables globales son compartidas por todas las funciones del programa (deben declararse fuera de cualquier función y antes de ser utilizadas). ING. LEWIN LÓPEZ L. MICROPROCESADORES II 4

VARIABLES El compilador de CCS acepta los siguiente tipos de variable: Especificación Significado Tamaño Rango char carácter 8 bits 0 a 255(sin signo) int entero 8 bits 0 a 255(sin signo) float coma flotante 32 bits 6 bits de precisión double float doble precisión no soportado No para PCM void sin valor nulo ninguno int1 enterode1bit 1bit 0a1 int8 enterode8bits 8bits 0a255(sinsigno) int16 entero de 16 bits 16 bits 0 a 65535(sin signo) int32 entero de 32 bits 32 bits 0 a(232-1) short enterode1bit 1bit 0a1 long entero de 16 bits 16 bits 0 a 65535(sin signo) Los tipos de variable short y long pueden tener detrás la palabra int sin efecto alguno. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 5

VARIABLES Todos los tipos de datos son por defecto sin signo (unsigned) salvo los de tipo float. Para almacenar datos con signo, hay que introducir el modificador signed delante del tipo. El efecto que se consigue es el resumido en la siguiente tabla. Especificación Significado Tamaño Rango signed char carácter con signo 8 bits -128 a 127 signed int16 entero con signo 16 bits -16384 a 16383 signed long coma flotante 16 bits -32768 a 32767 Los números enteros negativos se codifican en complemento a 2. Cuando se opera con distintos grupos de datos en una misma expresión, se aplican una serie de reglas para resolver las diferencias. En general se produce una promoción hacia los tipos de datos de mayor longitud presentes en la expresión. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 6

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. Las funciones son los bloques constructivos fundamentales en C. Todas las sentencias deben encontrarse dentro de funciones. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 7

Estructura de la función: Tipo_Dato Nombre_Funcion(tipo param1, param2, ) { instrucciones; } Las funcionespueden devolver un valor a la sentencia que las llama. El tipo de dato devuelto se indica mediante tipo_dato(char, int16, long). Si no se indica nada, se entiende que devuelve un entero. Si no devuelve nada, debe incluirse una especificación tipo void. Ejemplo: float trunca (float a) { float b; b = floor(a); a = a b; a = a * 100; a = floor(a); a = a * 0.01; a = b + a; return (a); } ING. LEWIN LÓPEZ L. MICROPROCESADORES II 8

La manera que tiene una función para devolver un valor es mediante la sentencia return. return(expresión); return expresión; La expresión debe proporcionar el mismo tipo de dato que el especificado en la función. Si no debe devolver nada, se finaliza con return; Cuando una función se encuentra con una sentencia return se vuelve a la rutina de llamada inmediatamente y las sentencias posteriores a return no se ejecutan. Además de con las sentencia return, las funciones terminan su ejecución y vuelven al lugar desde donde se les llamó cuando alcanzan la llave de cierre de función } tras ejecutar la última sentencia de la misma. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 9

Además de devolver valores, una función también puede recibir parámetros (denominados argumentos) según se indicó en su definición. int suma (int a, int b) { return(a+b); } main() { intc; c = suma (10, 23); } Parámetros formales Argumentos de llamada Losargumentossepuedenpasaralasfuncionesporvaloroporreferencia. La llamada por valor copia el argumento de llamada en el parámetro formal de la función (No modifica su valor en la función de partida). La llamada por referencia usa la dirección de la variable que se pasa a la función (se consigue usando punteros o arrays). ING. LEWIN LÓPEZ L. MICROPROCESADORES II 10

El lenguaje C define numerosos operadores mediante los cuales se construyen las expresiones(combinación de operadores y operandos). De asignación Aritméticos - ING. LEWIN LÓPEZ L. MICROPROCESADORES II 11

Relacionales Lógicos Debits - ING. LEWIN LÓPEZ L. MICROPROCESADORES II 12

In/decremento Desplazamiento bit Dirección/indirección En lenguaje C profesional es muy frecuente usar abreviaturas. Así,porejemplo,esmáshabitualvera+=b;quea=a+b; ING. LEWIN LÓPEZ L. MICROPROCESADORES II 13

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 ING. LEWIN LÓPEZ L. MICROPROCESADORES II 14

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 ING. LEWIN LÓPEZ L. MICROPROCESADORES II 15

Sentencia if Se ejecuta una sentencia o bloque de código si la expresión que acompaña al if tiene un valor distinto a cero (verdadero). Si es cero (falso) continúa sin ejecutar la sentencia o bloque de sentencias. if(expresión) sentencia; if(expresión) { sentencia 1; sentencia 2;... } Sentencia if-else Se evalúa una expresión y, si es cierta, se ejecuta el primer bloque de código (o sentencia 1). Si es falsa, se ejecuta el segundo. if(expresión) sentencia 1; (expresión)? (sentencia 1) : (sentencia 2); else sentencia 2; ING. LEWIN LÓPEZ L. MICROPROCESADORES II 16

Sentencia ifif/else If (P1!=0) C=20; else C=0; If (A>B) { If (A>D) } else If (A>B) { If (A>D) } else C=0; C = 15; C=0; C = 15; ING. LEWIN LÓPEZ L. MICROPROCESADORES II 17

Sentencia switch Substituye a if-else cuando se realiza una selección múltiple que compara una expresión con una lista de constantes enteras o caracteres. Cuando se da una coincidencia, el cuerpo de sentencias asociadas a esa constante se ejecuta hasta que aparezca break. switch (expresión) { case constante 1: grupo 1 de sentencias; break; case constante 2: grupo 2 de sentencias; break;... default: grupo n de sentencias; } break es opcional. Si no aparece se sigue con el case siguiente. No puede haber constantes iguales en dos case de la misma sentencia switch. default es opcional y el bloque asociado se ejecuta sólo si no hay ninguna coincidencia con las constantes especificadas. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 18

Sentencia switch Switch (k) { case 0: } case 2: case 3: default: x=1; break; c=6; b=15; break; x=12; break; break; ING. LEWIN LÓPEZ L. MICROPROCESADORES II 19

Sentencia de bucle for Se emplea para repetir una sentencia o bloque de sentencias. for (inicialización ; condición ; incremento) { sentencia(s); } En la inicialización se le asigna un valor inicial a una variable que se emplea para el control de la repetición del bucle. La condición se evalúa antes de ejecutar la sentencia. Si es cierta, se ejecuta el bucle. Si no, se sale del mismo. El incremento establece cómo cambia la variable de control cada vez que se repite el bucle. Es posible anidar bucles for para modificar dos o más variables de control. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 20

Sentencia de bucle for For (i=1; i<=100; i++) { delay_ms(33); px=?px; } For (y=1; i<=99; y=y+3) { delay_ms(33); px=y; } ING. LEWIN LÓPEZ L. MICROPROCESADORES II 21

Sentencia de bucle while La repetición se lleva a cabo mientras sea cierta una expresión. while (expresión) { sentencia(s); } La expresión se evalúa antes de cualquier iteración. Si es falsa, ya no se ejecuta la sentencia o bloque de sentencias. Sentencia de bucle do-while. do { sentencia(s); } while (expresión) Las sentencias se ejecutan antes de que se evalúe la expresión, por lo que el bucle se ejecuta siempre al menos una vez. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 22

Sentencia de bucle while while (x>0 && y++<5) { a=1; b=45; x=p1; } do { a=1; b=45; x=p1; } while (x>0 && y++>5); ING. LEWIN LÓPEZ L. MICROPROCESADORES II 23

Las principales diferencias entre compiladores residen en las directivas (pre-processor commands) y en las funciones integradas (built-in functions). En el manual de CCS se encuentran las listas con las directivas y las funciones integradas correspondientes al compilador de CCS. Directivas de preprocesado más habituales: #ASM #ENDASM #BIT id=x.y #BYTE id=x Las líneas entre estas dos directivas deben ser instrucciones ensamblador que se insertan tal y como aparecen. Se crea una variable tipo bit correspondiente al bit y del byte x en memoria. Se crea una variable y se sitúa en el byte x en memoria. Si ya existía esa variable, se coloca físicamente en la posición especificada. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 24

#DEFINE id texto #DEVICE chip #FUSES options #INCLUDE <fichero> #INCLUDE fichero #INLINE #SEPARATE #ORG start El identificador se sustituye por el texto adjunto. Define el micro para el que se escribe el código. Define la palabra de configuración para la grabación del microcontrolador. Se incluye el texto del fichero especificado en el directorio o fuera de él. La función que sigue a esta directiva se copia en memoria de programa cada vez que se le llame. Puede servir para mejorar la velocidad. La función que sigue a esta directiva se implementa de manera separada (no INLINE). De esta manera se ahorra ROM Sitúa el código a partir de una determinada posición de la memoria de programa ING. LEWIN LÓPEZ L. MICROPROCESADORES II 25

#INT_xxxx #INT_GLOBAL #PRIORITY ints Indica que la función que sigue es un programa de tratamiento de la interrupción xxxx. Indica que la función que sigue es un programa genérico de tratamiento de interrupción. No se incluye código de salvaguarda de registros ni de recuperación como cuando se usa #INT_xxxx. Establece un orden de prioridad en las interrupciones. #USE DELAY (clock = frecuencia en Hz) Define la frecuencia del oscilador que se va a utilizar, que se emplea para realizar los cálculos para funciones integradas de retardo. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 26

pre-processor commands ING. LEWIN LÓPEZ L. MICROPROCESADORES II 27

built-in functions ING. LEWIN LÓPEZ L. MICROPROCESADORES II 28

built-in functions ING. LEWIN LÓPEZ L. MICROPROCESADORES II 29

Existen dos opciones para configurar y manejar los puertos E/S: Definiendo los registros como variables localizadas en RAM. Se definen los puertos y los registros de dirección como variables de C y se colocan en las posiciones reales de estos registros en la memoria RAM de datos. Constituye la manera más directa de trabajar con los puertos E/S. Usando las funciones integradas específicas del compilador. Se definen la dirección de datos si es necesario y se gestionan las entradas y las salidas mediante funciones relativas al manejo de todo el puerto o de bits particulares del mismo. Cuando se usan las funciones integradas del compilador de CCS, el código que introduce el compilador puede variar en cuanto a tamaño y tiempo de ejecución. Dependerá de la activación de ciertas directivas de preprocesado: #USE FAST_IO - #USE FIXED_IO - #USE STANDARD_IO ING. LEWIN LÓPEZ L. MICROPROCESADORES II 30

OPCIÓN 1. Definiendo los registros en la RAM. Se definen los registros PORTx y TRISx como bytes y se sitúan en la posición correspondiente de la memoria RAM. La directiva C utilizada es #BYTE: #BYTE variable=constante; #BYTE TRISA = 0x85 //Variable TRISA en 85h. #BYTE PORTA = 0x05 //Variable PORTA en 05h. #BYTE TRISB = 0x86 //Variable TRISB en 86h. #BYTE PORTB = 0x06 //Variable PORTB en 06h. Una vez definidas estas variables se pueden configurar y controlar los puertos mediante comandos de asignación. A partir de este punto, estas variables permiten controlar los puertos y se pueden utilizar en sentencias de asignación. TRISA = 0xFF; // 8 terminales de entrada TRISB = 0x00; // 8 terminales de salida TRISC = 0x0F; // 4 pin de mayor peso OUT,4 pin de menor peso IN ING. LEWIN LÓPEZ L. MICROPROCESADORES II 31

OPCIÓN 1. Definiendo los registros en la RAM. Escritura en los puertos: PORTC = 0x0A; // salida del datos 00001010 por el puerto C Lectura de puertos: valor = PORTA; // Asigna el dato del puerto A a la variable valor. 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. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 32

OPCIÓN 1. Definiendo los registros en la RAM. El compilador de CCS incorpora una serie de funciones integradas que permite manejar los bits de una variable previamente definida. bit_clear (var,bit); //Pone a 0 el bit específico (0 a 7) de la variable. bit_set (var, bit); //Pone a 1 el bit específico (0 a 7) de la variable. bit_test (var, bit); //Muestra el bit específico (0 a 7) de la variable. swap (var); //Intercambia los 4 bits de mayor peso por los 4 //de menor peso de la variable. bit_set (PORTC, 4); // saca un 1 por el terminal RC4 if (bit_test(portb,0)==1) bit_clear(portb,1); //si RB0 es 1 borra RB1 También se puede declarar un bit de un registro con una variable mediante la directiva #BIT y trabajar directamente con la variable. #BIT nombre = posición.bit #BIT RA4 = 0x05.4... RA4 = 0; ING. LEWIN LÓPEZ L. MICROPROCESADORES II 33

OPCIÓN 1. EJEMPLO RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD 21 22 23 24 25 26 27 28 D1 LED-BLUE SW1 SW-SPST-MOM RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT 11 12 13 14 15 16 17 18 R1 180 ING. LEWIN LÓPEZ L. MICROPROCESADORES II 34

OPCIÓN 2. Usando funciones integradas del compilador. El compilador de CCS incorpora una serie de funciones integradas orientadas a trabajar con los puertos E/S. output_x (valor); //Por el puerto correspondiente se saca // el valor (0-255). input_x(); //Se obtiene el valor en el puerto correspondiente. set_tris_x(valor); //Carga el registro TRISx con el valor (0-255). port_b_pullups (valor); //Mediante valor=true o valor=false habilita o //deshabilita las resistencias de pull-up en PORTB. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 35

OPCIÓN 2. Usando funciones integradas del compilador. Hay una serie de funciones asociadas a un terminal o pin*. El parámetro pin* se define en un fichero include (por ejemplo, 16F877.h) con un formato del tipo PIN_Xn, donde X es el puerto y n es el número de pin. #define PIN_A0 40 #define PIN_A1 41 output_low (pin*); //Pin a 0. output_high (pin*); //Pin a 1. output_bit (pin*, valor); //Pin al valor especificado. output_toggle(pin*); //Complementa el valor del pin. output_float (pin*); //Pin de entrada, quedando a tensión flotante input_state(pin*); //lee el valor del pin sin cambiar su sentido input(pin*); // lee el valor del pin. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 36

OPCIÓN 2. Usando funciones integradas del compilador. La generación de código para las funciones output_x() e input_x( ) depende de la última directiva del tipo #USE *_IO que esté activa. #USE FAST_IO (PUERTO) [PUERTO: A ] Cada vez que se emplea una función output...() se saca el valor directamente al puerto, y cada vez que se emplea una función input...() se lee el puerto, pero no se modifican previamente el registro TRIS correspondiente. El usuario debe asegurarse de que los registros TRIS están cargados adecuadamente antes de llamar a las funciones. Ej. #USE FAST_IO (B) #USE STANDARD_IO (PUERTO) [PUERTO: A ] Cada vez que se emplea una función output...() se inserta código previo para forzar a que el bit particular o el puerto completo sean de salida (mediante la carga del TRIS correspondiente). Si se trata de una función input...() se carga código para definir bit o puerto completo como de entrada. Ésta es la opción activa por defecto. Ej. #USE STANDARD_IO (C) ING. LEWIN LÓPEZ L. MICROPROCESADORES II 37

OPCIÓN 2. Usando funciones integradas del compilador. #USE FIXED_IO (PUERTO_OUTPUTS=pin*,...) [PUERTO: A ] Se genera código relativo a la dirección de los datos de manera previa cada vez que aparece una función integrada del tipo input ( ) ó output ( ), pero los pines se configuran de acuerdo con la información que acompaña a la directiva (sólo se indican los pines de salida) y no dependiendo de que la operación sea de entrada o de salida como sucede con #USE STANDARD_IO(PUERTO). Ej. USE FIXED_IO (B_OUTPUTS = PIN_B2, PIN_B3) El efecto de colocar una u otra directiva se puede observar en los ficheros *.lst que se generan como resultado de la compilación. En general se puede decir que resulta más cómodo gestionar los pines de E/S de modo STANDARD, pero haciéndolo de modo FAST se adquiere más control de lo que se le está mandando al PIC y se optimiza código. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 38

OPCION 2 EJEMPLO 2 ING. LEWIN LÓPEZ L. MICROPROCESADORES II 39

Usando Punteros La memoria se puede acceder en C usando punteros. Los punteros deben ser del tipo INT. #define portb (int *) 0x06 portb es un puntero INT cuyo valor es la dirección del bus del dispositivo. El puerto es accesible mediante el uso del operador *. int p p = *portb En este ejemplo el valor del dato en el puerto direccionado en la posición de memoria 0x06 (puerto B) es asignado a la variable p. Antes de que el puerto sea leido es necesario establecer si es de entrada o salida. #define trisb (int *) 0x86 *trisb = 0xFF ING. LEWIN LÓPEZ L. MICROPROCESADORES II 40

Usando Punteros Los pines pueden escritos o leídos mediante operadores lógicos. *portb = 0b00000100; //pone el pin 2 del portb a 1 *portb &= 0b11111011; //pone el pin 2 del portb a 0. Para leer el valor del pin 7 del portb: If (*portb & 0b10000000) {.. ING. LEWIN LÓPEZ L. MICROPROCESADORES II 41