GPIO - TRIS, PORT y LAT
Esta pagina profundiza como usar TRIS, PORT y LAT juntos en codigo real y en las practicas UNEXPO. Profundiza lo que practicaste en la guia de puertos y el Primer LED — van antes en el menu y en la ruta de estudio.
Que es GPIO en el PIC18
Sección titulada «Que es GPIO en el PIC18»GPIO (General Purpose Input/Output) son pines que tu programa configura como entrada o salida digital. En el PIC18F4550 no controlas cada pin aislado con un cable distinto al CPU: controlas puertos — grupos de 8 pines (A, B, C, D, E) accesibles con tres SFR por puerto.
Paso 1 — Pin fisico ↔ bit del registro
Sección titulada «Paso 1 — Pin fisico ↔ bit del registro»Cada pin tiene un nombre fijo del hardware:
| Pin | Puerto | Bit en TRISx / LATx / PORTx |
|---|---|---|
| RB0 | B | bit 0 |
| RB3 | B | bit 3 |
| RD7 | D | bit 7 |
Regla del curso: bit 0 = pin con numero 0. BCF TRISB, 0 afecta solo RB0; los bits 1–7 de TRISB no cambian (Arquitectura — SFR).
Paso 2 — Tres registros, tres roles
Sección titulada «Paso 2 — Tres registros, tres roles»| Registro | Escribes? | Para que sirve |
|---|---|---|
TRISx | Si | Direccion del pin: 1 = entrada, 0 = salida |
LATx | Si | Valor de salida en el latch interno |
PORTx | Lectura | Nivel real en el pin (entradas, switches) |
No intercambies roles: TRIS primero, luego LAT para salidas o PORT para leer entradas.
Paso 3 — Flujo tipico en un programa
Sección titulada «Paso 3 — Flujo tipico en un programa» Inicio / init_gpio ↓ TRISx — define entradas y salidas ↓ LATx — estado inicial de salidas (LED apagado, etc.) bucle principal ↓ PORTx — lee switches / botones ↓ LATx — actualiza LEDs / actuadores ↓ GOTO bucleEn estilo sandwich, init_gpio suele ir como subrutina arriba; el programa: llama CALL init_gpio y entra al bucle.
Paso 4 — Donde encaja con config bits
Sección titulada «Paso 4 — Donde encaja con config bits»Los config bits (PBADEN = OFF, LVP = OFF…) preparan el hardware al encender. Los registros GPIO (TRISB, LATB…) lo configuras mientras corre tu codigo. Si el LED no responde, revisa ambas capas: cristal/FOSC y BCF TRISB, 0.
Registros por puerto — TRIS, PORT y LAT
Sección titulada «Registros por puerto — TRIS, PORT y LAT»| Puerto | Pines | TRIS | PORT | LAT | Notas del curso |
|---|---|---|---|---|---|
| A | RA0–RA5 | TRISA | PORTA | LATA | RA4 no es analogico; varios pines pueden ser ANx |
| B | RB0–RB7 | TRISB | PORTB | LATB | RB0 = INT0; RB4–RB7 = interrupcion por cambio |
| C | RC0–RC7 | TRISC | PORTC | LATC | RC6/RC7 = UART (TX/RX) |
| D | RD0–RD7 | TRISD | PORTD | LATD | LCD en practicas |
| E | RE0–RE2 | TRISE | PORTE | LATE | Entradas analogicas RE0–RE2 |
Los tres registros comparten numeracion de bits: el bit 3 de TRISB, PORTB y LATB siempre es el pin RB3.
Paso 1 — Configurar direccion con TRIS
Sección titulada «Paso 1 — Configurar direccion con TRIS»Antes de leer o escribir, declara cada pin como entrada o salida.
Un pin a la vez (recomendado al aprender):
BCF TRISB, 0 ; RB0 → salida (bit = 0) BSF TRISB, 3 ; RB3 → entrada (bit = 1)Todo el puerto de una vez (Practica 1 — PORTB y PORTD como entradas):
MOVLW B'11111111' ; todos los bits = 1 → todo entrada MOVWF TRISB MOVWF TRISDEn TRISx, 1 = entrada y 0 = salida. Si TRISB = 0xFF, todo PORTB es entrada — pregunta clasica de parcial.
Mas ejercicios en la guia Configurar direccion con TRIS.
Paso 2 — Escribir salidas con LAT
Sección titulada «Paso 2 — Escribir salidas con LAT»Para controlar un LED, rele o linea digital, escribe en LATx, no en PORTx:
CLRF LATB ; apaga todas las salidas de PORTB BCF TRISB, 0 ; RB0 salida BSF LATB, 0 ; RB0 alto → LED ON BCF LATB, 0 ; RB0 bajo → LED OFFBSF/BCF sobre LATB solo tocan un bit — util cuando mezclas entradas y salidas en el mismo puerto (Bits y hex — mascaras).
Guia practica: Escribir salidas con LAT y Tutorial Primer LED.
Paso 3 — Leer entradas con PORT
Sección titulada «Paso 3 — Leer entradas con PORT»Para switches, botones o sensores digitales, lee PORTx:
BSF TRISB, 3 ; RB3 entrada BTFSS PORTB, 3 ; salta si RB3 = 1 (suelto, con pull-up) GOTO boton_presionado ; salto → destino boton_presionado: ; RB3 = 1 — boton no presionado ... GOTO fin_lecturaboton_presionado: ; RB3 = 0 — boton presionado ...fin_lectura:BTFSS PORTB, n / BTFSC PORTB, n son la forma mas comun en el curso. Tambien puedes MOVF PORTB, W y enmascarar el bit (Bits y hex).
Guia practica: Leer entradas con PORT.
Paso 4 — PORT vs LAT — diferencia clave
Sección titulada «Paso 4 — PORT vs LAT — diferencia clave»| Accion | Registro correcto | Error tipico |
|---|---|---|
| Encender LED en RB0 | BSF LATB, 0 | BSF PORTB, 0 |
| Leer pulsador en RB3 | BTFSS PORTB, 3 | BTFSS LATB, 3 |
| Apagar todo PORTC | CLRF LATC | CLRF PORTC |
En salidas puras, escribir en PORTx a veces “funciona” porque comparte hardware con el latch, pero en el curso y en el datasheet la practica correcta es LATx para escribir y PORTx para leer.
Configurar varios pines a la vez
Sección titulada «Configurar varios pines a la vez»Quieres RB0–RB3 como salidas y RB4–RB7 como entradas:
MOVLW B'11110000' ; bits 7..4 = 1 (entrada), 3..0 = 0 (salida) MOVWF TRISBEquivalente pin a pin:
BCF TRISB, 0 BCF TRISB, 1 BCF TRISB, 2 BCF TRISB, 3 BSF TRISB, 4 BSF TRISB, 5 BSF TRISB, 6 BSF TRISB, 7En TRIS, diseña la mascara invertida respecto a lo que quieres como salida: salida = 0, entrada = 1.
Pines analogicos y GPIO digital
Sección titulada «Pines analogicos y GPIO digital»Varios pines de PORTA/PORTB arrancan como entradas analogicas si PBADEN = ON en los config bits. Para GPIO digital del curso usa PBADEN = OFF en el bloque CONFIG (Config bits — PBADEN).
Si necesitas mezclar ADC y digital en la misma practica, configura ADCON1 para declarar que pines son analogicos y cuales digitales — si no, PORTx puede leer valores incoherentes aunque TRISx este bien.
Recorrido completo — LED en RB0
Sección titulada «Recorrido completo — LED en RB0»Fragmento minimo enlazado con Ensamblador — ejemplo LED:
LIST P=18F4550 #include <P18F4550.INC> CONFIG FOSC = HS, WDT = OFF, LVP = OFF, PBADEN = OFF
ORG 0x0000 GOTO programa ; salto al main
init_gpio: CLRF LATB BCF TRISB, 0 ; RB0 salida RETURN
programa: CALL init_gpioloop: BSF LATB, 0 ; LED ON GOTO loop ; salto → destino loop: (arriba)
ENDFlujo: config bits (hardware al encender) → TRIS (direccion) → LAT (estado de salida) → simular en Proteus con el .HEX de MPLAB.
Errores comunes
Sección titulada «Errores comunes»| Error | Sintoma | Solucion |
|---|---|---|
Escribir en PORTx en vez de LATx | Salida erratica o lectura rara | Usa BSF/BCF/CLRF sobre LATx |
No configurar TRISx | Pin no responde como esperas | Siempre TRIS antes de LAT/PORT |
PBADEN = ON sin ADCON1 | GPIO digital “muerto” en RA/RB | PBADEN = OFF o configura ADCON1 |
| LED sin resistencia | Pin sobrecargado | 220 Ω o 330 Ω en serie |
| Mezclar bit y pin | “Configure bit 3 pero miro RB0” | Bit n = pin Rn del mismo puerto |
Practica 1 UNEXPO — como encajan los puertos
Sección titulada «Practica 1 UNEXPO — como encajan los puertos»Practica · Laboratorio
Practica 1 UNEXPO
PORTB y PORTD como entradas (operandos en switches). PORTC y PORTE como salidas (LEDs de resultado). RA0 como pulsador para cambiar operacion. Implementa suma, resta, multiplicacion, OR, AND, XOR, complemento, rotacion y division por software. Antes del lab, repasa la guia ALU si usaras la ALU del PIC.
Siguiente paso — botones
Sección titulada «Siguiente paso — botones»Cuando un pin es entrada con pulsador, necesitas pull-up y antirrebote. Eso es la leccion Botones, pull-up y antirrebote.
Preguntas estilo parcial
Sección titulada «Preguntas estilo parcial»¿Que significa TRISB = 0xFF?
Todo PORTB configurado como entrada (cada bit de TRIS en 1).
¿Por que escribes el LED en LATB y lees el boton en PORTB?
LATB controla la salida deseada del latch; PORTB refleja el nivel real en el pin — necesario para entradas con pull-up o cableado externo.
¿Que problema causa olvidar BCF TRISB, 0 antes de BSF LATB, 0?
RB0 puede seguir como entrada; el latch cambia pero el pin no conduce correctamente hacia el LED.
Ejercicio · Parcial
Traza el flujo
En Proteus, cambia BSF LATB, 0 por BSF PORTB, 0 con RB0 como salida. ¿El LED se comporta igual? Anota por que el curso prefiere LATB.
GPIO y puertos
Basado en: Clase Tema 2 y 3 (1).pdf
0 de 0 respondidas
Inicia sesion en CALETAS para sincronizar este resultado entre dispositivos.
Iniciar sesion en CALETAS