You are on page 1of 66

SISTEMAS DIGITALES

C4 MDULOS INTERNOS DEL MICROCONTROLADOR PIC16F877A PUERTOS E/S


4.1.- Los puertos paralelos 4.1.1.- Introduccin 4.1.2.- Conceptos Avanzados

4.1.3.- Los puertos paralelos en los pic de gama media


4.1.4.- Ejemplos con perifricos comunes 4.2.- Parallel Slave Port 4.2.1.- Ejemplo con pantalla LCD

Los puertos de E/S

SD2

4.1.1.- INTRODUCCIN
CONCEPTOS BSICOS Un perifrico es un dispositivo externo conectado al microcontrolador. Posibles perifricos son: los interruptores (switches), diodos emisores de luz (LED: Light Emitting Diode), rels, teclados matriciales, visualizadores (displays) de 7 segmentos o de cristal lquido, convertidores A/D o D/A, una impresora, un motor, etc. Todos estos perifricos deben incluir el circuito de interfaz necesario para conectarlos a los puertos del microcontrolador. Un puerto (port) es un circuito que forma parte del microcontrolador y sirve de interfaz con algn dispositivo externo (un perifrico). Al conectar dispositivos a los terminales de los puertos, hay que tener en cuenta las limitaciones de potencia elctrica del microcontrolador.

Introduccin a la Programacin en C con el Pic16

EI-3

FUNCIONAMIENTO DE LOS PUERTOS

MODOS DE TRANSFERENCIA DE DATOS


Simple: Ej. LEDs o interruptores Controlada: Ej. Comunicacin serie
Dato
1

(8 bits)
1. Emisor informa que enva dato 2. Receptor informa de dato recibido 3. Receptor dice al emisor que enve el siguiente dato

Emisor STB (strobe)


2

Receptor ACK (acknowledgment)

TCNICAS DE ENTRADA/SALIDA
E/S por programa E/S por interrupcin

Los puertos de E/S

SD4
BDIR-INST 13 Bus de datos BDAT PORTA
7 0

LOS PUERTOS DE E/S EN EL PIC16F877A

Memoria de Programa FLASH


13 0

Contador Programa (PC)

Son 5 Puertos de E/S configurables BANCO 0 PORTA: 6 pines (dir 0x05) PORTB: 8 pines (dir 0x06 y 0x106) PORTC: 8 pines (dir 0x07) PORTD: 8 pines (dir 0x08) PORTE: 3 pines (dir 0x09) TOTAL: 33 pines de E/S Configuracin de la direccin de los datos en los registros de direccin de datos: BANCO 1 TRISA (dir 0x85) TRISB (dir 0x86 y 0x186) TRISC (dir 0x87) TRISD (dir 0x88) TRISE (dir 0x89)

14

Bus de programa BINST

Pila (STACK) de 8 niveles (13 bits)

Memoria de datos (Archivo de Registros) RAM 9 BDIR-DAT PORTB

RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT RA5/AN4/SS#/C2OUT RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3 RD4/PSP4 RD5/PDP5 RD6/PDP6 RD7/PDP7 RE0/AN5/RD# RE1/AN6/WR# RE2/AN7/CS#

Registro de Instrucciones

Mux. Direc.

7
8 Direccionamiento directo 8 Dato inmediato Timer de encendido (PWRT) Timer de arranque del Oscilador (OST) Reset de encendido (POR) Timer del watchdog (WTD) Reset Brown-out Depuracin en circuito Programacin en Bajo voltaje MCLR#

Direc. indirecto

Reg. FSR Reg. STATUS PORTC

3 Mux

Decodificacin de instrucciones y control Generacin de tiempo

PORTD 8 ALU

Reg. W PORTE Puerto esclavo paralelo

OSC1/CLKIN OSC2/CLKOUT

Interrupciones
(Internas)

INT
(Externa)

VDD, VSS Conversor A/D de 10 bits

Timer0

Timer1

Timer2

Comparador

Memoria de Datos EEPROM

Mdulos CCP1,2

SSP Puerto serie sncrono

USART

Referencia de voltaje

Introduccin a la Programacin en C con el Pic16

EI-5

FUNCIONAMIENTO DE LOS PUERTOS


Los microcontroladores PIC de clase media pueden tener hasta 7 puertos paralelos, nombrados con las letras A, B...G. Cada puerto puede ser de hasta 8 bits. Los terminales de los puertos se identifican como RA<x>, RB<x>, ...,RG<x>, donde x es el nmero del bit (x = 0,1.. .7). En general, cada lnea de un puerto se puede programar como entrada o como salida. La mayora de los terminales de los puertos de E/S pueden realizar varias funciones. Por ejemplo, un mismo terminal puede servir como entrada o salida digital, o puede ser una entrada analgica al convertidor A/D, o puede ser portador de alguna seal de entrada o salida a uno de los temporizadores del microcontrolador. Algunos microcontroladores PIC tambin tienen un puerto paralelo adicional denominado Puerto Paralelo Esclavo (PSP: Parallel Slave Port). El PSP se comporta como un bus perifrico de 8 bits, con lneas para controlar la transferencia de datos entre el PIC y el perifrico. Cuando existe, el PSP comparte sus terminales con los puertos D y E. Para manipular los puertos paralelos, hay dos registros de funciones especiales por cada uno de los puertos, que se denominan PORT y TRIS (PORTA, TRISA, PORTB, TRISB, etc.). Los registros PORT almacenan el dato de salida del puerto mientras que los registros TRIS sirven para programar cada lnea del puerto correspondiente como entrada o salida. Cada bit de cualquier registro TRIS se programa de la siguiente forma:

TRIS<x> = 1 programa la lnea <x> del puerto como entrada. TRIS<x>= 0 programa la lnea <x> del puerto como salida.

Introduccin a la Programacin en C con el Pic16

EI-6

4.1.2.- CONCEPTOS AVANZADOS

FUNCIONAMIENTO DE LOS PUERTOS


El elemento bsico es el biestable tipo D latch, capaz de almacenar un bit. En un puerto de 8 bits, hay 8 biestables de este tipo
Latch de salida de datos Dato

IE Q(t+1)

OE#

DO

0
1

Q(t)
DI

0
1

Q
Z (alta impedancia)
Latch de control Control

G1

T1

G2

T2

Latch de entrada de datos

Control 1 0

Dato x 0 1

G1 1 1 0

G2 0 1 0

T1 Cortado (OFF) Cortado (OFF) Conduce (ON)

T2 Cortado (OFF) Conduce (ON) Cortado (OFF)

Terminal de E/S Entrada: alta impedancia Salida: VSS (0) Salida: VDD (1)

Los puertos de E/S

SD7

UTILIZACIN DE LOS PUERTOS El nivel lgico y elctrico de un pin definido como entrada depender de la conexin externa realizada en ese pin. Los pines de entrada tendrn conectado algo
en el exterior que fijar ese nivel. El nivel lgico y elctrico en un pin definido como salida debe ser gobernado por una etapa de salida interna asociada a ese pin, ese nivel se desconoce a priori en el arranque pero vendr impuesto va software desde el programa del microcontrolador.

Tras un reset, todos los bits de los registros TRISx estn a 1, todos los pines de los PORTx son por tanto de entrada por motivo de seguridad en las conexiones
Si el pin estuviera definido por error como salida y la conexin externa correspondiera realmente a una entrada cuyo nivel no tiene porqu coincidir con el que intenta imponer la salida, podra aparecer una sobrecorriente que quemara la etapa de salida de manera definitiva. Por tal motivo es especialmente importante prestar atencin a la configuracin que se hace de la direccin de los pines de los puertos desde el programa y tambin puede ser aconsejable proteger elctricamente esos pines con alguna limitacin en la corriente de salida (una resistencia serie por ejemplo) ante errores de programacin.

Los puertos de E/S

SD8

Terminales definidos como salidas/entradas


Caso 1: Sin proteccin
Vdd Etapa de salida bi P Corriente de salida si bi = 1 Etapa de salida bi P

Caso 1: Con proteccin


Vdd Corriente de salida si bi = 1

bi bi: bit de salida para ese pin

Pin definido como salida

Conexin Externa real

bi bi: bit de salida para ese pin

Pin definido como salida

Caso 2: Sin proteccin


Vdd
Etapa de salida bi P Corriente de salida si bi = 0

Caso 2: Con proteccin


Vdd Conexin Externa real
Etapa de salida bi P

R: Seguridad ante posibles errores de programacin


Vdd

Vdd
Corriente de salida si bi = 0

bi bi: bit de salida para ese pin

Pin definido como salida

bi bi: bit de salida para ese pin

Pin definido como salida

Los puertos de E/S

SD9

Algunos valores de las tensiones y corrientes en los terminales del PIC16F877A suministrados por el fabricante Valores mximos de corriente en los terminales:
Corriente mxima drenada/suministrada por cualquier terminal: 25 mA. La corriente drenada o drenada/suministrada por el conjunto de los puertos A, B, C, D y E no debe sobrepasar los 200 mA.

Valores tpicos para las tensiones de entrada y salida:


Se interpreta que hay un estado lgico 0 en un terminal de entrada si la tensin en ese terminal es VIL < 0,75 V (entrada TTL) o VIL < 1,0 V (entrada Schmitt Trigger), cuando VDD = 5,0 V. Se interpreta que hay un estado lgico 1'en un terminal de entrada si la tensin en ese terminal es VIH > 2,0 V (entrada TTL) o VIH > 4,0 V (entrada Schmitt Trigger), cuando VDD = 5,0 V. La tensin de salida para el estado lgico 0'es VOL< 0,6 V si la corriente de salida drenada por el terminal es IOL < 8,5 mA (cuando VDD = 4,5 V). La tensin de salida para el estado lgico 1'es VOH > VDD - 0,7 V = 3,8 V si la corriente de salida suministrada por el terminal es IOH < 3,0 mA (cuando VDD = 4,5 V).

Los puertos de E/S

SD10

REGISTROS DE LOS PUERTOS Y REGISTROS DE DIRECCIN DE DATOS Un puerto (PORT) es una agrupacin lgica de pines de E/S direccionado en la memoria
RAM de datos, el tamao mximo de un puerto es de 8 bits (1 byte)

Muchos de los pines de los puertos de E/S estn multiplexados con otras funciones alternativas asociadas a los mdulos internos del microcontrolador. Cada funcin posible aparece separada del resto mediante un carcter /: RC3/SCK/SCL
Cada registro de puerto (PORTx), lleva asociado un registro de direccin de datos (TRISx) que configura la direccin (entrada o salida) de cada uno de los pines del puerto. El bit n de TRISx controla el sentido del bit n de PORTx (si es 1: entrada , si 0:salida)

b7 b6 b5 b4 b3 b2 b1 b0 TRISx 0 1 1 1 1 1 0 0 1 Entrada PORTx S E E E E E S S 0 Salida

Los puertos de E/S

SD11

4.1.3.- LOS PUERTOS PARALELOS EN LOS PIC DE GAMA MEDIA

DIAGRAMA DE BLOQUES INTERNO Y ESQUEMA ELCTRICO DE LOS PUERTOS

ES PARTICULAR DE CADA PUERTO INCLUSO EN EL MISMO PUERTO HAY PINES CON CARACTERSTICAS DISTINTAS

ES NECESARIO SABER INTERPRETAR EL ESQUEMA INTERNO PARTICULAR PARA SABER QU CONEXIONES SE PUEDEN HACER

Los puertos de E/S

SD12

EL PUERTO A (PORTA)
TERMINALES (PINES) DEL PUERTO A
El puerto A puede tener hasta 8 bits, aunque en la mayora de los PIC de clase media (como el PIC16F877A), slo estn implementados 6 bits, que corresponden a los terminales RA0 a RA5. Todos los terminales se pueden configurar como entradas o como salidas. RA4 tiene la particularidad de que es una entrada Schmitt Trigger y, si se programa como salida, es de drenador abierto. Los registros de funciones especiales asociados al puerto A son PORTA y TRISA.
Nombre terminal RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI//C1OUT Tipo de buffer entrada digital TTL TTL TTL TTL ST (Schmitt Trigger) Funcin Entrada/salida digital o entrada analgica 0. Entrada/salida digital o entrada analgica 1. Entrada/salida digital o entrada analgica 2 o entrada (low) del voltaje de referencia del A/D o salida de la VREF del Comparador.. Entrada/salida digital, o entrada analgica 3, o entrada (high) del voltaje de referencia del A/D Entrada/salida digital (como salida, es de drenador abierto) o entrada externa de reloj para el Timer0 o salida del comparador1.
MCLR#/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT RA5/AN4/SS#/C2OUT RE0/RD#/AN5 RE1/WR#/AN6 RE2/CS#/AN7 VDD VSS OSC1/CLKIN OSC2/CLKOUT RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 PDIP 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT VDD VSS RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA RD3/PSP3 RD2/PSP2

RA5/AN4/SS/C2OUT

TTL

Entrada/salida digital o entrada analgica 4 o entrada de seleccin del puerto serie sincrnico o salida del comparador 2

PIC16F877A

Los puertos de E/S

SD13

DIAGRAMA DE BLOQUES DE LOS PINES DEL PUERTO A RA5, RA3, RA2, RA1 y RA0 (multiplexadas con mdulo A/D) RA4 tiene salida de drenador abierto (entrada multiplexada con T0CKI)

Los puertos de E/S

SD14

LECTURA EN TERMINAL DE SALIDA y ESCRITURA EN TERMINAL DE ENTRADA


Si un pin est definido como salida y se ejecuta una instruccin de lectura, se debera leer el estado del pin, que sera el escrito por programa en el biestable D del PORT al estar activada la etapa de salida de los MOS Si un pin est definido como entrada y se ejecuta una operacin de escritura, el bit escrito quedar retenido en el biestable D de salida pero no aparecer en el pin al estar desactivada la etapa de salida de los MOS

Lectura de Bi en pin de salida Bi Bi Bi 0 1 1 1 0 Bi

Escritura de Bi en pin de entrada


No hay etapa 1 de salida

Los puertos de E/S

SD15

TERMINALES RA0, RA1, RA2, RA3 y RA5 CON SEALES ANALGICAS (1)
Esas lneas estn multiplexadas con las entradas analgicas del conversor A/D La configuracin A/D de cada pin se selecciona en el registro ADCON1 (0x9Fh)
R/W-0 ADFM bit 7 R/W-0 ADCS2 U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 PCFG3 PCFG2 PCFG1 PCFG0 bit 0

Configuracin inicial por defecto

Tras un RESET, las lneas estn definidas todas como analgicas

Los puertos de E/S

SD16

TERMINALES RA0, RA1, RA2, RA3 y RA5 CON SEALES ANALGICAS (2)
Si la lnea est definida como analgica y se procede a su lectura, el nivel que se leera sera 0 independientemente del nivel real externo que estuviera presente
Por tanto, si se va a usar como entrada digital hay que configurarla como tal y no como analgica para poder leer el nivel real Incluso si se va a usar como salida digital el hecho de dejarla con la configuracin analgica por defecto puede causar errores Las operaciones de escritura en uno o varios pines de un puerto son operaciones que se desarrollan en tres pasos: lectura-modificacin-escritura lo que quiere decir que primero se lee el estado del pin, luego se modifica internamente su estado si es necesario y finalmente se escribe en el biestable D de salida

Nivel real

Los puertos de E/S

SD17

TERMINALES RA0, RA1, RA2, RA3 y RA5 CON SEALES ANALGICAS (3)

Lectura-modificacin-escritura:
Una instruccin del tipo puesta a 1 (BSF) puesta a 0 (BCF) de un nico bit, o instrucciones que operen con el puerto y que sea el destino, se ejecutan en 4 fases: Q1.- Decodificacin de la instruccin Q2.- Lectura de TODO EL PUERTO, las seales que estn configuradas como analgicas se leeran como 0 Q3.- Cambio del bit implicado (si es necesario) Q4.- Escritura de TODO EL PUERTO, los bits que no intervienen en la operacin se escriben con el valor que tenan, debera ser el ledo en la fase Q2 pero si se leyeron como 0 por ser analgica la seal, puede modificarse el valor previo)

Ejemplo: se define PORTA como puerto de salida pero ADCON1 tiene la carga inicial (todas analgicas.)
RA0 Estado inicial del PORTA 1 0 1 1 1 RA5 1 Q2.- Se lee xx010000 Q3.- Se pone a 1 el bit 1 xx010010 Q4.- Se escribe el PORTA xx010010 bsf PORTA,1 RA0 0 1 0 0 No ha cambiado solo el bit que se quera poner a 1, sino casi todos salvo el 4 (no analgica)!

1
RA5 0

Si la instruccin carga todo el puerto (p.e. movwf PORTA) no hay problema

Los puertos de E/S

SD18

REGISTROS ASOCIADOS AL PUERTO A


Direccin 05h 85h 9Fh Registro PORTA TRISA Bit 7
-

Bit 6 -

Bit 5 RA5 -

Bit 4 RA4 -

Bit 3 RA3 PCFG3

Bit 2 RA2 PCFG2

Bit 1 RA1 PCFG1

Bit 0 RA0 PCFG0

Valores despus del reset por encendido (POR) o por cada de tensin (BOR) --0x 0000 --11 1111 0--- 0000

Registro de direcciones de datos del PORTA

ADCON1 ADFM

Si se quiere que todos los pines del PORTA funcionen como entradas/salidas digitales se debe escribir un 011x en los bits PCFG<3:0> de ADCON1 . Otro valor en estos bits har que todos alguno de los pines del puerto A pasen a funcionar como pines del mdulo conversor A/D. El valor de RESET del registro ADCON1 es todo a 0, por lo que por defecto, tras un reset el puerto est configurado como entradas analgicas. Todas las operaciones de escritura sobre el PORTA son operaciones de lectura-modificacin escritura.
;Ejemplo de inicializacin del PORTA BCF BCF CLRF BSF MOVLW MOVWF MOVLW MOVWF BCF STATUS,RP0 STATUS,RP1 PORTA STATUS,RP0 0x06 ADCON1 0xCF TRISA STATUS,RP0 ;Se selecciona el ;banco 0 ;Inicializo PORTA poniendo los latches a 0 ;Se selecciona el banco 1 ;Configuro todos los pines ;como entradas o salidas digitales ;Valor que hay que cargar en TRISA ;para programar RA<3:0> como entradas y RA<5:4> como salidas. ;Se vuelve a seleccionar el banco 0.

Los puertos de E/S

SD19

EL PUERTO B (PORTB)
TERMINALES (PINES) DEL PUERTO B
El puerto B tiene 8 bits y sus terminales se denominan RB0 a RB7. Para escribir un dato en el puerto B se usa el registro de funciones especiales PORTB. Todos los terminales se pueden configurar como entradas o como salidas mediante el registro de funciones especiales TRISB.
MCLR#/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT RA5/AN4/SS#/C2OUT RE0/RD#/AN5 RE1/WR#/AN6 RE2/CS#/AN7 VDD VSS OSC1/CLKIN OSC2/CLKOUT RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 PDIP 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT VDD VSS RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA RD3/PSP3 RD2/PSP2

Nombre terminal RB0/lNT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD

Funcin Entrada/salida digital. Entrada de interrupcin externa. Entrada/salida digital. Entrada/salida digital. Entrada/salida digital. Terminal de programacin en circuito. Entrada/salida. En entrada se programa una interrupcin por cambio de nivel lgico. Entrada/salida. En entrada se programa una interrupcin por cambio de nivel lgico. Entrada/salida. En entrada se programa una interrupcin por cambio de nivel lgico. Terminal de programacin en circuito Entrada/salida. En entrada se programa una interrupcin por cambio de nivel lgico. Terminal de programacin en circuito

PIC16F877A

Los puertos de E/S

SD20

FUNCIN DE LOS PINES DEL PUERTO B (PORTB)


El terminal RB0/INT sirve para aceptar una solicitud de interrupcin externa, por flancos. Esta interrupcin activa el bit INTF del registro INTCON (bit INTCON<1>) y se habilita o inhabilita mediante el bit INTE del registro INTCON (bit INTCON<4>). El flanco que produce la interrupcin puede ser el de subida o el de bajada (mediante el bit INTEDG => OPTION_REG<6>)

Si estos terminales RB4, RB5, RB6 y RB7 se programan como entradas, un cambio en el nivel lgico de la seal de entrada, de 0' a '1' o viceversa, en cualquiera de ellos, puede generar una interrupcin. Al producirse la interrupcin el bit RBIF del registro INTCON (bit INTCON<0>) se pone a 1. La interrupcin puede habilitarse mediante el bit RBIE del registro INTCON (bit INTCON<3>). Puede servir para sacar al microcontrolador del modo sleep.
Los terminales RB3, RB6 y RB7 pueden ser utilizados como terminales para la programacin en circuito del microcontrolador. (ICSP: In-Circuit Serial Programming). Permite que el microcontrolador sea programado en la propia placa de circuito impreso de la aplicacin a la que est destinado.

REGISTROS ASOCIADOS AL PUERTO B (PORTB)


Direccin 05h, 106h 86h, 186h 81h, 181h 0Bh, 8Bh 10Bh, 18Bh Registro PORTB TRISB Bit 7 RB7 Bit 6 RB6 Bit 5 RB5 Bit 4 RB4 Bit 3 RB3 PSA RBIE Bit 2 RB2 PS2 TOIF Bit 1 RB1 PS1 INTF Valores despus del reset por Bit 0 encendido (POR) o por cada de tensin (BOR) RB0 PS0 RBIB xxxx xxxx 1111 1111 1111 1111 0000 000x

Registro de direcciones de datos del PORTB

OPTION_REG RBPU# INTEDG T0CS T0SE INTCON GIE PEIE TOIE INTE

Los puertos de E/S

SD21 Resistencia de polarizacin (para entradas)

Resistencias de polarizacin

Buffer triestado

Todos los terminales tienen un pull-up interno programable por software. Es decir, en todas las lneas del PORTB, se tiene la posibilidad de activar unas resistencias de polarizacin (pull-up resistors) si los pines estn definidos como entradas y adems el bit OPTION_REG<7>= RBPU=0 En cuanto pasan a ser salidas se desactivan las resistencias El uso de esas resistencias evita la conexin de otras externas. Las resistencias son en realidad transistores pMOS trabajando en su zona de comportamiento resistivo (20k aprox.)

Los puertos de E/S

SD22

EL PUERTO C (PORTC)
TERMINALES (PINES) DEL PUERTO C
El puerto C es un puerto paralelo de 8 lneas bidireccionales (8 bits) cuyos terminales se nombran RC0 a RC7. Para escribir un dato en el puerto C se usa el registro de funciones especiales PORTC. Todos los terminales se pueden configurar como entradas de tipo Schmitt Trigger o como salidas digitales, mediante el registro de funciones especiales TRISC. Sin embargo, algunos perifricos definen las lneas como entradas o como salidas de manera independiente al estado de TRISC si hay definida una determinada funcionalidad para el pin
MCLR#/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT RA5/AN4/SS#/C2OUT RE0/RD#/AN5 RE1/WR#/AN6 RE2/CS#/AN7 VDD VSS OSC1/CLKIN OSC2/CLKOUT RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT VDD VSS RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA RD3/PSP3 RD2/PSP2

PDIP

REGISTROS ASOCIADOS AL PUERTO C (PORTC)


Valores despus del reset por Bit 0 encendido (POR) o por cada de tensin (BOR) RC0 xxxx xxxx 1111 1111

Direccin 07h 87h

Registro PORTC TRISC

Bit 7 RC7

Bit 6 RC6

Bit 5 RC5

Bit 4 RC4

Bit 3 RC3

Bit 2 RC2

Bit 1 RC1

Registro de direcciones de datos del PORTC

PIC16F877A

Los puertos de E/S

SD23

FUNCIN DE LOS PINES DEL PUERTO C (PORTC)


Los terminales del puerto C comparten funciones con otros dispositivos de entrada y salida: el temporizador Timer1, el mdulo CCP (Compare/Capture/PWM) y los puertos serie SSP (Synchronous Serial Port) o MSSP (Master Synchronous Serial Port) y USART (Universal Synchronous Asynchronous Transmitter Receiver).

Nombre terminal RC0/T1OSO/T1CKI RC1/T1OSI/CCP2

RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT

Funcin Entrada/salida digital o salida del oscilador del Temporizador 1 (Timer1) o entrada de reloj del Temporizador 1. Entrada/salida digital o entrada del oscilador del Temporizador 1 (Timer1) o entrada de reloj del Temporizador 1 o Terminal del mdulo CCP2 (entrada para Captura, salida para Comparacin y salida para Modulacin de Pulsos en Anchura PWM) Entrada/salida digital o terminal del mdulo CCP1 (entrada para Captura, salida para Comparacin y salida para Modulacin de Pulsos en Anchura PWM) Entrada/salida digital o terminal del puerto serie sncrono (reloj) Entrada/salida digital o terminal del puerto serie sncrono (entrada datos) Entrada/salida digital o terminal del puerto serie sncrono (salida datos) Entrada/salida digital o terminal del puerto serie USART (transmisin) Entrada/salida digital o terminal del puerto serie USART (recepcin).

Los puertos de E/S

SD24

EL PUERTO D (PORTD)
TERMINALES (PINES) Y REGISTROS ASOCIADOS AL PUERTO D

MCLR#/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT RA5/AN4/SS#/C2OUT RE0/RD#/AN5 RE1/WR#/AN6 RE2/CS#/AN7 VDD VSS OSC1/CLKIN OSC2/CLKOUT RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 PDIP 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT VDD VSS RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA RD3/PSP3 RD2/PSP2

El puerto D es un puerto paralelo de 8 lneas bidireccionales (8 bits) cuyos terminales se nombran RD0 a RD7. Para escribir un dato en el puerto D se usa el registro de funciones especiales PORTD. Todos los terminales se pueden configurar como entradas de tipo Schmitt Trigger o como salidas digitales, mediante el registro de funciones especiales TRISD.

REGISTROS ASOCIADOS AL PUERTO D (PORTD)


Valores despus del reset por Bit 0 encendido (POR) o por cada de tensin (BOR) RD0 xxxx xxxx 1111 1111

Direccin 08h 88h

Registro PORTD TRISD

Bit 7 RD7

Bit 6 RD6

Bit 5 RD5

Bit 4 RD4

Bit 3 RD3

Bit 2 RD2

Bit 1 RD1

Registro de direcciones de datos del PORTD

PIC16F877A

Los puertos de E/S

SD25

FUNCIN DE LOS PINES DEL PUERTO D (PORTD)


El PORTD se puede configurar como un puerto esclavo paralelo (PSP), controlable mediante las lneas del PORTE
Nombre Bit Tipo de Buffer Funcin terminal RD0/PSP0 0 ST/TTL(1) Entrada/salida digital del puerto D o bit 0 del puerto esclavo paralelo RD1/PSP1 1 ST/TTL(1) Entrada/salida digital del puerto D o bit 1 del puerto esclavo paralelo (1) RD2/PSP2 2 ST/TTL Entrada/salida digital del puerto D o bit 2 del puerto esclavo paralelo (1) RD3/PSP3 3 ST/TTL Entrada/salida digital del puerto D o bit 3 del puerto esclavo paralelo RD4/PSP4 4 ST/TTL(1) Entrada/salida digital del puerto D o bit 4 del puerto esclavo paralelo (1) RD5/PSP5 5 ST/TTL Entrada/salida digital del puerto D o bit 5 del puerto esclavo paralelo (1) RD6/PSP6 6 ST/TTL Entrada/salida digital del puerto D o bit 6 del puerto esclavo paralelo (1) RD7/PSP7 7 ST/TTL Entrada/salida digital del puerto D o bit 7 del puerto esclavo paralelo ST = Entrada Schmitt Trigger TTL = Entrada TTL Nota (1) : En el modo puerto normal, los buffers de entrada son Schmitt Triggers. En el modo de puerto esclavo paralelo, los buffers de entrada son TTL.

Los puertos de E/S

SD26

EL PUERTO E (PORTE)
TERMINALES (PINES) Y REGISTROS ASOCIADOS AL PUERTO E
El puerto E es un puerto paralelo de 3 lneas bidireccionales cuyos terminales se nombran RE0 a RE2. Las lneas estn multiplexadas : a) Con 3 de las entradas analgicas del mdulo de conversin A/D RE0=AN5 Canal analgico 5 RE1=AN6 Canal analgico 6 RE2=AN7 Canal analgico 7
MCLR#/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+ RA4/T0CKI/C1OUT RA5/AN4/SS#/C2OUT RE0/RD#/AN5 RE1/WR#/AN6 RE2/CS#/AN7 VDD VSS OSC1/CLKIN OSC2/CLKOUT RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RD0/PSP0 RD1/PSP1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT VDD VSS RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA RD3/PSP3 RD2/PSP2

PDIP

b) Con las seales de control del puerto esclavo paralelo PSP del PORTD

Direccin 09h 89h 9Fh

Registro PORTE TRISE

Bit 7
-

Bit 6 -

Bit 5 -

Bit 4 -

Bit 3 PCFG3

Bit 2 RE2

Bit 1 RE1

Bit 0 RE0

PIC16F877A

Valores despus del reset por encendido (POR) o por cada de tensin (BOR) ---- -xxx 0000 -111 0--- 0000

IBF

OBF IBOV PSPMODE -

Registro de direcciones de datos del PORT PCFG2 PCFG1 PCFG0

ADCON1 ADFM

Los puertos de E/S

SD27

FUNCIN DE LOS PINES DEL PUERTO E (PORTE)


Nombre terminal RE0/AN5/RD# Bit 0 Tipo de Buffer ST/TTL(1) Funcin Entrada/salida digital del puerto E o entrada analgica 5 o entrada de control de lectura en el puerto esclavo paralelo RD# = 0 Operacin de lectura. Contenido del registro PORTD se sacan a los terminales E/S (si el chip est seleccionado) RD# = 1 Inactivo. Entrada/salida digital del puerto E o entrada analgica 6 o entrada de control de escritura en el puerto esclavo paralelo WR# = 0 Operacin de escritura. Valores de los terminales de E/S son copiados en el registro PORTD (si el chip est seleccionado) RD# = 1 Inactivo. Entrada/salida digital del puerto E o entrada analgica 7 o entrada de control de seleccin de chip en el puerto esclavo paralelo CS# = 0 Dispositivo seleccionado CS# = 1 No seleccionado.

RE1/AN6/WR#

ST/TTL(1)

RE2/AN7/CS#

ST/TTL(1)

ST = Entrada Schmitt Trigger TTL = Entrada TTL Nota (1) : En el modo puerto normal, los buffers de entrada son Schmitt Triggers. En el modo de puerto esclavo paralelo, los buffers de entrada son TTL.

Todo lo dicho en su momento para las lneas analgicas del PORTA es aplicable tambin en estas lneas del PORTE

Los puertos de E/S

SD28

4.1.4.- CONEXIN Y TRATAMIENTO CON PERIFRICOS COMUNES


1.- DIODOS LED
Entre los dispositivos de E/S que se conectan a menudo a un microcontrolador estn los interruptores y los diodos LED. La figura muestra tres circuitos para conectar estos dispositivos a las lneas del puerto B de un microcontrolador PIC. El diodo LED1 se activa con un nivel de tensin bajo ('0' lgico) en el VDD VDD terminal RB<i>, configurado previamente. como una salida digital. En este caso, la corriente I1, que circula por el diodo LED1 "entra" en el terminal del puerto. Si se quiere que en ese terminal se mantenga el '0' lgico cuando se activa el LED, debe cumplirse I1 IOLmax (1)

I1
LED1 RB<i> RL2 RB<j> I2 PIC

RL1

donde lOLmax es la corriente mxima de salida del terminal cuando est en el nivel bajo.
LED2 El diodo LED2 se activa con un nivel alto ('1' lgico) en el terminal de salida RB<j>. La corriente I2 que circula por el diodo LED2 "sale" del terminal. Para que en estas condiciones el terminal mantenga el nivel lgico '1 debe cumplirse I2 IOHmax (2) donde lOHmax es el valor mximo de la corriente de salida del terminal en nivel alto. En general | IOLmax| > |IOHmax|, de modo que es ms fcil cumplir la condicin (1) que la (2). Por esta razn se prefiere conectar los diodos LED a los terminales de los puertos paralelos tal como est conectado el diodo LED1.

Los puertos de E/S

SD29

EJERCICIO 1:
Generar un retardo con un bucle for que active y desactive el zumbador conectado a RC2.

EJERCICIO 2:
Generar un pitido a 1kHz por la salida conectada a RC2 utilizando una funcin de retardo.

EJERCICIO 3:
Crear una funcin que vaya iluminando los LEDS conectados a RB0:RB3 de derecha a izquierda con un intervalo de 200ms y de forma indefinida.

Los puertos de E/S

SD30

2.- INTERRUPTORES

Los interruptores se conectan a entradas digitales.

En la figura el interruptor K est conectado a la entrada RB<k>.


VDD VDD Rk RB<k> K

Si el interruptor est "cerrado" pone un nivel de tensin bajo (0' lgico) en el terminal al que est conectado. Hay 0 V en RB<k>. Si el interruptor est "abierto", el circuito debe poner un nivel de tensin alto ('1 lgico) en el terminal correspondiente. Este nivel alto se garantiza con una resistencia conectada a la tensin VDD, del microcontrolador (pull-up externo). El valor de esta resistencia de pull-up externa (RK) puede ser razonablemente alto (varias decenas de ks), pues la corriente consumida por una entrada digital es sumamente pequea (recordar que los terminales del puerto B de los microcontroladores PIC poseen un resistor de pull-up interno, el cual se puede conectar o desconectar por programa, mediante el bit RBPU del registro OPTION pudiendo prescindir de las resistencias RK externas.

VSS PIC

Problema del rebote en los interruptores mecnicos


Cuando se acciona un interruptor, las piezas metlicas vibran y se aprecian aperturas y cierres rpidos antes de alcanzar la posicin estable. En general, ese estado transitorio dura menos de 20 ms pero puede hacer que un nico accionamiento sea interpretado errneamente.

Solucin hardware/software

Los puertos de E/S

SD31

EJERCICIO 4:
Implementar una solucin software en ensamblador para la solucin del problema de rebote.

Consiste bsicamente en leer el estado del interruptor despus de transcurrido un tiempo prudencial a partir del momento en que se manipul el interruptor, tras haber detectado la primera transicin. Un tiempo de espera de unos 20 ms es generalmente suficiente.

NO

Pulsado el pulsador? S Esperar 20 ms

NO

Pulsado el pulsador? S Continuar

Los puertos de E/S

SD32

EJEMPLO 1:
Vamos a realizar un programa que cuando se accione el pulsador el diodo D0 se encienda, y cuando se deje de pulsar el diodo D0 se apague.
+5V +5V VDD

La figura muestra los elementos que hay conectados a los pines del PORTA y PORTB de la placa de entrenamiento PICDEM2 PLUS (placa de prcticas del laboratorio). En concreto, un pulsador est conectado al pin 4 del puerto A y 4 diodos LED estn conectados a los 4 pines ms bajos del puerto B (RB0, RB1, RB2 y RB3).

4K7

PIC16F877A
470
RA4 RB1 RB2 VSS OSC1 RB3 OSC2 4MHz 20pF 20pF RB0

470 D0 D1 D2 D3

Los puertos de E/S

SD33

Sin considerar el problema de rebotes:


LIST p=16F877A ; Directiva para iniciar el tipo de PIC INCLUDE P16F877A.INC ; Definiciones de registros internos __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF ORG 0X00 ; VECTOR RESET (Siempre se empieza en la direccin cero. GOTO INICIO ; Saltamos al inicio del programa ORG 0X05 ; Nos saltamos el VECTOR DE INTERRUPCIONES CLRF PORTB ; Borramos el PORTB BSF STATUS,RP0 ; Seleccionamos el Banco 1, poniendo a 1 el bit ; RP0 del registro de STATUS, ya que en ese banco ; de la memoria de datos est TRISB. MOVLW 0XF0 ; Movemos al acumulador W el valor 0XF0 MOVWF TRISB ; Llevamos el valor del acumulador al TRISB, ; los pins puestos a 1 son Input(RB7,RB6,RB5,RB4) ; y los puestos a 0 son Output (RB3,RB2,RB1,RB0) BCF STATUS,RP0 ; Volvemos al Banco 0, poniendo a 0 RP0. BTFSS PORTA,4 ; Explora el bit 4 de PORTA y ; si es 1 (no se ha pulsado) y se salta ; la siguiente instruccin. CALL ENCENDER ; si es 0 (se ha pulsado) y llama a ; la subrutina ENCENDER. GOTO ESPERA ; Salto incondicional a ESPERA. MOVLW 1 ; Mueve el nmero 1 al acumulador W MOVWF PORTB ; Mueve el W al PORTB. BTFSS PORTA,4 ; Explora el bit 4 de PORTA y salta si es 1. GOTO SOLTAR ; Salto incondicional a SOLTAR MOVLW 0 ; Mueve el nmero 0 al acumulador MOVWF PORTB ; Mueve el W al PORTB RETURN ; Retorno de la Subrutina ENCENDER END ; Fin del programa fuente

INICIO

ESPERA

ENCENDER SOLTAR

Los puertos de E/S

SD34

EJERCICIO 5:
Implementar una solucin software en ensamblador para el ejemplo anterior que tenga en cuenta el problema de los rebotes.

Los puertos de E/S

SD35

EJERCICIO 6:
Vamos a realizar un programa que cuando est accionado el pulsador los diodos D2 y D3 estn encendidos, y cuando est sin pulsar los que estn encendidos sean D0 y D1. (No vamos a considerar los rebotes)
+5V
4K7 470 RA4 RB1 RB2 VSS OSC1 RB3 +5V VDD

PIC16F877A
RB0

470 D0 D1 D2 D3

Valor para encender los LEDs D3 y D2: B00001100 Valor para encender los LEDs D1 y D0: B00000011

OSC2
4MHz

20pF

20pF

Introduccin a la Programacin en C con el Pic16

EI-36

EJERCICIO 7:
Mostrar una secuencia que vaya encenciendo los LEDs conectados a RB0:RB3 de forma que hagan un contador binario por cada pulsacin de RA4 (tener en cuenta el problema de los rebotes).

EJERCICIO 8:
Escribir un programa para leer un bit del puerto RA4, esperar 0.5 segundos y enviarlo al puerto RB1 . XTAL=4MHz

EJERCICIO 9:
Escribir un programa para leer un bit del puerto RA4. Si es 1, mandar un 1 al puerto RB2 y si es 0 enviarlo al RB1.

EJERCICIO 10:
Escribir un programa en C para monitorizar el estado del bit RB0. Si es Alto, generar pitidos de frecuencia 1kHz, duracin 0.2 segundos cada pitido y a intervalos de 1 segundo.

Los puertos de E/S

SD37

4.- VISUALIZADORES NUMERICOS DE 7 SEGMENTOS (DISPLAYs DE 7 SEGMENTOS)

Los visualizadores de 7 segmentos con diodos LED se usan sobre todo para representar informacin numrica. Hay dos tipos de elementos de 7 segmentos: los de nodo comn y los de ctodo comn, segn estn conectados entre s todos los nodos o todos los ctodos de los LED, respectivamente. En los de nodo comn, para que se active (emita luz) un segmento, el terminal correspondiente debe excitarse con una tensin baja (correspondiente al nivel lgico 0', si la lgica es positiva), mientras que el nodo comn debe estar puesto a una tensin positiva alta (VDD). En los elementos de ctodo comn la situacin es la inversa: cada segmento se activa con una tensin alta (correspondiente al nivel lgico 1) y el ctodo comn debe estar a 0 V (VSS).

Los puertos de E/S

SD38

EJEMPLO 2:
Vamos a realizar un programa que muestre el dgito A en el display de 7 segmentos
220 BUFFER INVERSOR 74LS540 PD7

Representacin de los dgitos 0-F en cdigo 7 segmentos, binario y hexadecimal


HEX 0 1 2 3 4 5 6 7 8 9 A B C D E F h 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 g 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 f 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 e 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 d 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 0 c 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 b 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 a 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 7SEG 3F 06 5B 4F 66 6D 7D 07 7F 67 77 7C 39 5E 79 71 7SEG C0 F9 A4 B0 99 92 82 F8 80 98 88 83 C6 A1 86 8E

PortD

PD0

PIC16F877A

TDSR 5160

47 PortA PA0

CC BC548

BUFFER INVERSOR 74LS540:invierte los ceros y los unos

Los puertos de E/S


;****************************************************************************** ;DISPLAY1DIGITO.ASM ;Saca por el display el dgito hexadecimal (de 0 a F) que almacenamos en DIGITO ;****************************************************************************** LIST p=16F877A ; Directiva para iniciar el tipo de PIC INCLUDE P16F877A.INC ; Definiciones de registros internos __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF

SD39

DIGITO

EQU
ORG GOTO ORG MOVLW MOVWF CLRW BSF CLRW MOVWF MOVLW MOVWF BCF MOVLW MOVWF CLRF BSF MOVF CALL GOTO

0X20
0X00 INICIO 0X05 0Ah DIGITO STATUS,RP0 TRISD 0xFE TRISA STATUS,RP0 0xFF PORTD PORTA PORTA,0 DIGITO,W TABLALED $ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; Siempre se empieza en la direccin cero Saltamos al inicio del programa Dejamos espacio para las interrupciones Almacenamos en el registro DIGITO el dgito hexadecimal A que queremos sacar en el display. Borramos el registro W Banco 1, poniendo a 1 el bit RP0 del STATUS Movemos al acumulador W el valor 0000 0000 Llevamos el valor del acumulador al TRISD, los pins puestos a 1 son Input y los puestos a 0 son Output. Movemos al acumulador W el valor b1111 1110 Llevamos el valor del acumulador al TRISA, los pins puestos a 1 son Input y los puestos a 0 son Output. Banco 0, poniendo a 0 el bit RP0 del STATUS Valor para apagar todos los LEDs del display Desactivar el display. Pone el bit 0 del PORTA a '1' (activar display). Mueve dgito al acumulador W Llama a la subrutina TABLALED

INICIO

Los puertos de E/S

SD40

;****************************************************************************** ;Subrutina que saca por el Puerto D el cdigo de 7 segmentos (complementado) del ;dgito hexadecimal (de 0 a F) que recibe en los cuatro ltimos bits de W. ;****************************************************************************** TABLALED CALL TABLA ;Vamos a la tabla para volver en W con MOVWF PORTD ;lo que hay que sacar por el Puerto D RETURN ;Retornamos de la subrutina ;Tabla con el cdigo de 7 segmentos (complementado) de los dgitos hexadecimales. TABLA ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW END PCL,F 0xC0 0xF9 0xA4 0xB0 0x99 0x92 0x82 0xF8 0x80 0x98 0x88 0x83 0xC6 0xA1 0x86 0x8E ;Suma del PC con el dgito a representar (en W) ;Para el cero ;el uno ;el dos ;el tres ;el cuatro ;el cinco ;el seis ;el siete ;el ocho ;el nueve ;la a ;la b ;la c ;la d ;la e ;la f ;Fin del programa fuente

Los puertos de E/S

SD41

EJERCICIO 11:
Implementa un programa en ensamblador basado en el ejemplo anterior que muestre los caracteres de tu nombre del primero al ltimo cambiando cada segundo y comenzando de nuevo por el primero cuando llegue al ltimo.

Los puertos de E/S

SD42

MULTIPLEXACIN DE DISPLAYs DE 7 SEGMENTOS


Cuando hay varios elementos de 7 segmentos formando una pantalla, visualizador o display, se prefiere la conexin multiplexada de estos dispositivos a los puertos paralelos del microcontrolador.
La figura muestra un visualizador o display de 4 elementos de nodo comn conectados a los puertos A y B de un microcontrolador PIC. Las resistencias Rs limitan la corriente que circula por los segmentos, mientras que las resistencias Rb deben garantizar la saturacin de los transistores que activan los terminales de seleccin de cada elemento. Los diodos aseguran que los transistores vayan a corte con un nivel lgico 1 en los terminales del puerto A. La frecuencia mnima de las seales en cada uno de terminales de seleccin debe estar entre 40 Hz y 200 Hz para que no se perciba parpadeo alguno. Cada elemento est seleccionado durante una cuarta parte del tiempo.

Los puertos de E/S

SD43

Organigrama del programa para el tratamiento del multiplexado de un display de 4 dgitos


TABLA 1 Aqu esta la informacin que se quiere mostrar en el display Se pueden reservar cuatro registros de la memoria RAM de datos para almacenar en cada registro el cdigo de 7 segmentos del dgito que se desea visualizar. Lo que enviamos al PORTB

TABLA 2 Aqu est la informacin para el encendido secuencial de los display. Podran ser cuatros registros con la informacin que hay que enviar al PORTA para activar los dgitos.

PUNTERO AL DIGITO A REFRESCAR

Programa que enva a los puertos la informacin direccionada con el puntero y actualiza el puntero para el siguiente dgito. Esto lo hara con una determinada frecuencia (refresco) El refresco se podra controlar con un temporizador e interrupciones o a travs de una subrutina de retardo y por programa

DISPLAY

Los puertos de E/S

SD44

EJEMPLO:
Vamos a realizar un programa que muestre los dgitos 4, 3, 2 y 1. (Se ha utilizado la placa del laboratorio)
220 BUFFER INVERSOR 74LS540 PD7 h g

f
e d c b a h Display 4 a

PortD

PD0

a
f g e d c h CC b

Display 3 TDSR 5160

Display 2 TDSR 5160

Display 1 TDSR 5160

PIC16F877A

TDSR 5160

47 PA3 PortA PA2 PA1 PA0

CC T3 BC548

CC T2 BC548

CC T1 BC548

T4 BC548

PA4 PB0

P1
P2

Los puertos de E/S


;****************************************************************************** ;DISPLAY4DIGITOS.ASM: Saca por el display de 4 dgitos los dgitos 4, 3, 2 y 1 ****************************************************************************** LIST p=16F877A ; Directiva para iniciar el tipo de PIC INCLUDE P16F877A.INC ; Definiciones de registros internos __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF CONTADOR EQU 0X61 DELAY1 EQU 0x62 DELAY2 EQU 0x63 DELAY3 EQU 0x64 ORG 0X00 ; Siempre empieza en la direccin cero GOTO INICIO ; Saltamos al inicio del programa ORG 0X05 ; Dejamos espacio para las interrupciones ; La inicializacin del programa principal empieza a partir de aqu INICIO MOVLW 0x04 ; inicializo el contador de repeticiones MOVWF CONTADOR ; a 4 CLRF PORTD ; Borramos el PORTD CLRF PORTA ; Borramos el PORTA BSF STATUS,RP0 ; Banco 1, poniendo a 1 el bit RP0 del STATUS CLRW ; Movemos al acumulador W el valor 0X00 (0000 0000) MOVWF TRISD ; Puerto D todo como salidas MOVLW 0xF0 ; Movemos al acumulador W el valor 0XF0 (1111 0000) MOVWF TRISA ; RA7-RA4 entradas; RA3-RA0 salidas MOVLW b'00000110' ;Definimos el PORTA MOVWF ADCON1 ;con todas sus seales como digitales BCF STATUS,RP0 ; Banco 0, poniendo a 0 el bit RP0 del STATUS SIGUE CALL ESPERA ; Esperaremos durante ..... INC MOVF CALL DECFSZ GOTO MOVLW MOVWF GOTO CONTADOR,W TABLALED CONTADOR,F SIGUE 0x04 CONTADOR SIGUE ; Mueve CONTADOR al acumulador W ; Decrementamos el apuntador y salta si ha llegado a 0

SD45

Los puertos de E/S


;****************************************************************************** ; Subrutina para el control de los displays ; Manda el cdigo del dgito al PORTD y ; el cdigo que activa el dgito al PORTA ;****************************************************************************** TABLALED CALL TABLA2 ; Vamos a la tabla para volver en W con MOVWF PORTA ; lo que hay que sacar por el Puerto D MOVF CONTADOR,W ; Mueve CONTADOR al acumulador W CALL TABLA1 ; Vamos a la tabla para volver en W con MOVWF PORTD ; lo que hay que sacar por el Puerto D RETURN

SD46

;SITUAMOS LA TABLA EN LAS POSICIONES INICIALES ;PARA ASEGURAR QUE LA PARTE ALTA DEL PC NO SE CAMBIA AL REALIZAR LA SUMA
TABLA1 ADDWF RETLW RETLW RETLW RETLW RETLW TABLA2 ADDWF retlw retlw retlw retlw retlw PCL,F 0x00 0xF9 0xA4 0xB0 0x99 PCL,F B'00000000' B'00000001' B'00000010' B'00000100' B'00001000' ; ; ; ; ; ; ; ; ; ; ; ; ; ; Suma del PC (apunta a la siguiente instruccin) con el valor de CONTADOR Comodn el uno el dos el tres el cuatro Suma del PC (apunta a la siguiente instruccin) con el valor de CONTADOR Comodn Activa display1 Activa display2 Activa display3 Activa display4

Los puertos de E/S


;****************************************************************************** ;* Subrutina de Espera de 5ms (aprox.) mediante 3 bucles anidados ;* Ciclos mquina = 3nmp+4mp+4p +1 ;* Con p=1, m=10 y n=165 salen 5000 ciclos mquina (aprox.) ;* Como fosc = 4 MHz Ciclo mquina = 1 s ;****************************************************************************** ESPERA MOVLW 0x01 ; Cargamos el primer lazo (p = .1 = 01h) MOVWF DELAY1 ; sobre la variable DELAY1 lazo1 MOVLW MOVWF 0x0A DELAY2 ; y el segundo (m = .10 = 0Ah)sobre la ; variable DELAY2

SD47

;Entramos en un lazo donde ejecuto una instruccin de decremento (un ciclo) ;y otra de salto (dos ciclos) lazo2 lazo3 MOVLW MOVWF DECFSZ GOTO DECFSZ GOTO 0xA5 DELAY3 DELAY3,F lazo3 DELAY2,F lazo2 ; ; ; ; ; ; y el tercero (n = .165 = A5h) sobre la variable DELAY3 decremento y si es distinto de cero sigo repitiendo decremento y si es distinto de cero sigo repitiendo

;Entramos en el segundo lazo donde decremento (1 ciclo) y salto (2 ciclos) ;que se suman a los ciclos del bucle anterior y a los 2 ciclos de recarga de la ;variable DELAY2 DECFSZ GOTO RETURN DELAY1,F lazo1 ; Final de la subrutina de espera

END

; Fin del programa fuente

Los puertos de E/S

SD48

EJERCICIO 12:
Realizar un programa en ensamblador basado en el ejemplo anterior que muestre los caracteres de tu nombre desplazndose por los displays de derecha a izquierda con un intervalo de 0.4 segundos.

Los puertos de E/S

SD49

3.- TECLADOS MATRICIALES


Un teclado matricial est compuesto por teclas (interruptores) interconectadas formando una matriz con una tecla en cada interseccin. Cuando se pulsa una tecla, se ponen en contacto elctrico la fila y la columna donde est dicha tecla. Las filas y columnas de esta matriz se pueden conectar a los terminales de uno o ms puertos paralelos.

Teclado matricial de 16 teclas (4 filas x 4 columnas)

Para explorar un teclado matricial se envan seales hacia las filas de la matriz por las lneas de exploracin y se recoge informacin por las columnas, que entonces constituyen las lneas de retorno. Bsicamente se parte de que si no hay ninguna tecla pulsada, todas las lneas de retorno estn en el nivel lgico 1'. Las lneas de exploracin son puestas (sucesiva o simultneamente) a 0'. Este valor lgico slo aparece en la lnea de retorno donde est la tecla pulsada, mientras que las restantes lneas de retorno mantienen el valor 1'. Con la informacin enviada hacia la matriz y la que retorna, se conforma un cdigo nico para cada tecla, llamado cdigo de exploracin. Para garantizar que las lneas de retorno permanezcan en '1' si no hay tecla pulsada, se conectan resistencias entre cada lnea de retorno y la tensin de alimentacin (VDD).

Los puertos de E/S

SD50

Teclado matricial de 16 teclas conectado al puerto B de un PIC LECTURA TECLADO


Si RB0 = 0
+5V

tecla 0 pulsada tecla 0 no pulsada

RB4 = 0 RB4 = 1

Si RB0 = 1 y
RB7

tecla 0 pulsada tecla 0 no pulsada

RB4 = 1 RB4 = 1

Resistencias Internas de Polarizacin (Pull-up)

RB6 RB5 RB4 FILAS C 4 8 3 4 2 0 1 1 2 3 COLUMNAS 4 1 2 3 5 6 7 D 9 E A F B

Valores de los terminales de salida segn la fila explorada Fila 1 Fila 2 Fila 3 Fila4 RB3 RB2 RB1 RB0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1

RB3 RB2

RB1
RB0

Se van explorando las teclas en el orden: 0123 4567 89AB CDEF

Los puertos de E/S

SD51

Organigrama EJERCICIO 13:


TECLADO

Implementar el cdigo en ensamblador del algoritmo de deteccin de tecla pulsada mostrado en el diagrama de flujo de la derecha.

Inicializa

Columna 1 = 0? NO Tecla = Tecla + 1 Columna 2 = 0? NO Tecla = Tecla + 1 Columna 3 = 0? NO Tecla = Tecla + 1 Columna 4 = 0? NO Tecla = Tecla + 1

Tecla = 0
Saca 0 fila 1

Se debern considerarn las conexiones con el microcontrolador mostradas en la transparencia anterior.

FINAL

ltima tecla?

NO C=1
Incrementar fila con RLF

Los puertos de E/S

SD52

4.2.- EL PUERTO PARALELO ESCLAVO


Algunos microcontroladores PIC tambin tienen un puerto paralelo adicional denominado Puerto Paralelo Esclavo (PSP: Parallel Slave Port). El PSP es un bus perifrico de 8 bits, con lneas para controlar la transferencia de datos entre el PIC y el perifrico. Cuando existe, el PSP comparte sus terminales con los puertos D y E. El PSP se puede utilizar para conectar el microcontrolador directamente al bus de datos y de control de un sistema basado en un microprocesador u otro microcontrolador, convirtiendo al PIC poseedor del PSP en un puerto de E/S de ese sistema.

El PSP cuenta con: 8 lneas de datos (PSP<0:7>) 3 lneas de control para lectura (RD#), escritura (WR#) de datos y seleccin (CS#) del PIC convertido en dispositivo perifrico.

Perifrico

Funcionamiento: Si el sistema exterior al PIC va a leer o escribir un dato en el PIC usando el PSP, debe mantener seleccionado el dispositivo con CS# = 0' durante la lectura o escritura del dato. Si CS# = '1', las lneas de datos permanecen en estado de alta impedancia. Durante la lectura, los terminales de datos se comportan como salidas; mientras que durante la escritura de un dato, se comportan como entradas.

Las lneas de datos del PSP se realizan sobre los terminales RD<0:7> y las de control utilizan los terminales RE<0:2>.

Los puertos de E/S

SD53

REGISTROS ASOCIADOS AL PSP


En el microcontrolador hay tres bits que informan del estado del PSP: los bits IBF y OBF del registro TRISE, y el bit PSPIF del registro PIR1.
Valores despus del reset por encendido (POR) o por cada de tensin (BOR) xxxx xxxx 1111 1111 RE2 RE1 RE0 ---- -xxx

Direccin
08h 88h 09h

Registro
PORTD TRISD PORTE

Bit 7
RD7
-

Bit 6
RD6 -

Bit 5
RD5 -

Bit 4
RD4 -

Bit 3
RD3 -

Bit 2
RD2

Bit 1
RD1

Bit 0
RD0

Registro de direcciones de datos del PORTD Registro de direcciones de datos del PORT CCP1IF CCP1IE TMR2IF TMR2IE TMR1IF TMR1IE

89h
0Ch 8Ch

TRISE
PIR1 PIE1

IBF

OBF IBOV PSPMODE


TXIF TXIE

SSPIF SSPIE

0000 -111
0000 0000 0000 0000

PSPIF ADIF RCIF PSPIE ADIE RCIE

El bit IBF (Input Buffer Full) se pone a '1' cuando el registro PORTD contiene un dato escrito en el PSP desde el exterior; IBF se pone a 0' automticamente cuando el programa lee el dato de entrada en PORTD. El bit OBF (Output Buffer Full) se pone a '1' cuando el programa escribe un dato en el registro PORTD, el cual debe salir por los terminales del PSP; OBF se pone a 0' cuando el registro PORTD es liberado del dato de salida debido a que el dispositivo externo realiz una lectura del PSP. El bit PSPIF (PSP Interrupt Flag) se pone a '1' cada vez que un dato es ledo o escrito desde el exterior; debe ser puesto a 0' por software una vez que el programa atienda la transferencia por el PSP. PSPIF = '1' genera una solicitud de interrupcin si la interrupcin del PSP est habilitada, lo cual ocurre si el bit PSPIE (PSP Interrupt Enable) del registro PIE1 es '1'. La atencin en el PIC de la entrada y salida de datos por el PSP puede ser programada o por interrupcin. La. E/S programada se realiza mediante la consulta de los bits PSPIF, IBF y OBF. En la E/S por interrupcin, el programa que atiende la interrupcin del PSP debe consultar los bits IBF y OBF para conocer el tipo de transferencia que tuvo lugar entre el PSP y el exterior, y as actuar en consecuencia.

Los puertos de E/S

SD54

4.2.1- EJEMPLO DE PUERTO PARALELO CONTROLADO POR SOFTWARE


CONEXIONES CON EL PIC16F877A Basado en el modelo HD44780 En total tiene 14 pines

El puerto D Controla el display:


Bus de Datos (4-bit): RD3-RD0 On/Off: RD7 Lineas de Control:
RD6: ENABLE RD5: RW RD4: RS

Tiene dos lneas de 16 caracteres cada una Todos los caracteres consisten en una matriz de puntos de 5x8 o 5x11

Los puertos de E/S

SD55

Funcin

N Pin

Nombre

Estado lgico

Descripcin

Tierra
Alimentacin Contraste Control de operacin

1
2 3 4

Vss
Vdd Vee RS

0 1 0 1 0 -> 1 1 -> 0

0V
+5V 0 Vdd D0 D7 son interpretados como comandos D0 D7 son interpretados como datos Escribir datos (desde el controlador hasta el LCD) Leer datos (desde el LCD hasta el controlador) Acceso a LCD deshabilitado Operacin normal Se transfieren datos/comandos al LCD Bit 0 LSB Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 MSB

R/W

Datos/comandos

7 8 9 10 11 12 13 14

D0 D1 D2 D3 D4 D5 D6 D7

0/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1

Los puertos de E/S

SD56

FUNCIONAMIENTO DE LA PANTALLA LCD MEMORIA LCD

El display LCD contiene tres bloques de memoria:


DDRAM Display Data RAM

CGRAM Character Generator RAM CGROM Character Generator ROM

Los puertos de E/S

SD57

CGROM
(mapa por defecto)

Los puertos de E/S

SD58

MANEJO DE LA PANTALLA LCD

Librera p16lcd.asm
LCDinit Inicializar la pantalla LCD en modo 4 bits/dos lneas de caracteres 5x7. (necesario ejecutar esta funcin al comienzo y solo al comienzo del programa) LCDLine_1 Activa la escritura en la lnea 1 de la pantalla LCD LCDLine_2 Activa la escritura en la lnea 2 de la pantalla LCD d_write Escribe en la pantalla LCD el dgito ASCII cuyo cdigo se encuentra almacenado en la variable temp_wr. i_write Escribe la instruccin almacenada en la variable temp_wr

Nota: Para la utilizacin en el programa principal tanto de funciones como de variables de otras libreras se debern de declarar al inicio del programa con la directiva EXTERN. As mismo, estas variables o funciones debern de estar declaradas como GLOBAL en las libreras donde se encuentre.

Los puertos de E/S


Hay dos modos de sincronizar el envo de caracteres al LCD: Usando retardos o Monitorizando el Flag de Busy

SD59

INICIALIZACIN LCDInit

;configure control lines banksel TRISD clrf TRISD banksel PORTD bsf PORTD,7 ; Turn on LCD call Delay40ms
;#1 Send control sequence movlw b'00110000 movwf temp_wr bcf STATUS,C call LCDWriteNibble call Delay5ms ;#Function Set movlw b'00110000 movwf temp_wr bcf STATUS,C call LCDWriteNibble call Delay1ms movlw b10000000 movwf temp_wr bcf STATUS,C call LCDWriteNibble call Delay1ms .

Los puertos de E/S

SD60

Borrar display

Retorno a origen

Control de encendido y apagado del display Desplazamiento del cursor o del display Configuracin Establecer direccin CGRAM Establecer direccin DDRAM Lectura del flag busy y del contador de direccin

Borra el display y establece la direccin 0 de DDRAM en el contador de direcciones Establece la direccin 0 de DDRAM en el contador de direcciones. Pasa el display de desplazamiento a su posicin Original. Los contenidos de DDRAM se mantienen inalterados Establece la direccin de desplazamiento del cursor y especifica el tipo de desplazamiento del display. Estas operaciones se realizan durante la lectura y escritura de datos Establece el encendido o no del display (D) del cursor (C) y el parpadeo o no del carcter encima del cursor Mueve el cursor y desplaza el display sin cambiar los contenidos de DDRAM Establece la longitud de datos de la interfaz (DL), el nmero de lneas del display y el tipo de fuente de los caracteres Establece la direccin CGRAM. Los datos CGRAM se envan y reciben despus de esta orden Establece la direccin DDRAM. Los datos DDRAM se envan y reciben despus de esta orden Lee el busy flag (BF) indicando que se est realizando una operacin interna y lee el contador de direccin

Los puertos de E/S

SD61

Escritura de datos a CG o DDRAM Lectura de datos de CG o DDRAM


Incremento Decremento Acompaa al desplazamiento del display Desplazamiento del display Movimiento del cursor Desplazamiento a la derecha Desplazamiento a la izquierda 8 bits, DL = 0: 4 bits 2 lneas, N = 0: 1 lnea 5 x 10 puntos, F = 0: 5 x 8 puntos Operando internamente Se aceptan instrucciones

Escribe datos a DDRAM o CGRAM


Lee datos de DDRAM o CGRAM

La escritura en CG o DDRAM viene determinada por la especificacin previa de tipo de direccin CGRAM o DDRAM. Despus de una escritura, la direccin se incrementa o decrementa automtica en 1 de acuerdo con el modo de entrada (entry mode). El entry mode tambin determina el tipo de desplazamiento en el display

Los puertos de E/S

SD62

Borrar display

Retorno a origen

Control de encendido y apagado del display Desplazamiento del cursor o del display

Configuracin

Establecer direccin CGRAM

Los puertos de E/S

SD63

Comunicacin 4-bit

Registro de instrucciones (IR) Flag de bus ocupado (BF) y Escritura Contador de direccin (AC)

Registro de datos (DR) Lectura

Los puertos de E/S

SD64

EJEMPLO:
LIST INCLUDE __CONFIG ; VARIABLES EXTERN ORG GOTO ORG RETFIE ORG INICIO ; PROGRAMA PRINCIPAL Call LCDInit Call LCDLine_1 movlw A'H' movwf temp_wr call d_write movlw A'O' movwf temp_wr call d_write movlw A'L' movwf temp_wr call d_write movlw A'A' movwf temp_wr call d_write GOTO $ END p=16F877A ; Directiva para iniciar el tipo de PIC P16F877A.INC ; Definiciones de registros internos _XT_OSC & _WDT_OFF & _LVP_OFF temp_wr, LCDInit, d_write, LCDLine_1, LCDLine_2 0X00 INICIO 0x04 ; Siempre empieza en la direccin cero ; Saltamos al inicio del programa ; VECTOR INTERRUPCION (aqu viene el PIC cuando se produce una interrupcin) ; Retorna de la RAI. ; Declaracin de funciones y variables externas

0X05

;Funcin que inicializa los registros para utilizar la pantalla LCD. ;Funcin que activa la escritura en la lnea 1 de la pantalla LCD. ;Escribimos HOLA en la pantalla LCD ;enviando el cdigo ASCII de cada carcter. ;# ;# ;# ;# ;# ;# ;# ;# ;# ;#

Los puertos de E/S

SD65

EJERCICIO 14:
Escribir un programa que cuente las pulsaciones (0-9) del interruptor conectado a RB0 y muestre por la pantalla LCD el nmero de pulsaciones seguido de la palabra veces. El programa reiniciar la cuenta cuando se pulse RA4 mostrando la palabra PULSE RB0.
LIST INCLUDE p=16F877A P16F877A.INC ; Directiva para iniciar el tipo de PIC ; Definiciones de registros internos __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF ; VARIABLES EXTERN ORG GOTO ORG GOTO

temp_wr .. 0X00 INICIO 0x04 RAI

; Variables presentes en la librera externa

; Siempre empieza en la direccin cero ; Saltamos al inicio del programa ; VECTOR INTERRUPCION (aqu viene el PIC cuando se produce una interrupcin) ; La Rutina de Atencin a la interrupcin est en en RAI.

ORG
INICIO

0X05

; PROGRAMA PRINCIPAL ORG RAI ; RUTINA DE ATENCION A LA INTERRUPCIN END 0X1000

Los puertos de E/S

SD66

EJERCICIO 15:
Realizar un cronmetro MM:SS. Se inicia en 00:00. Cuando se pulse RA4, inicia/detiene la cuenta Cuando se pulse RB0 resetea el contador. Usar subrutinas para generar los retardos La cuenta se debe poder parar y resetear en cualquier momento

EJERCICIO 16:
Realizar un programa que muestre un carcter cambiante de 0 a F en el display: Cambia con una cadencia de 0.5 segundos El carcter ir desplazndose de izquierda a derecha en la segunda lnea de la pantalla LCD. Implementarlo utilizando temporizadores con interrupciones.

You might also like