1 - Puertos de Entradas Salidas

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 5

PUERTOS DE E/S

Puertos de E/S

Características generales en el PIC16F877


Presenta cinco puertos E/S configurables.
* PORTA 6 pines (0X05)
* PORTB 8 pines (0X06 y 0x106)
* PORTC 8 pines (0X07)
* PORTD 8 pines (0X08)
* PORTE 3 pines (0X09)

TOTAL 33 pines de E/S

Dirección de los datos configurables.

Registros de dirección de datos.


* TRISA (0x85)
* TRISB (0x86)
* TRISC (0x87)
* TRISD (0x88)
* TRISE (0x89)

Puertos de E/S

Gestión de los puertos E/S


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.

* 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.

La primera de las dos opciones indicadas constituye la manera más


directa de trabajar con los puertos E/S.

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)

1
Puertos de E/S

Opción 1. Definiendo los registros en la RAM


Definir los registros PORTx y TRISx como bytes y situarlos en las
posiciones que les correspondan en el mapa de memoria del PIC.
Para ello resulta muy adecuada la directiva #BYTE.

#BYTE TRISB = 0x86 // Define la variable TRISB y la sitúa en 86h.


#BYTE PORTB = 0x06 // Define la variable PORTB y la sitúa en 06h.

A partir de este punto, estas variables permiten controlar los


puertos y se pueden utilizar en sentencias de asignación.

TRISB = 0xF0; // 4 bits altos entradas y 4 bajos, salidas.


......
PORTB = 0x0A; // Asignación a los 4 bits de salida.
numero = PORTB; // Lectura del puerto B.
......
if (PORTB & 0xF0) PORTB|= 0x0F;

Puertos de E/S

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 especificado de la variable.
bit_set (var , bit); Pone a 1 el bit especificado de la variable.
bit_test (var , bit); Muestra el bit especificado de la variable.
swap (var); Intercambia los nibbles de la variable.

#BYTE PORTB = 0x06 // Declaración previa de PORTB.


......
bit_set (PORTB , 5);
......
if (! bit_test (PORTB , 2)) bit_set (PORTB , 2);

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;

2
Puertos de E/S

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_low (pin*); Pone a 0 el pin especificado.
output_high (pin*); Pone a 1 el pin especificado.
output_bit (pin* , valor); Pone el pin especificado al valor indicado.
output_float (pin*); Define el pin como entrada, quedando a
tensión flotante (simula salida en
drenador abierto)

output_a (valor); Saca el valor indicado (0-255) en el


output_b (valor); puerto correspondiente.
output_c (valor);
output_d (valor);
output_e (valor);

port_b_ pullups (valor); Activa (valor=TRUE) o no (valor=FALSE)


las resistencias de pull-up asociadas a los
pines definidos como entrada en PORTB.

Puertos de E/S

set_tris_a (valor); Carga el registro de dirección de datos


set_tris_b (valor); con el valor indicado.
set_tris_c (valor);
set_tris_d (valor);
set_tris_e (valor);

input (pin*); Devuelve el estado del pin señalado.

input_a ( ); Devuelve el valor presente en el puerto


input_b ( ); correspondiente.
input_c ( );
input_d ( );
input_e ( );

Los parámetros de tipo pin* se corresponden con identificadores


definidos en el 16F877.h cuyo formato es PIN_Xn (X es el puerto y n
es el número de pin).
Ejemplo en 16F877.h #define PIN_A0 40
#define PIN_A1 41
#define PIN_A2 42
#define PIN_A3 43

3
Puertos de E/S

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 , B , C , D , E


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 ... E


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)

Puertos de E/S

#USE FIXED_IO (PUERTO_OUTPUTS=pin* , ...) PUERTO: A ... E


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.

También podría gustarte