Tutorials - PIC

 

PIC12F508/509 e 16F505


I default

Cosa sono, dunque, questi "default" ?
 
 
Per capirlo, dobbiamo fare alcune considerazioni:

  • il mezzo per accedere alle funzioni interne del microcontroller è costituito dai registri speciali (SFR - Special Function Register), come il TRISGPIO visto ora: modificando i loro bit, il programmatore può gestire I/O, timer, convertitori, moduli di comunicazione, ecc.
  • questi registri SFR sono, quindi, di importanza capitale. 
  • dovendo essere modificabili dall' utente, si trovano in RAM, ovvero il loro contenuto va perso al momento della mancanza di alimentazione.
  • il costruttore, allora, fa in modo che all' accensione (reset all' arrivo della tensione di alimentazione o POR - Power On Reset, ma anche di altri reset generati da cause diverse) i bit di questi registri assumano dei valori specifici, detti default .

La  scelta del valore di default deriva dalla linea guida del costruttore di mantenere il chip nelle condizioni di minore consumo energetico; sarà compito, poi, dell' utente di indirizzare diversamente le risorse.
Questo privilegia ingressi analogici rispetto a digitali, ingressi rispetto ad uscite, ecc.

Nel registro TRISGPIO, ad esempio, abbiamo visto che il default porta tutti i bit utili a 1, ovvero pre-configura la direzione degli I/O digitali come ingressi.

La conoscenza della situazione di default permette di capire alcuni meccanismi tipici dei PIC e può essere utile per risparmiare istruzioni; ad esempio, volendo usare i pin come ingressi digitali, non occorre agire sul registro di tris, dato che il default impone già questa scelta.
Per contro, non avendo la certezza della situazione in cui si trovi il chip, può essere una scelta di sicurezza inizializzare comunque tutti i bit che corrispondono a pin o funzioni che si dovranno impiegare durante l' esecuzione del programma.


GPIO

Una volta definito come intendiamo usare i pin, se in uscita o in ingresso, possiamo leggere lo stato degli ingressi o comandare quello delle uscite agendo su un altro registro, GPIO, che ha questa struttura:

GPIO

bit

7 6 5 4 3 2 1 0

nome

-

-

GP5

GP4

GP3

GP2

GP1

GPO

funzione

R/W R/W R/W R/W R/W R/W R/W R/W

default

- - x x x x x x
  • bit 7:6   non utilizzati 
                 in lettura  : 0
                 in scrittura: nessun effetto

  • bit 5  GP5  in lettura  : livello logico applicato al pin
                in scrittura: (solo se la direzione in TRISGPIO è 0)

                1 = pin a livello alto
                0 = pin a livello basso
       

  • bit 4  GP4  in lettura  : livello logico applicato al pin
                in scrittura: (solo se la direzione in TRISGPIO è 0)

                1 = pin a livello alto
                0 = pin a livello basso

  • bit 3  GP3  in lettura  : livello logico applicato al pin
                in scrittura: nessun effetto perchè il pin solo ingresso

  • bit 2  GP2  in lettura  : livello logico applicato al pin
                in scrittura: (solo se la direzione in TRISGPIO è 0)

                1 = pin a livello alto
                0 = pin a livello basso

  • bit 1  GP1  in lettura  : livello logico applicato al pin
                in scrittura:
    ( solo se la direzione in TRISGPIO è 0)
                1 = pin a livello alto
                0 = pin a livello basso

  • bit 0  GP0  in lettura : livello logico applicato al pin
                in scrittura:
    (solo se la direzione in TRISGPIO è 0)
                1 = pin a livello alto
                0 = pin a livello basso

Ad esempio, una volta definito GP0 come uscita (bit 0 di TRISGPIO = 0 ), potrò portarlo a livello 1 scrivendo 1 nel bit 0 di GPIO e mandarlo a livello 0 scrivendo 0 nello stesso bit.
Se al pin è collegato un LED, esso si accenderà e spegnerà a seconda del livello imposto al pin.

Se il bit 2 di TRISGPIO = 1, GP2 è configurato come ingresso. Leggendo GPIO mi ritroverò nel suo bit 2 il valore del livello logico applicato al pin. 

Per 16F506, il discorso è analogo, riferendolo però ai due registri PORTB e PORTC, dove PORTB sostituisce GPIO.

La lettura dello stato dei pin è possibile sia che questi siano configurati come ingressi che come uscite.

Pin come Azione
ingressi la lettura rende lo stato elettrico reale del pin in quel momento
una eventuale scrittura del bit configurato come ingresso non ha effetto.
uscite la lettura rende lo stato elettrico reale del pin in quel momento
la scrittura agisce sul latch di uscita del pin

Per comprendere a pieno il funzionamento del circuito che sta a monte del pin utilizzato come I/O digitale, qui trovate alcune pagine informative.

Questa situazione fa si che in particolari circostanze si determini l' effetto chiamato R-M-W e che blocca lo stato di un pin nel caso in cui si acceda con istruzioni che operano una lettura prima della scrittura (read-modify-write), ad esempio BCF o  BSF. Nel caso in cui il carico applicato al pin fosse elevato, principalmente dal punto di vista dell' impedenza (che si oppone alla variazione), occorre mettere in atto qualche sistema per evitare il problema R-M-W, ad esempio usando dei semplici buffer. Maggiori informazioni su R-M-W qui.

Come TRISGPIO, anche GPIO è in RAM e le impostazioni definite dall' utente durante lo svolgimento del programma vanno perse alla mancanza di tensione di alimentazione. Per quanto riguarda i già citati default, nel caso di questo registro, essendo configurati come ingressi digitali al POR, ovviamente non può venire imposto alcun valore di default (x indica indeterminato).


 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 30/04/13.