Professional Documents
Culture Documents
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.
EI-3
(8 bits)
1. Emisor informa que enva dato 2. Receptor informa de dato recibido 3. Receptor dice al emisor que enve el siguiente dato
TCNICAS DE ENTRADA/SALIDA
E/S por programa E/S por interrupcin
SD4
BDIR-INST 13 Bus de datos BDAT PORTA
7 0
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
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
3 Mux
PORTD 8 ALU
OSC1/CLKIN OSC2/CLKOUT
Interrupciones
(Internas)
INT
(Externa)
Timer0
Timer1
Timer2
Comparador
Mdulos CCP1,2
USART
Referencia de voltaje
EI-5
TRIS<x> = 1 programa la lnea <x> del puerto como entrada. TRIS<x>= 0 programa la lnea <x> del puerto como salida.
EI-6
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
Control 1 0
Dato x 0 1
G1 1 1 0
G2 0 1 0
Terminal de E/S Entrada: alta impedancia Salida: VSS (0) Salida: VDD (1)
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.
SD8
Vdd
Corriente de salida si bi = 0
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.
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)
SD11
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
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
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)
SD14
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
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
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
SD18
Bit 6 -
Bit 5 RA5 -
Bit 4 RA4 -
Valores despus del reset por encendido (POR) o por cada de tensin (BOR) --0x 0000 --11 1111 0--- 0000
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.
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
SD20
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.
OPTION_REG RBPU# INTEDG T0CS T0SE INTCON GIE PEIE TOIE INTE
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.)
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
Bit 7 RC7
Bit 6 RC6
Bit 5 RC5
Bit 4 RC4
Bit 3 RC3
Bit 2 RC2
Bit 1 RC1
PIC16F877A
SD23
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).
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.
Bit 7 RD7
Bit 6 RD6
Bit 5 RD5
Bit 4 RD4
Bit 3 RD3
Bit 2 RD2
Bit 1 RD1
PIC16F877A
SD25
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
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
ADCON1 ADFM
SD27
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
SD28
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.
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.
SD30
2.- INTERRUPTORES
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
Solucin hardware/software
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
NO
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
SD33
INICIO
ESPERA
ENCENDER SOLTAR
SD34
EJERCICIO 5:
Implementar una solucin software en ensamblador para el ejemplo anterior que tenga en cuenta el problema de los rebotes.
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
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.
SD37
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).
SD38
EJEMPLO 2:
Vamos a realizar un programa que muestre el dgito A en el display de 7 segmentos
220 BUFFER INVERSOR 74LS540 PD7
PortD
PD0
PIC16F877A
TDSR 5160
47 PortA PA0
CC BC548
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
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
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.
SD42
SD43
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.
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
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
PIC16F877A
TDSR 5160
CC T3 BC548
CC T2 BC548
CC T1 BC548
T4 BC548
PA4 PB0
P1
P2
SD45
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
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
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.
SD49
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).
SD50
RB4 = 0 RB4 = 1
Si RB0 = 1 y
RB7
RB4 = 1 RB4 = 1
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
SD51
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
FINAL
ltima tecla?
NO C=1
Incrementar fila con RLF
SD52
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>.
SD53
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
SSPIF SSPIE
0000 -111
0000 0000 0000 0000
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.
SD54
Tiene dos lneas de 16 caracteres cada una Todos los caracteres consisten en una matriz de puntos de 5x8 o 5x11
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
SD56
SD57
CGROM
(mapa por defecto)
SD58
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.
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 .
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
SD61
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
SD62
Borrar display
Retorno a origen
Control de encendido y apagado del display Desplazamiento del cursor o del display
Configuracin
SD63
Comunicacin 4-bit
Registro de instrucciones (IR) Flag de bus ocupado (BF) y Escritura Contador de direccin (AC)
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. ;# ;# ;# ;# ;# ;# ;# ;# ;# ;#
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
; 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
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.