You are on page 1of 42

Universidad del Cauca

Arquitectura de Computadores
Ingeniera de Sistemas
Manejo de puertos
Mag. Wilmar Yesid Campo
Diciembre de 2013

Introduccin
En casi todos los proyectos es necesario leer
alguna entrada de tipo digital conectada a
pulsadores, interruptores, sensores digitales o
similares; tambin es necesario escribir datos
por medio de una salida de tipo digital
conectada a LED, pantallas LCD, display de
siete segmentos o similares

Gestin de los puertos


Los microcontroladores tiene terminales de
entrada/salida divididos en puertos, que se
encuentran nombrados alfabticamente A, B, C, D
etc. Cada puerto puede tener hasta 8 terminales,
que de forma bsica se comportan como una
entrada/salida digital.
Segn las caractersticas del PIC, cada puerto
puede tener, adems, asignado un bloque
funcional: convertidor AD.

Gestin de los puertos


Considerando
los
puertos
como
entradas/salidas digitales, los puertos se
caracterizan por ser independientes, es decir,
se puede programar cada terminal del puerto
para que se comporte como una entrada o
una salida digital

Gestin de los puertos


La habilitacin como entrada o salida se realiza a
travs del registro TRISX.
(TRISA: 85h, TRISB: 86h, TRISC: 87h, TRISD:88h o
TRISE:89h en el banco 1 de la memoria RAM).
Un valor 0 en estos registros indica que el
terminal correspondiente del puerto es de salida,
mientras que el valor 1 indica que ser de
entrada.

Gestin de los puertos


La gestin del bus de datos se realiza a travs
de los registros PORTx
PORTA:
05h,
PORTB:06h,
PORTC:07h,
PORTD:08h o PORTE:09h en el banco 0 de la
memoria RAM

Gestin de los puertos en C


Dos formas:
1. Se declaran los registros TRISX y PORTX
definiendo sus posicin en la memoria RAM
como variables de C
2. Utilizando las directivas especificas del
compilador (#USE FAST_IO, #USE FIXED_IO,
#USE STANDARD_IO)

1. A travs de la RAM
Se definen los registros PORTx y TRISx como
bytes y se sitan en la posicin
correspondiente de la memoria RAM. La
directiva utilizada de C es #BYTE:

1. A travs de la RAM
Una vez definidas estas variables se pueden configurar y
controlar los puertos a travs de los comandos de asignacin.
TRISA=0xFF;
//8 terminales de entrada
TRISB = 0x00;
TRISC = 0x0F
Escritura en puertos
PORTC =0x0A;

//salida de datos ..por el puerto C

Lectura de puertos:
Valor= PORTA; //asigna el dato del puerto A a la variable valor

tarea1
Configurar los pines PORTB<0,2,4,6> como salida el resto
como entrada.
Configurar los pines PORTB<1,3,5,7> como salida el resto
como entrada.
Solucin:
1. TRISB=0xAA=(10101010) 'Configuramos los pines
PORTB<0,2,4,6> como salida el resto como entrada.
2. TRISB=0x55 = (01010101) 'Configuramos los pines
PORTB<1,3,5,7> como salida el resto como entrada.

1. A travs de la RAM
Manejo de sentencias
TRISD=0x0F;
If (PORTD & 0x0F) PORTD |= 0XA0;

Funciones para Trabajar bit a bit con C


bit_clear(var,bit); //pone a 0 el bit especifico
(0-7) de la variable.
bit_set(var,bit); // pone a 1 el bit especifico (07) de la variable.
bit_test(var,bit); //muestra el bit especifico
(0-7) de la variable.
swap(var); //intercambia los 4 bits de mayor
peso por los 4 de menor peso
de la variable.

Ejemplos
Bit_set (PORTC, 4)
If (bit_test(PORTB,0)==1) bit_clear(PORTB,1)

Trabajar bit a bit con C


Se puede declarar un bit de un registro con
una variable mediante la directiva #BIT
#BIT Nombre=posicin.bit
#BIT RB4 = 0x06.4
#BIT RB4 = 0x06.4 //PORTB=0x06
RB4 = 0;

Explicacin adicional
El PORTB es un puerto bidireccional de 8 bits de ancho. El registro de la
direccin de los datos es TRISB. Activar el bit TRISB (=1) har que el pin
correspondiente de PORTB sea una entrada (es decir, pone el conductor
correspondiente de la salida en un modo alta impedancia). Borrar un bit
de TRISB (=0) hace que el pin correspondiente de PORTB sea una salida (es
decir, pone el contenido del latch de salida en el pin seleccionado).
El registro del latch de datos (LATB) slo es memoria mapeada. Las
operaciones de lectura-modificacin-escritura en el registro LATB lee y
escribe el valor del latch de salida del PORTB. Cada uno de los pines de
PORTB tiene un pull-up interno. Un solo bit de control puede cambiar todo
el pull-up. Esto se realiza borrando el bit, RBPU* (INTCON2<7>). El pull-up
cambia automticamente cuando el pin se configura como salida. Se
inhabilita el pull-up en un reinicio.
http://es.scribd.com/doc/38769517/109/REGISTROS-PORTB-TRISB-y-LATB

ejemplos
Ver ejemplo 1
Configurar los terminales RB1 como salida y RB0 como entrada (con
resistencias pull-up). La salida debe tener el mismo valor que la entrada.
Se utiliza un interruptor en la entrada y un led en la salida. Componentes
(PIC16F877A), RES, LED-BLUE y SW-SPST-MOM
Para las pull ups:
http://www.cursomicros.com/pic/arquitectura/resistencias-de-pullup.html

2. A travs de las directivas


El compilador ofrece funciones predefinidas para
trabajar con los puertos. Estas funciones son:
- output_x(valor);

//por el puerto correspondiente saca el


valor (0-255).

- input_x(valor);

//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 FALSE habilita o


deshabilita las resistencias de pull-up en PORTB

get_trisX();

//devuelve el valor del registro TRISx

ejemplos
Output_A(0xFF); //saca por el puerto A el
valor 11111
Valor=input_B(); //lee el valor del puerto B
Set_tris_C(0x0F); //configura el puerto C: C0C3 entradas, C4-C7 salidas

Uso de PIN
Existe una serie de funciones asociadas a un
terminal o pin*. El parmetro pin* se define
en un fichero include (por ejemplo, 16F876.h)
con un formato del tipo PIN_Xn, donde X es el
puerto y n es el numero de pin.
#define PIN_A0 40
#define PIN_A1 41

Uso de PIN
Las funciones son:

Uso de PIN
Las funciones output_x() e input_x()
dependen de la directiva tipo #USE *_IO que
est activa.
#USE FAST_IO (puerto) [PUERTO:A]
Con la funcin output_x() se saca el valor al
puerto y con la funcin input_x() se lee el
puerto. La directiva no modifica previamente
el registro TRIS correspondiente

Ejercicio 2

Realizar nuevamente el ejemplo 1 mediante el uso de directivas:

#include <16F877A.h>
#fuses XT, NOWDT
#use delay (clock = 4000000)
#use fast_io(B) /*se dice que si utilizamos esta directiva de fast_io es necesario
entrar a configurar el TRIS (aqu se hace mediante la instruccin
set-tris_B). Hay que configurar manualmente el TRISB*/
Void main () {
Port_b_pullups (TRUE);
Set_tris_B(0x01);
Output_low(PIN_B1);

While (1)
{
If (input (PIN_B0) == 1 )
Output_low(PIN_B1);
else
Output_high(PIN_B1);

}
}

Directiva USE STANDARD


#USE STANDARD_IO (PUERTO)[Puerto:A]
Con la funcin output_x() el compilador se
asegura de que el terminal, o terminales
correspondientes, sean de salida mediante la
modificacin del TRIS correspondiente. Con la
funcin input_x() ocurre lo mismo pero
asegurando los terminales como entrada. Es la
directiva por defecto.

Ejercicio 3
Realizar el mismo ejercicio usando la anterior
directiva

#USE FIXED_IO (PUERTO_OUTPUTS=pin* , ) [PUERTO: A ]

El compilador se encarga de generar el cdigo


para definir los puertos de acuerdo con la
informacin que indica la directiva (donde
solo se indican los terminales de salida), sin
tener en cuenta si la operacin es de entrada
o de salida. Entonces el ejemplo 1 quedara:

Ejemplo 1 con fixed


#include <16F877A.h>
#fuses XT, NOWDT
#use delay (clock = 4000000)
#use fixed_io(b_outputs=pin_b1)
Void main () {
Port_b_pullups (TRUE);
Output_low(PIN_B1);

While (1)
{
If (input (PIN_B0) == 1 )
Output_low(PIN_B1);
else
Output_high(PIN_B1);

}
}

Ejercicio 4
Realizar un contador de 0 a 99 con un doble display de 7
segmentos de ctodo comn. La cuenta debe ser continua y
de 0 a 9 el digito de las decenas debe estar apagado.
Componentes: PIC16F877A, RX8 y 7SEG-MPX2-CC.
Ayuda:

Ejercicio 4
Ayudas: los terminales de los dos display son comunes por lo que el dato
es comn, para que aparezca el digito solo en las unidades, o solo en las
decenas se debe apagar el otro display mediante el terminal de ctodo. Es
decir si se desea visualizar las unidades se pasa el cdigo 10 al display y si
son las decenas se pasa el 01 (con un 1 el display esta apagado y con un 0
esta encendido). La alternancia entre los dos ctodos debe ser tan rpida
que el ojo no se de cuenta del parpadeo. En el caso que las decenas sean
cero su display se apagara
CONST DISPLAY[10] =
Permite visualizar de 0 a 9 mediante la combinacin de digitos tipica de
los display de 7 segmentos

Entradas y Salidas
LCD - liquid crystal display
Se acostumbra ha utilizar LCD del tipo
HD44780 con un numero de lneas variable y
un nmero de caracteres por lnea tambin
variable (por ejemplo, con 2 x 16 se trabaja
con dos lneas de 16 caracteres cada una).

LCD
Las pantallas LCD sirven para representar letras, nmeros y
caracteres presentes en el cdigo ASCCII.
En la actualidad las pantallas LCD incorporan internamente un
microcontrolador (Driver) encargado del manejo de los
diferentes comandos que permiten su escritura y lectura; as
como facilitar la comunicacin con el mundo exterior.
Existen de 16x2, 20x2 y 20x4

LCD

LCD
Los tres pines de control (RS, R/W y E) permiten
seleccionar y habilitar la pantalla LCD con la que se est
trabajando, as como escribir (aplicacin ms tpica) en
ella.
Los restantes pines (D0 a D7) sirven para enviar el dato
que se desea mostrar y/o el comando que permitir
desplazar la posicin del cursor, borrar la pantalla LCD,
cambiar de lnea y posicin dentro de la misma entre
otros.
Generalmente
por
ahorro
de
pines
del
microcontrolador, se trabaja con el bus de datos de 4
bits en la pantalla LCD (desde D4 hasta D7)

LCD
El bus de datos es de 8 bits, aunque tambin
existe la posibilidad de trabajar con 4 bits (con
un menor nmero de caracteres). El
compilador C incluye un fichero (driver) que
permite trabajar con un LCD. El archivo es
LCD.C y debe llamarse como un #include. Este
archivo dispone de varias funciones ya
definidas

LCD
Lcd_init();
Es la primera funcin que debe ser llamada.
Borra la LCD y lo configura en el formato de
4bits, con dos lneas y con caracteres de 5X8
puntos, en modo encendido, cursor apagado y
sin parpadeo.
Configura el LCD con un autoincremento del
puntero de direcciones y sin desplazamiento
del display real

LCD
lcd_gotoxy(byte x, byte y);
Indica la posicin de acceso al LCD. Por
ejemplo, (1,1) indica la primera posicin de la
primera lnea y (1,2) indica la primera posicin
de la segunda lnea.
Lcd_getc(byte x, byte y);
Lee el carcter de la posicin (x,y).

LCD
Lcd_putc (char s);
S es una variable de tipo char. Esta funcin
escribe la variable en la posicin
correspondiente. Si adems ,se indica:
\f se limpia el LCD
\n el cursor va a la posicin (1,2).
\b el cursor retrocede una posicin.

LCD
El compilador de C ofrece una funcin ms
verstil para trabajar con el LCD:
Printf (string)
Printf (cstring, values)
Printf (fname, cstring, values)

String es una cadena o un array de caracteres,


values es una lista de variables separadas por
comas y fname es una funcin

LCD
El formato es %nt, donde n es opcional y puede ser:
1-9: para especificar cuantos caracteres se deben especificar
01-09: para indicar la cantidad de ceros a la izquierda.
1.1-9.9 para coma flotante.
t puede indicar
c carcter, s cadena o carcter, u entero sin signo, d entero con
signo, Lu entero largo con signo, x entero hexadecimal
(minsculas), X entero hexadecimal (mayusculas), Lx entero
largo Hexadecimal (minusculas), LX entero largo hexadecimal
(mayusculas). F flotante con truncado, g flotante con redondeo,
e flotante en formato exponencial. w entero sin signo con
decimales insertados, la 1 cifra indica el total, la 2 el numero de
decimales

LCD
El driver LCD.C esta pensado para trabajar con el PORTD. Por defecto este
driver usa siete terminales para la comunicacin entre el LCD y el PIC. En
la siguiente figura se encuentran definidas las conexiones utilizadas y la
posibilidad de cambiar de puerto

REQUERIMIENTO
Realizar un men de control mediante dos
pulsadores, el programa debe mostrar un
men de 3 funciones. Mediante el pulsador se
debe seleccionar uno de los 3 elementos y con
otro ejecutar la funcin (encender un led).
Componentes: PIC16F877A, RES, BUTTON y
LM016L

You might also like