Tutorials - PIC18 by Data Sheet

 

pag.120 - PSP


PSP - Parallel Slave Port

Questa funzione, per molti, risulta enigmatica e, in effetti, non è molto conosciuta, nè comune.

In pratica, la Parallel Slave Port è un mezzo di comunicazione tra un microprocessore e il PIC, che opera come slave. 
Ed in effetti va ricordato che il progenitore dei PIC attuali (il PIC1640 di General Instruments) era proprio previsto per essere utilizzato come una periferica intelligente sul bus di altri microprocessori.

Possiamo caratterizzare i due ambienti così:

microprocessore - uP i componenti del sistema (memoria e periferiche) sono esterni alla CPU, a cui sono collegati con i bus
microcontroller - uC i componenti del sistema (memoria, periferiche, bus) sono tutti contenuti all' interno di un singolo chip (embedded)

Trovate qui una trattazione più dettagliata dell' argomento.

I due sistemi sono dedicati ad applicazioni di complessità differente

  • un sistema a microcontroller è essenzialmente preposto all' automatizzazione/automazione di un qualche dispositivo o processo limitato (regolatori di velocità, orologi, temporizzatori, controller di periferiche, rilevamento di segnali, elettrodomestici, auto, ecc.). Si tratta di applicazioni dedicate, cost sensitive, non espandibili.

  • un sistema a microprocessore prevede una possibilità di espansione, una disponibilità ampia di periferiche e memoria, una capacità di elaborazione elevata e si presta per ambiti di controllo e automazione più complessi (personal computer, PLC, controlli di processo, telcomunicazioni, ecc.)

Nella gamma delle periferiche associabili ad un sistema a microprocessore trovano posto periferiche "intelligenti", ovvero in grado di svolgere funzioni complesse sotto il controllo del microprocessore, ma in modo autonomo rispetto alle sue risorse.

Questo è, appunto, la collocazione del modulo PSP, ovvero quella di permettere la comunicazione tra microcontroller (periferica intelligente) e microprocessore, attraverso il bus dati di quest' ultimo.

Schematizzando la struttura del sistema a microprocessore, troviamo:
  • un bus DATI
  • un bus INDIRIZZI
  • e un bus di CONTROLLO

Ogni periferica esterna alla CPU è indirizzata dal bus INDIRIZZI, attraverso delle logiche di CS (chip select) e scambia i dati sul bus DATI, sotto il controllo dei segnali RD (Read) e WR (Write) generati dal microprocessore e inviati sul bus di CONTROLLO.

Il PIC che dispone del modulo PSP utilizza il suo PORTD per connettersi in modo parallelo al bus dati, dove le informazioni sono scambiate in parallelo, sotto il controllo dei segnali !RD, !WR e !CS, che sono forniti dal master

  • il PIC diventa a tutti gli effetti una periferica del bus del microprocessore.

Va compreso che questa funzione di slave riguarda la comunicazione dei dati dal PIC verso il microprocessore e viceversa, comunicazione che avviene su richiesta del microprocessore e con le temporizzazioni date dai segnali del bus. Per il resto il PIC lavora nel suo solito modo, collezionando i dati da inviare al bus o eseguendo i comandi ricevuti attraverso il bus.

Dunque, dovrebbe essere ora chiaro cosa sia PSP: è una porta parallela a 8 bit per scambiare dati con un ambiente "master" esterno.

La struttura hardware del PORTD è leggermente diversa dalle altre in quanto, nel momento in cui è abilitata la funzione PSP, sono dei segnali esterni WR, RD e CS quelli che vanno a gestire lo scambio dei dati:
  • WR: a livello 0 abilta il data latch in ingresso del microcontroller e carica il dato fornito sul bus del microprocessore
  • RD: a livello 0 abilita il gate tree state di uscita dei dati dal latch dati verso il bus esterno del microprocessore 
  • CS: a livello 0 abilita le funzione RD o WR

Contemporaneamente, i segnali RD o WR generano una richiesta di interrupt settando il flag PSPIF.

La logica di ingresso dei segnali WR,RD e CS sono inverter a livello TTL.

Da ricordare che, data la necessità di un PORTD a 8 bit completi, la funzione PSP non è disponibile per PIC in packages minori di 40 pin.

Il latch dei dati di lettura e quello di scrittura del PSP si trovano allo stesso indirizzo, come registro PORTD
Però, in pratica, si tratta di due diversi buffer, per cui:

  • scrivendo PORTD non si sovra scrive un eventuale dato inviato dal master e

  • leggendo PORTD non si legge il dato in uscita, ma l' ultimo inviato dal master.


La scrittura di PORTD non si traduce nell' apparire dei corrispondenti livelli di tensione sui pin se non nel momento in cui il master richiederà la lettura.
Questo vale solamente quando PORTD funziona come PSP, mentre in GPIO si tratta di una struttura uguale a quella degli altri port.

Le temporizzazioni tra i segnali sono tali da potersi adattare con poca circuiteria esterna ai bus dei principali microprocessori.

In scrittura, il microprocessore seleziona la periferica mandando bassa la linea CS relativa e quindi invia i dati sul bus dati, sincronizzato dal segnale WR. Il PIC riceve l' informazione dell' arrivo dei dati, che sono conservati nel latch dati fino alla prossima scrittura, attraverso il flag PSPIF e IBF, che vanno a 1 al termine della fase Q3 successiva alla chiusura del segnale WR (figura 10.3).
In pratica,
i dati forniti dal master sono scritti sul PORTD quando sia !CS che !WR sono a livello basso; i bit PSPIF di interrupt e il flag IBF (TRISE7) sono settati al termine della scrittura, permettendo al programma la cattura dei dati. IBF a livello 1 indica che un dato è stato scritto dal master sul PSP ed attende di essere letto
ed è azzerato dalla lettura del dato presente sul PSP da parte del PIC.

Il lettura, analogamente, il microprocessore seleziona la periferica con CS e richiede l' emissione dei dati con il segnale RD. Il PIC ha preparato il dato nel buffer e all' arrivo di RD i dati sono passati al bus esterno; la conclusione dell' operazione è segnalata dal flag PSPIF.
I dati diretti al master sono letti con  !RD e !CS a livello basso; in tal caso oltre a PSPIF,  il flag relativo è OBF (TRISE6)
che va a 0 non appena è ricevuto il segnale RD dal master (figura 10-4). Al termine della fase Q3 successiva alla chiusura del segnale RD, il flag PSPIF sarà settato.
In pratica, prima di scrivere un nuovo dato nel latch del PSP, il programma deve verificare che il precedente sia stato letto, onde evitare un overflow; nel caso in cui sia stato ri scritto PORTD mentre il dato precedentemente non era ancora stato letto
(il dato precedente viene sovra scritto e va perduto) è segnalato dal flag IBOV (TRISE5) che va a 1.
IBOV deve essere azzerato da software prima della prima scrittura,
caso mai si trovasse a 1. Prima di una successiva scrittura, va letto per assicurarsi che sia a zero, ovvero che il dato precedente è stato trasmesso regolarmente. Viene rimesso a zero solo via software.

I valori dei tempi sono riportati nella Table 26-13 delle caratteristiche AC (pag.353).

 


 

Per utilizzare questa modalità occorre :

  • impostare PFCG3:0 di ADCON1 in un range di valori tra 1010 e 1111, ovvero con PORTE:2:0 come GPIO e non come ingressi analogici :

       movlw  b'11111111'   ; port A & E come digitali
       xorwf  ADCON1

     

  • programmare PORTE2:0 come ingressi (WR, RD e CS sono generati dal master) attraverso i bit 2:0 di TRISE:

       movlw  b'00000111'   ; port E come input       
       xorwf  TRISE

     

  • abilitare il bit PSPMODE (TRISE<4>):

       bsf  TRISE, 4                                  

 

Utilizzando la funzione PSP, il registro TRISD non ha nessuna funzione, in quanto la direzione del PORTD viene stabilita dai segnali di controllo che arrivano dal master.

Riassumendo:

   movlw  b'00000111'      ; port E come digitali
   xorwf  ADCON1
   movlw  b'00000111'      ; port E come input 
   xorwf  TRISE
   bsf    PSPCON, PSPMODE  ; abilita PSP
   bsf    TRISE, PSPMODE

 

Le operazioni di PSP sono gestite in interrupt in quanto si suppone di avere a che fare con una comunicazione molto rapida; inoltre si tratta di un sistema di scambio dati asincrono gestito dal master esterno a cui il PIC si deve sincronizzare. Quindi questa la via più adeguata, anche se teoricamente è possibile un polling dei flag..

L' interrupt è chiamato quando la scrittura o la lettura da parte del master sono completate.

  • Il bit di abilitazione dell' interrupt è PSPIE (PIE1<7>) che va posto a 1 se si desidera attivare l' interrupt della porta PSP.
     

  • Il bit di selezione della priorità dell' interrupt è PSPIP (IPR1<7>).IPIR1 è a 1 se si desidera l' alta priorità, altrimenti va a posto a 0. L' abilitazione del modo interrupt con priorità richiede di aver settato il bit IPEN (RCON<7>) ; altrimenti viene impiegato un sistema di interrupt senza livelli di priorità e l' impostazione di PSPIP è indifferente.
     

  • Il flag di identificazione è PSPIF (PIR1<7>) che va a 1 a seguito delle operazioni di scrittura o lettura del master. PSPIP va cancellato da software.

Il programma di gestione della PSP deve, una volta settato abilitato relativo, attende la richiesta e distingue le operazioni di lettura da quelle di scrittura analizzando i flags.


 

Un esempio della struttura di una comunicazione PSP tra un processore esterno e il PIC può essere schematizzata così :

  1. Il processore master seleziona l' indirizzo del suo bus a cui corrisponde il PIC. Questo provoca un livello basso sul pin !CS

  2. il processore master scrive un dato che sarà catturato nel latch del PSP in seguito al segnale !WR

  3. viene generata una richiesta di interrupt nel PIC

  4. il programma di gestione verifica il flag PSPIF e se settato, riconosce una chiamata interrupt da PSP

  5. la verifica dei flag IBF e OBF permette di selezionare se si tratta di lettura o scrittura. Se IBF è a 1, il programma legge PORTD con un movf PORTD, W ; questo provoca il clear del flag IBF

  6. il valore letto su PORTD non è lo stato fisico dei pin, ma il dato che il master ha scritto e che è stato catturato nel buffer.

  7. l' uscita dall' interrupt richiede la cancellazione del flag PSPIF

Nel caso in cui il master scriva un secondo dato prima che il PIC abbia letto il primo, il flag IBOV verrà settato, indicando un overflow. Il primo dato è sovra scritto dal secondo e va perduto.

Nel caso di una lettura da parte del master:

  1. il PIC prepara il dato da inviare scrivendolo nel PORTD. Questo provoca un livello 1 sul flag OBF. In sostanza OBF indica che c'è un dato pronto per essere inviato. OBF va testato prima di scrivere PORTD per evitare di sovrascrivere un dato non ancora inviato

  2. Quando il master seleziona il PIC e richiede una lettura con !RD, il PORTD passa in uscita e il dato viene letto sul bus del master. Il flag OBF viene cancellato.

  3. Contemporaneamente viene inviata la richiesta di interrupt che avvisa il PIC che è disponibile il buffer per caricare un nuovo dato.

  4. Ancora una volta PSPIF va cancellato da programma

 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 15/04/11.