Vai al contenuto
PLC Forum


Banchi Memoria Pic


Matik

Messaggi consigliati

Allora....sto usando un pic16F876a per gestire diversi I/O e un LCD 16X2, ho steso il programma su carta e ora lo sto scrivendo in assembler. Problema: ho scritto la gestione del display e ho cominciato la gestione degli I/O nel banco 0 solo che ora ho raggiunto i 2K di programma e devo cambiare banco....qualcuno mi sa spiegare come si fa che dal data sheet non ci ho capito molto? Mi sembra di aver capito che per chiamare una sub o fare un salto con GOTO bisogna indicare il banco di destinazione tramite i bit 3&4 di PCLATH e ritornando dalla chiamata non c'è bisogno di aggiornarli o sbaglio?

Altro dubbio: i registri di accesso alle porte (PORTA, PORTB...) sono tutti nel banco0 mentre negli altri banchi non ci sono (a parte nel banco 1 che c'è PORTB): che significa che se sono nel banco 2 e devo attivare un'uscita devo prima fare un salto al banco 0 e poi ritornare per proseguire quello che stavo facendo?

Grazie per i consigli che mi darete.

Matik

Link al commento
Condividi su altri siti


Ciao.

Ti rispondo esponendo quello che ho capito io, sperando di non sbagliare.

Prima di tutto parliamo di banchi per i registri di memoria ram e di pagine per la memoria di programma.

Dato che le istruzioni possono memorizzare un indirizzo di soli 11 bit, pari a 2K, mentre l'indirizzo completo è di 13 (8K), bisogna selezionare la pagina a cui si salta impostando i bit 3 e 4 di PCLATH, come hai ben capito, altrimenti il salto viene fatto nella pagina corrente (per esempio la pagina 0). Per selezionare la pagina corretta puoi usare, prima del salto, la direttiva PAGESEL label, dove label è l'etichetta del goto o il nome del sottoprogramma a cui si salta. Esempio:

  
    ORG 0x100      ;pag. 0
    PAGESEL PIPPO
    CALL  PIPPO
    GOTO SALTO    ;salta nella pag. 1
    ...
    ORG 0x900      ;pag. 1
PIPPO
    ...

Anche se si ritorna da un sottoprogramma, il contenuto di PCLATH e, quindi, la pagina non cambiano. Nell'esempio l'istruzione goto salta anche lei nella pagina 1. Quindi ogni volta che si salta bisogna controllare la pagina selezionata ed eventualmente usare PAGESEL.

Per quanto riguarda registri ram bisogna fare come hai scritto tu. Per questo si usa la direttiva BANKSEL nome_registro oppure BANKSEL indirizzo_registro.

Come saprai, gli ultimi 16 registri sono mappati in tutti i 4 banchi e permettono, quando possibile, di non dovere cambiare banco.

Spero di essere stato chiaro.

Ciao.

Link al commento
Condividi su altri siti

Giacomo ti ringrazio infinitamente, hai capito in pieno la mia lacuna.

Quindi quando si esegue una call in un'altro banco, successivamente il return non aggiorna il PCLATH e quindi bisogna in qualche modo memorizzare il PCLATH (magari usando uno di quei 16 registri che mi dicevi mappati in tutti i banchi) precedente alla chiamata.

Ora provo a fare alcune routine di prova con questo sistema, e vediamo un pò se riesco a schiarirmi le idee.

Grazie di nuovo

Matik

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...