Computing">
Entradas y Salidas Digitales
Entradas y Salidas Digitales
Entradas y Salidas Digitales
VICERRECTORADO ACADÉMICO
DECANATO DE DOCENCIA
DEPARTAMENTO DE INGENIERIA ELECTRÓNICA
UNIDAD 2
Entradas y Salidas Digitales
Figura 13: Puertos de Entrada y Salida del PIC18F4550 (Fuente: Hoja de Datos)
Existen tres directivas que permiten gestionar los puertos. En la tabla 4 se hace una
explicación de una de ellas. Por otro lado en la tabla 5 se explican las funciones
predefinidas que permiten ejercer control sobre estas líneas de entrada y salida digital.
#use standard_io(puertos) .
#use standard_io(puertos) .
)
#USE STANDARD_IO
Cada vez que se emplean las instrucciones de lectura y escritura, esta
directiva define como entradas o salidas a los puertos. El argumento
puertos se refiere a una lista de letras que identifican a cada puerto,
separadas por comas.
Función Descripción
Función Descripción
Ejemplo 1:
Escribir un programa para que un microcontrolador PIC active una cantidad de leds
conectados al puerto B, según el valor colocado en los 3 pines menos significativos del
puerto A. Es decir, si el valor leído es 101b=5d, se encenderán los 5 leds menos
significativos del puerto B.
#include <18F4550.h>
#use standard_io(A,B) //Directivas
Un periférico interesante son los motores DC. Como se recordará estos motores
giran en un sentido si sus polos se alimentan de una forma y en el otro sentido si se invierte
la polaridad de la alimentación. Se podría pensar que se puede controlar directamente un
motor de 5V con un PIC y colocando un alto en uno de sus polos y un bajo en el otro, se
podría hacerlo girar en sentido horario o antihorario. Sin embargo, el PIC, no produce la
suficiente corriente por sus pines para arrancar un motor DC, por lo que es necesario
emplear un circuito de adaptación. El circuito de adaptación más empleado es el driver
L293. (Anexo 1)
#include <18F4550.h>
#use standard_io(A,C)
void leer_y_activar()
{
if(input(PIN_A0)==1)
{
output_low(PIN_D0);
output_low(PIN_D3);
}
else
{
output_high(PIN_D0);
output_high(PIN_D3);
}
if(input(PIN_B0)==1)
{
output_high(PIN_C4);
output_low(PIN_C7);
}
else
{
output_high(PIN_C7);
output_low(PIN_C4);
}
if(input(PIN_B7)==1)
{
output_high(PIN_E0);
output_low(PIN_D6);
}
else
{
output_high(PIN_D6);
output_low(PIN_E0);
}
return;
}
void main()
{
setup_adc_ports(NO_ANALOGS);//todos los puertos digitales
while(1)
{
leer_y_activar();
}
return;
}
Retardos
Ejemplo 3:
Genere por el pin RC3 una señal onda cuadrada de 9 ms con tiempo en alto (TH) y tiempo
en bajo (TL) dependiendo del valor colocado en RA1 y RA0:
RA1 RA0 TH TL
0 0 1 ms 8 ms
0 1 2 ms 7 ms
1 0 3 ms 6 ms
1 1 4 ms 5 ms
#include <18F4550.h>
#use standard_io(A,C)
#use delay (clock=16000000) // Reloj de 16 MHz
void leer_y_generar()
{
if(input(PIN_A1)==0 && input(PIN_A0)==0) generar(1,8);
if(input(PIN_A1)==0 && input(PIN_A0)==1) generar(2,7);
if(input(PIN_A1)==1 && input(PIN_A0)==0) generar(3,6);
if(input(PIN_A1)==1 && input(PIN_A0)==1) generar(4,5);
return;
}
void main()
{
setup_adc_ports(NO_ANALOGS);
while(1)
{
leer_y_generar();
}
return;
}
Anexo 1: Driver L293D
Descripción
EN IN OUT
H H H
H L L
L H Z
L L Z
Fuente: Hoja de Datos del L293B