Il Registro TRIS nei Microcontrollori Microchip PIC: Controllo della Direzione dei Dati
Nell'architettura dei **Microcontrollori PIC® di Microchip Technology** (famiglie PIC10/12/16/18/24/32), il **registro TRIS** (Tri-State Register) è il **Registro di Direzione dei Dati** per una porta I/O. Configura ogni pin come **Input** o **Output**.
Origine del Nome
TRIS = **TRI**-State (Input, Output Alto, Output Basso / Alta Impedanza). Il pin può essere pilotato Alto, pilotato Basso, o Alta Impedanza (Input).
Logica Bitwise (La Regola d'Oro)
| Valore Bit TRISx | Direzione Pin | Stato Pin | Driver di Output | Buffer di Input |
|---|---|---|---|---|
| 1 | Input | Alta-Z (Hi-Z) | Disabilitato (Off) | Abilitato (Schmitt Trigger / TTL) |
| 0 | Output | Guidato Alto / Basso | Abilitato (Push-Pull / Open-Drain*) | Abilitato (Legge lo stato del pin) |
*Open-Drain (registro ODCON) disabilita P-FET; richiede pull-up esterno.
Mnemonico: **"1 = Input (I)", "0 = Output (O)"**. Pensa: **1** sembra una **I** (Input). **0** sembra una **O** (Output).
Mappatura del Registro (Esempi)
- PIC16F877A (Mid-range): TRISA (5-bit), TRISB (8-bit), TRISC, TRISD, TRISE. Bank 1 (RP0=1).
- PIC18F4550 (High-end 8-bit): TRISA–TRISE. Access Bank (Bank 15 / BSR).
- PIC24 / dsPIC33 (16-bit): TRISA–TRISG. Spazio SFR. Registri 16-bit.
- PIC32 (MIPS32): TRISA–TRISG. Memory-mapped. **TRISxSET / TRISxCLR / TRISxINV** registri di manipolazione bit atomica.
Interazione Critica: LATx vs PORTx
- Scrittura Output: Scrivi sul registro **LATx (Latch)**. Evita problemi Read-Modify-Write (RMW) su pin pesantemente caricati.
LATBbits.LATB5 = 1; - Lettura Input: Leggi il registro **PORTx**. Campiona la tensione del pin.
if (PORTBbits.RB4) ... - Lettura Output: Leggi **LATx** (garantisce l'ultimo valore scritto). Leggere PORTx legge la *tensione reale del pin* (può differire a causa del carico).
Sequenza di Configurazione (Best Practice)
// 1. Configura Analogico/Digitale (ANSELx = 0 per I/O digitale) ANSELB = 0x00; // 2. Imposta i Livelli di Output Iniziali (LATx) *prima* di rendere output LATB = 0x00; // Tutti bassi inizialmente // 3. Imposta Direzione Dati (TRISx) TRISB = 0b00010000; // RB4 = Input (1), Altri = Output (0) // 4. Abilita Pull-up Deboli (se necessario, per input) WPUBbits.WPUB4 = 1; // Pull-up su RB4 INTCON2bits.nRBPU = 0; // Abilita pull-up PORTB globalmente Override di Funzione Speciale
I moduli periferici (UART, SPI, I2C, PWM, ADC, Comparatore) **sovrascrivono il controllo TRIS** quando abilitati.
- UART TX → Forza Output. RX → Forza Input.
- ADC → Forza Input (Analogico), disabilita buffer digitale (ANSEL=1).
- Il bit TRIS diventa "don't care" per quel pin. Controlla il datasheet "Pin Diagram" / "Pinout I/O Description".
Errori Comuni
- Dimenticato ANSEL: Il pin di default è Input Analogico al POR. Lettura digitale restituisce 0. TRIS=1 ma ANSEL=1 → Analogico. Sempre cancella ANSEL prima.
- RMW su PORTx:
PORTB |= 0x01;legge il pin (può essere basso a causa del carico), modifica, riscrive → cancella altri output. **Usa LATx.** - Selezione Bank (PIC16): TRIS è in Bank 1. PORT è in Bank 0. Mancanza di
BANKSEL TRISB→ scrittura sul registro sbagliato (PORTB).
Il registro TRIS è il **guardiano della direzione del pin**. Padroneggia la sua logica "1=In, 0=Out", la sua partnership con LATx/PORTx/ANSELx e gli override periferici, e padroneggerai l'I/O PIC.