2010-04-12 26 views
21

Ho già letto la scheda tecnica e google ma ancora non capisco qualcosa.Differenza tra PORT e LATCH su PIC 18F

Nel mio caso, ho impostato il PIN RC6 di un PIC18F26K20 in modo INGRESSO:

TRISCbits.TRISC6 = 1;

Poi ho letto il valore con PORT e LATCH e ho un valore diverso!

v1 = LATCbits.LATC6;

v2 = PORTCbits.RC6;

v1 mi dà 0 dove v2 dà 1.

E 'normale? In tal caso dobbiamo usare PORT e in tal caso LATCH?

risposta

29

Il fermo è output latch su cui vengono scritti i valori. La porta è la tensione al pin attuale.

Ci sono alcune situazioni in cui possono essere diversi. Quello che ho incontrato più frequentemente è se hai uno spillo (accidentalmente) in cortocircuito verso terra. Se si imposta il latch alto, il latch verrà letto alto, ma la porta leggerà in basso perché la tensione sul pin è ancora approssimativamente a terra.

Un'altra situazione che porta a ciò che hai descritto è quando il pin della porta non è stato configurato correttamente. Io (e tutti quelli con cui lavoro) abbiamo passato molte ore a cercare di capire perché il nostro PIC non sta lavorando alle aspettative, per scoprire infine che abbiamo ignorato lo spegnimento dei moduli analogici, per esempio. Assicurati di andare oltre la sezione Porte I/O -> PORT ?, TRIS ?, e LAT? registri nel foglio dati. È possibile ottenere maggiori informazioni nel Microchip wiki page che spiega la lettura del valore errato immediatamente dopo aver scritto un'uscita su un pin collegato a un carico capacitivo.

Quella pagina wiki spiega anche:

Una lettura del porto registro latch riporta le impostazioni dei driver di uscita, mentre una lettura del registro di porto restituisce i livelli logici visti sui perni.

Inoltre, ecco un frammento dalla sezione porte I/O sul 18F14K50 (che dovrebbe essere lo stesso del resto della serie 18F):

Ciascuna porta ha tre registri per la sua Operazione . Questi registri sono:

  • registro TRIS (direzione registro dati)
  • registro PORT (legge i livelli sui perni del dispositivo)
  • LAT registro (uscita latch)

Quindi nella maggior parte delle situazioni, scriverete al latch e leggerete dal porto.

+0

Quindi, se il PIN è in modalità INPUT, cosa dovrei usare? LATCH o PORT? E se il PIN è in modalità OUPUT, cosa dovrei usare? LATCH o PORT? – acemtp

+0

@acemtp: risposta aggiornata. –

10

Ecco un riepilogo utile dalla scheda tecnica.

11.2.3 LAT Registri
Il LATx registro associato al un pin I/O elimina i problemi che potrebbero verificarsi con istruzioni lettura-modifica-scrittura. Una lettura del registro LATx restituisce i valori contenuti nei latch di uscita della porta , anziché i valori sui pin di I/O. Un'operazione di lettura-modifica-scrittura sul registro LAT , associata a una porta I/O, evita la possibilità di scrivere i valori dei pin di ingresso nei latch delle porte . Una scrittura sul registro LATx ha lo stesso effetto di una scrittura sul registro PORTx.

Le differenze tra il porto e registri LAT possono essere riassunti come segue:

  • Una scrittura al registro PORTx scrive il valore dati alla porta latch.
  • Una scrittura sul registro LATx scrive il valore dei dati sul latch della porta .
  • Una lettura del registro PORTx legge il valore dei dati sul pin I/O .
  • Una lettura del registro LATx legge il valore dei dati contenuto in il latch di porta.
+0

Grazie per la risposta. Ho letto la scheda tecnica e questa parte ma non risponde alla domanda: quando ho bisogno di leggere il pin (modalità di input), dovrei usare latch o port e quando ho bisogno di scrivere il pin (modalità di output) dovrei user latch o porto. – acemtp

3

Sì, è normale leggere PORTx e LATx e trovare occasionalmente valori diversi.

Quando si desidera leggere se un hardware esterno sta attivando un pin alto o basso, è necessario impostare il pin sulla modalità di input (con TRIS o il registro DIR) e leggere PORTx. Questa lettura ti dice se la tensione effettiva al pin è alta o bassa.

Se si desidera pilotare un pin in alto o in basso, è necessario impostare il pin in uscita (con TRIS o il registro DIR); dovresti scrivere il bit nel registro LATx.

(Scrivere quel bit al registro PORTx può sembrare fare la cosa giusta: quel pin - alla fine - andrà alto o basso come comandato.Ma ci sono molti casi - come quando qualche altro pin su quella porta è collegato un bus open-collector - che scrivendo su un bit del registro PORTx rovinerà lo stato degli altri pin su quella porta, portando a problemi difficili da debugare).

Open Circuits: read before write

3

mia raccomandazione è di considerare i valori di porta in sola lettura. I valori LAT possono essere letti o scritti, ma il valore letto sarà l'ultimo valore scritto, non il valore di input del pin.

Su PIC precedenti, i valori LATx non esistevano; l'unico modo per scrivere su una porta era tramite i registri PORTx. Curiosamente, alcuni dei vecchi PIC, tornati dai giorni General Instruments (pre-Microchip), hanno supportato LATx, ma Microchip non ha aggiunto questa caratteristica fino alla linea PIC18x.

10

Mi adeguerò my answer da Ingegneria Elettrica.

Usiamo l'immagine da manuale:

Generic I/O Port Operation

Quando si scrive un po 'in un pin I/O, il gioco è la memorizzazione di questo bit da bus dati al Registro dati (D-FlipFlop). Se TRISx di questo bit è 0, i dati da Q del registro dati saranno nel pin I/O. Scrivere in LATx o PORTX è lo stesso. Vedi sotto in rosso:

Generic I/O Port Operation Write

D'altra parte, leggere LATx è diverso di leggere da PORTx.

Durante la lettura da LATx, stai leggendo ciò che è nel registro dati (D-FlipFlop). Vedi foto qui sotto in verde:

Generic I/O Port Operation Read LATx

E quando si legge da PORTx, stai leggendo il valore pin I/O reale. Vedere qui in blu:

Generic I/O Port Operation Read PORTx

PIC utilizza lettura-modifica-scrittura per le operazioni di scrittura e questo può essere un problem, in modo da usare questa ombra registrati per evitarlo.

0

Recentemente ho sperimentato che scrivere su PORTx Ri (ad esempio PORTC RC1) di PIC18F14K50 è inefficace quando un altro PORTx Rj (ad esempio PORTC RC0) era già impostato. Ho osservato una sbirciatina nell'oscilloscopio su PORTx Ri ma non sono riuscito a sostenere l'uscita. Questo problema è scomparso non appena stavo scrivendo su LATx.

La scrittura LATx è obbligatoria su PIC18 e la scrittura PORTx è proibita.