Ir al contenido

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.

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.

Cada pin tiene un nombre fijo del hardware:

PinPuertoBit en TRISx / LATx / PORTx
RB0Bbit 0
RB3Bbit 3
RD7Dbit 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).

RegistroEscribes?Para que sirve
TRISxSiDireccion del pin: 1 = entrada, 0 = salida
LATxSiValor de salida en el latch interno
PORTxLecturaNivel real en el pin (entradas, switches)

No intercambies roles: TRIS primero, luego LAT para salidas o PORT para leer entradas.

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 bucle

En estilo sandwich, init_gpio suele ir como subrutina arriba; el programa: llama CALL init_gpio y entra al bucle.

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.

Circuito de LED conectado a RB0 con resistencia limitadora
Salida digital: TRISB,0 = 0 (salida) y LATB,0 = 1 encienden el LED en RB0. — Practica LED — UNEXPO
PuertoPinesTRISPORTLATNotas del curso
ARA0–RA5TRISAPORTALATARA4 no es analogico; varios pines pueden ser ANx
BRB0–RB7TRISBPORTBLATBRB0 = INT0; RB4–RB7 = interrupcion por cambio
CRC0–RC7TRISCPORTCLATCRC6/RC7 = UART (TX/RX)
DRD0–RD7TRISDPORTDLATDLCD en practicas
ERE0–RE2TRISEPORTELATEEntradas analogicas RE0–RE2

Los tres registros comparten numeracion de bits: el bit 3 de TRISB, PORTB y LATB siempre es el pin RB3.

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 TRISD

En 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.

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 OFF

BSF/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.

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_lectura
boton_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.

AccionRegistro correctoError tipico
Encender LED en RB0BSF LATB, 0BSF PORTB, 0
Leer pulsador en RB3BTFSS PORTB, 3BTFSS LATB, 3
Apagar todo PORTCCLRF LATCCLRF 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.

Quieres RB0–RB3 como salidas y RB4–RB7 como entradas:

MOVLW B'11110000' ; bits 7..4 = 1 (entrada), 3..0 = 0 (salida)
MOVWF TRISB

Equivalente 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, 7

En TRIS, diseña la mascara invertida respecto a lo que quieres como salida: salida = 0, entrada = 1.

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.

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_gpio
loop:
BSF LATB, 0 ; LED ON
GOTO loop ; salto → destino loop: (arriba)
END

Flujo: config bits (hardware al encender) → TRIS (direccion) → LAT (estado de salida) → simular en Proteus con el .HEX de MPLAB.

ErrorSintomaSolucion
Escribir en PORTx en vez de LATxSalida erratica o lectura raraUsa BSF/BCF/CLRF sobre LATx
No configurar TRISxPin no responde como esperasSiempre TRIS antes de LAT/PORT
PBADEN = ON sin ADCON1GPIO digital “muerto” en RA/RBPBADEN = OFF o configura ADCON1
LED sin resistenciaPin sobrecargado220 Ω 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.

Cuando un pin es entrada con pulsador, necesitas pull-up y antirrebote. Eso es la leccion Botones, pull-up y antirrebote.

¿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.

Examen interactivo

GPIO y puertos

Basado en: Clase Tema 2 y 3 (1).pdf

0 de 0 respondidas

TRISB = 0xFF significa que el puerto B es...
¿Cual es la diferencia principal entre PORTB y LATB?
Para encender un LED en RB0 debes escribir en...
Para leer un pulsador en RB3 debes usar...
BCF TRISB, 0 significa que RB0 es...
CLRF LATB antes de encender LEDs sirve para...
PBADEN = ON sin configurar ADCON1 puede causar...
MOVLW B'11110000' + MOVWF TRISB configura RB4-RB7 como...
El bit 3 de LATB corresponde al pin...
Antes de BSF LATB, 0 debes asegurarte de...