Está en la página 1de 6

UNIVERSIDAD NACIONAL JOSE FAUSTINO SANCHEZ CARRION Ciclo Académico:

2023-1
FACULTAD DE INGENIERÍA SISTEMAS, INDUSTRIAL E INFORMATICA Fecha:
22/07/2023
ESCUELA DE INGENIERIA ELECTRONICA Duración: 01:55 hr

CURSO: MICROCONTROLADORES - COD. 303

TIPO DE PRUEBA: EXAMEN DE MODULO 3 MEJIA SERNA SAID NAYDER

PROFESOR DEL CURSO: ING. JOSE ESTRADA MONTES

Usando el microcontrolador PIC18F4550

1. ¿Presente un programa en XC-8 de un circuito que abra y cierre una cortina


de luz de led usando el puerto B(8 leds) con un tiempo de permanencia de
cada estado de 1 Segundo? 6 Ptos.

#include <xc.h>
#pragma config FOSC = HS // Oscilador externo con cristal de cuarzo

#pragma config PLLEN = ON // Habilitar PLL para multiplicar la frecuencia


del oscilador

#pragma config PCLKEN = ON // Habilitar Power-up Timer para USB

#pragma config WDTEN = OFF // Watchdog Timer deshabilitado (para este


ejemplo)
#define _XTAL_FREQ 20000000 // Frecuencia del oscilador (20MHz)

void main()

TRISB = 0x00; // Configurar el Puerto B como salida

LATB = 0x00; // Apagar todos los LEDs al inicio

while (1)
{

// Abrir la cortina de luz

LATB = 0xFF; // Encender todos los LEDs

__delay_ms(1); // Esperar 1 segundo (1000 milisegundos)

// Cerrar la cortina de luz

LATB = 0x00; // Apagar todos los LEDs

__delay_ms(1); // Esperar 1 segundo (1000 milisegundos)

2. ¿Presente el programa(código) en XC-8 de un contador como sigue:


0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 0, 1, 2, 3,……….
Usando Display a 7 segmentos cátodo común, con un tiempo de
permanencia del numero mostrado de 1.5 Seg. 6 Ptos.

#include <xc.h>
#define _XTAL_FREQ 8000000
const unsigned char hexSegments[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111, // 9
0b01110111, // A
0b01111100, // B
0b00111001, // C
0b01011110, // D
0b01111001, // E
0b01110001 // F
};
void displayDigit(unsigned char digit) {
PORTB = hexSegments[digit];
}

void delayOneAndHalfSeconds() {
__delay_ms(1500);
}

void main() {
TRISB = 0x00;
TRISC = 0x00;
unsigned char digit = 0;
while (1) {
displayDigit(digit);
digit++;
if (digit > 0x0F) {
digit = 0;
}

delayOneAndHalfSeconds();
}
}
3. ¿Por qué se usa el registro PORT y cuando se usa el registro LAT?

En el contexto de microcontroladores y programación en lenguaje ensamblado o


lenguajes de bajo nivel, los registros "PORT" y "LAT" son términos que a menudo se
asocian con la manipulación de pines de entrada/salida (I/O) en un microcontrolador.
Estos son registros comunes en microcontroladores de la familia PIC de Microchip y
se utilizan para interactuar con los pines GPIO (General Purpose Input/Output).
1. Registro PORT (Puerto de Entrada/Salida): El registro "PORT" es un registro
de sólo lectura que muestra el estado actual de los pines de entrada/salida.
Cuando se lee el registro "PORT", se obtiene el estado de los pines, es decir,
si un pin está en nivel alto (1) o en nivel bajo (0). Los pines configurados como
entrada mostrarán el estado del voltaje presente en el pin en ese momento,
mientras que los pines configurados como salida mostrarán el valor que se
haya escrito previamente en el registro "LAT".
2. Registro LAT (Latch, Retén o Puerto de Salida): El registro "LAT" es un
registro de lectura/escritura y se utiliza para escribir datos en los pines
configurados como salidas. Es importante entender que al escribir en el
registro "LAT", los cambios no se reflejan inmediatamente en los pines GPIO.
En cambio, los valores escritos se almacenan en una especie de "retén"
interno. Para que los cambios se hagan efectivos y se reflejen en los pines
físicos, se debe realizar una operación llamada "latencia" o "latch". Esto se
puede hacer mediante la escritura en el registro "LAT" o mediante ciertas
operaciones específicas del microcontrolador.
Entonces, para resumir:
• El registro "PORT" se utiliza cuando se desea leer el estado actual de los
pines (ya sean entradas o salidas) para realizar alguna acción en función de
esa información.
• El registro "LAT" se utiliza cuando se quiere escribir datos en los pines
configurados como salidas y, posteriormente, se debe realizar una latencia o
latch para que los cambios se hagan efectivos y se reflejen en los pines
físicos.
Es esencial tener en cuenta las diferencias entre ambos registros, ya que usar
incorrectamente el registro "LAT" podría llevar a una confusión o resultados
inesperados si se intenta leer desde él en lugar de escribir en él. Cada vez que se
trabaje con pines de E/S en un microcontrolador, se debe tener claro cuál es el
propósito de cada registro y cómo utilizarlos adecuadamente. 4 Ptos.
4. ¿Haga un circuito con un Display a 7 segmentos Anodo común que
muestre la letra U? 2 Ptos
#include <xc.h>

// Definir pines del puerto B para los segmentos del display


#define SEGMENT_A_PIN RB0
#define SEGMENT_B_PIN RB1
#define SEGMENT_C_PIN RB2
#define SEGMENT_D_PIN RB3
#define SEGMENT_E_PIN RB4
#define SEGMENT_F_PIN RB5
#define SEGMENT_G_PIN RB6

// Función para mostrar la letra "U"


void display_U() {
// Configurar pines como salidas
TRISB = 0x00;

// Apagar todos los segmentos (Anodo común)


SEGMENT_A_PIN = 1;
SEGMENT_B_PIN = 1;
SEGMENT_C_PIN = 1;
SEGMENT_D_PIN = 1;
SEGMENT_E_PIN = 1;
SEGMENT_F_PIN = 1;
SEGMENT_G_PIN = 1;

// Mostrar la letra "U" en el display


SEGMENT_A_PIN = 0; // Encender segmento A
SEGMENT_B_PIN = 0; // Encender segmento B
SEGMENT_C_PIN = 1; // Apagar segmento C
SEGMENT_D_PIN = 0; // Encender segmento D
SEGMENT_E_PIN = 0; // Encender segmento E
SEGMENT_F_PIN = 0; // Encender segmento F
SEGMENT_G_PIN = 1; // Apagar segmento G
}

void main() {
display_U(); // Llamar a la función para mostrar la letra "U"

while (1) {
// El programa podría seguir con otras operaciones aquí si es necesario
}
}
5. ¿Indique que es una tabla LOOKUP 2 Ptos

Una tabla "LOOKUP" (también conocida como tabla de búsqueda o tabla de consulta) es
una estructura de datos que se utiliza en programación para almacenar y recuperar datos de
manera eficiente. Consiste en una lista organizada de valores, donde cada valor se
encuentra asociado a un índice o clave específica.
La idea principal detrás de una tabla LOOKUP es que, en lugar de calcular o determinar un
valor en tiempo de ejecución, podemos simplemente buscar el valor precalculado en la tabla
utilizando el índice o clave apropiado. Esto permite ahorrar tiempo y recursos
computacionales, especialmente cuando se deben realizar cálculos complejos o repetitivos.
Ejemplo:
Supongamos que necesitamos calcular el seno de varios ángulos en un programa. En lugar
de realizar el cálculo matemático del seno cada vez que necesitemos el valor para un ángulo
específico, podemos crear una tabla LOOKUP que almacene los valores precalculados de
los senos para ciertos ángulos. La tabla podría tener la siguiente estructura:

Cuando necesitemos obtener el seno de un ángulo específico, simplemente buscamos el


ángulo en la tabla utilizando su índice y obtenemos el valor del seno correspondiente. Esto
es mucho más rápido que calcular el seno matemáticamente cada vez.

Es importante destacar que las tablas LOOKUP son más útiles cuando los valores que
buscamos no cambian con frecuencia, ya que si los datos cambian constantemente, la tabla
deberá actualizarse de manera constante para reflejar los nuevos valores. Además, las
tablas LOOKUP suelen ocupar memoria, por lo que es esencial encontrar un equilibrio entre
el ahorro de tiempo de cálculo y el uso de recursos de memoria.

ING. JOSE ESTRADA MONTES

También podría gustarte