Partes y funciones principales en la interfaz del PIC SimLab:
1. LCD (Pantalla de cristal líquido):
○ Uso: Sirve para mostrar texto o información como datos de sensores,
mensajes de error, etc.
○ Programación: Usar librerías de control para LCD (como las de
controladores HD44780 en C o ensamblador).
○ Consideraciones: Configurar los pines de conexión en el código para que
coincidan con la simulación.
2. Heater (Calentador) y Cooler (Refrigerador):
○ Uso: Simulan dispositivos para controlar temperatura, en conjunto con el
sensor LM35.
○ Programación: Encender o apagar a través de salidas digitales. Por
ejemplo, usar bits específicos de PORTB o PORTD.
○ Importante: Asegúrate de leer la temperatura antes de activar/desactivar.
3. Sensor LM35 (Temperatura):
○ Uso: Simula un sensor de temperatura que proporciona lecturas analógicas.
○ Programación: Capturar valores desde los pines analógicos (ej., AN0 o
AN1). Necesitarás usar el módulo ADC (Convertidor Analógico-Digital) del
PIC.
○ Consideraciones: Configurar el rango de voltaje del ADC para interpretar
correctamente las temperaturas.
4. Displays de 7 segmentos (DISP1-DISP4):
○ Uso: Para mostrar números o valores (como temperatura).
○ Programación: Controlar encendiendo segmentos específicos con los pines
de salida del PIC.
○ Nota: Normalmente, los displays necesitan un mapeo para mostrar números
específicos.
5. Teclado matricial (Keypad):
○ Uso: Entrada de datos como números o comandos.
○ Programación: Leer estados de los pines (filas y columnas) para identificar
teclas presionadas.
○ Tip: Implementar un debouncing (filtro para evitar múltiples lecturas de un
mismo botón).
6. Buzzer:
○ Uso: Emite sonidos para alertas o notificaciones.
○ Programación: Activar/desactivar usando pines digitales de salida. Enviar
señales PWM para tonos variables.
○ Consideraciones: Usar temporizadores para controlar la duración del
sonido.
7. Puertos digitales (PORTA, PORTB, etc.):
○ Uso: Conexión de entradas/salidas digitales.
○ Programación: Configurar como entrada o salida (TRISA, TRISB).
Leer/escribir valores según necesidad.
8. EEPROM:
○ Uso: Almacenar datos que deben persistir tras reinicios, como
configuraciones.
○ Programación: Usar las instrucciones de lectura/escritura para acceder a la
memoria EEPROM interna.
9. RTC (Reloj de tiempo real):
○ Uso: Mantener un registro de hora y fecha.
○ Programación: Interactuar con los registros del RTC o a través de librerías.
10.Ventilador (COOLER):
○ Uso: Simula un dispositivo activado según la temperatura.
○ Programación: Similar al Heater.
11.Poteniómetros (P1 y P2):
○ Uso: Proveen valores analógicos para pruebas.
○ Programación: Leer mediante el ADC.
12.Interruptores DIP (RB0-RB7):
○ Uso: Simulan entradas manuales.
○ Programación: Leer el estado directamente desde los pines.
13.LEDs:
○ Uso: Representan salidas digitales para señales visuales.
○ Programación: Encender/apagar controlando pines digitales.
Pasos para programar en PIC Simulator IDE:
1. Selecciona el microcontrolador en el menú "Microcontroller" y define la frecuencia
del reloj (ej., 8 MHz).
2. Escribe el código en ensamblador o C:
○ Configura los registros de los módulos (TRIS, ADCON, TMR, etc.).
○ Implementa la lógica deseada.
3. Carga el archivo HEX generado por tu compilador en "Microcontroller > Load HEX".
4. Ejecuta la simulación y observa los resultados en los periféricos conectados.
1. Puertos (PORTA, PORTB, PORTC, etc.)
Los puertos son las conexiones físicas entre el microcontrolador y el mundo externo. Cada
puerto está compuesto por varios pines (bits) que se pueden configurar como entrada o
salida.
Funcionamiento básico:
● PORT: Representa el valor actual de los pines del puerto. Puedes leer o escribir
directamente en este registro.
● TRIS: Controla la dirección de cada pin del puerto. Se configura como:
○ 0: El pin es una salida (el PIC envía datos al dispositivo conectado).
○ 1: El pin es una entrada (el PIC lee datos desde el dispositivo conectado).
Por ejemplo:
● TRISA = 0b00001111; → Configura los 4 pines más bajos de PORTA como
entradas y los 4 más altos como salidas.
● PORTA = 0b10100000; → Establece salidas altas (5V) en los pines configurados
como salida del puerto A.
2. Registro TRIS (Configura entrada/salida)
Cada pin del microcontrolador se configura individualmente con este registro:
● 0: Salida → El PIC controla el voltaje del pin.
● 1: Entrada → El PIC lee el estado del pin.
Cada puerto tiene su propio registro TRIS:
● TRISA: Configura los pines del puerto A.
● TRISB: Configura los pines del puerto B.
● Y así sucesivamente.
Consideraciones:
● Pins compartidos con módulos: Algunos pines tienen funciones adicionales, como
ADC, PWM o UART. Al activar estos módulos, la configuración del TRIS puede
cambiar automáticamente.
● Entradas flotantes: Los pines configurados como entrada sin un voltaje definido
pueden fluctuar. Usa resistencias pull-up o pull-down para estabilizarlos.
3. Displays de 7 segmentos
Un display de 7 segmentos tiene 7 LEDs (segmentos) más un punto decimal, que forman
los números del 0 al 9 (o letras, si lo deseas). Se pueden controlar directamente con los
pines del microcontrolador.
Tipos de displays:
● Ánodo común: Todos los ánodos (+) están conectados juntos. Se encienden los
segmentos enviando un nivel bajo (0V).
● Cátodo común: Todos los cátodos (-) están conectados juntos. Se encienden los
segmentos enviando un nivel alto (5V).
Conexión típica:
Cada segmento se conecta a un pin del microcontrolador. Por ejemplo:
● RA0 → Segmento "a".
● RA1 → Segmento "b".
● Y así sucesivamente.
Multiplexado para múltiples displays:
Si tienes varios displays, puedes usar multiplexado para ahorrar pines:
1. Conecta todos los segmentos juntos, pero usa un pin para habilitar cada display
individualmente.
2. Activa un display a la vez, y actualiza rápidamente los valores para simular que
todos están encendidos.
Cosas importantes al trabajar con puertos y displays:
1. Cuidado con las corrientes: No sobrecargues los pines del microcontrolador. Usa
resistencias en los LEDs y transistores para controlar varios displays.
2. Mapeo correcto: Conoce cómo se conectan los pines del display a los del
microcontrolador.
3. Debouncing en botones: Usa retardos o software para evitar múltiples lecturas
erróneas de un botón.
4. Multiplexado: Si controlas múltiples displays, usa temporizadores para evitar
parpadeos visibles.
Por qué es correcto el uso de PORTB = %xxxxxxx en tu caso
En tu código original, el objetivo es detectar qué botón (de RB0 a RB5) está presionado,
asegurándote de que:
1. Solo haya un botón presionado a la vez.
2. El estado de los demás bits sea conocido y esperado.
Por ejemplo:
● Cuando PORTB = %00111110, sabes que RB0 está en 0 (pulsado) y que
RB1-RB5 están en 1 (sin pulsar).
● Cuando PORTB = %00111101, sabes que RB1 está en 0 (pulsado) y que el resto
están en 1, etc.
Esto es crucial porque:
● Si utilizas solo PORTB.x = 0, el programa no garantiza que los demás bits estén en
el estado correcto, y podría provocar comportamiento indeseado si otros bits
cambian por ruido o interferencias.
Ventajas de usar PORTB = %xxxxxxx en este caso
1. Control total del puerto:
○ El programa asegura que todo el puerto tiene el estado esperado antes de
encender el LED correspondiente.
2. Evita conflictos:
○ Solo un LED se encenderá si todo el puerto cumple con la condición
exacta.
3. Facilita la depuración:
○ El estado del puerto es fácilmente verificable y predecible.
Para hacer que parpadee algo:
#define CONFIG = 0x3f71 ' Configuración para el PIC16F877A
All_Digital ' Configura todos los pines como digitales
TRISB = %00111111 ' Configura RB0-RB5 como entradas
TRISD = 0 ' Configura RD0-RD7 como salidas
main:
' Si no hay pulsadores presionados (todos en 1)
If PORTB = %00111111 Then
' Parpadeo de RD7: apaga y enciende con un retardo
PORTD = %10000000 ' Enciende el LED RD7 (inactividad)
'VARIANTE 1, QUE PARPADEE EL 7 SI NO SE ESTA PULSANDO NADA
'DUDA¿Como puedo usar el Toggle aqui?
WaitMs 500 ' Espera 500 ms
PORTD = %00000000 ' Apaga el LED RD7
WaitMs 500 ' Espera 500 ms
Endif
' Si RB0 está presionado
If PORTB = %00111110 Then
PORTD = %00000001 ' Enciende RD0
Endif
' Si RB1 está presionado
If PORTB = %00111101 Then
PORTD = %00000010 ' Enciende RD1
Endif
' Si RB2 está presionado
If PORTB = %00111011 Then
PORTD = %00000100 ' Enciende RD2
Endif
' Si RB3 está presionado
If PORTB = %00110111 Then
PORTD = %00001000 ' Enciende RD3
Endif
' Si RB4 está presionado
If PORTB = %00101111 Then
PORTD = %00010000 ' Enciende RD4
Endif
' Si RB5 está presionado
If PORTB = %00011111 Then
PORTD = %00100000 ' Enciende RD5
Endif
Goto main ' Vuelve al inicio del bucle