Matik Inserito: 14 gennaio 2005 Segnala Share Inserito: 14 gennaio 2005 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 More sharing options...
giacomo56 Inserita: 14 gennaio 2005 Segnala Share Inserita: 14 gennaio 2005 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 More sharing options...
Matik Inserita: 15 gennaio 2005 Autore Segnala Share Inserita: 15 gennaio 2005 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora