Pagina 1 di 2

Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 5 giu 2015, 10:39
da Davide90
Salve a tutti, ho di nuovo bisogno di voi, dovrei ottimizzare una istruzione:

ho bisogno di scrivere solo alcuni bit della PORTA uguali ad alcuni bit della PORTB , lasciando inalterati gli altri delle rispettive porte, in sostanza, al momento uso questo codice:

Codice: Seleziona tutto
               PORTAbits.RA4=PORTBbits.RB4;
                PORTAbits.RA5=PORTBbits.RB5;
                PORTAbits.RA6=PORTBbits.RB6;
                PORTAbits.RA7=PORTBbits.RB7;

Considerate che quei bit della PORTB possono assumere sia 0 che 1, è un segnale PPM.
Logicamente, i da RB0 a RB3 e da RA0 a RA3 devono essere lasciati inalterati , svolgono altre funzioni.
C' è un modo per ottenere la stessa cosa, scrivendo la PORTA tutta in un colpo? Usando uno shadow_reg ma poi quale operatore usare ?

Grazie

Re: Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 5 giu 2015, 10:46
da simo85
Puoi anche usare l'assegnazione logica bit a bit.

Re: Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 5 giu 2015, 11:31
da WALTERmwp
Ciao Foto UtenteDavide90 come ti ha scritto Foto Utentesimo85, in alternativa, puoi usare gli operatori a bit(s) (bitwise) ma considera che ti tocca comunque fare un giro di registri, forse, inefficiente, rispetto all'assegnazione diretta che hai riportato.

Se pensi che la presunta assenza di contemporaneità ti possa creare dei problemi allora ci si può provare ma se credi di ridurre il codice ho dei dubbi sia la strada migliore.
Quindi, se si tratta di questo, ma probabilmente ci hai già pensato, puoi, se non altro, rendere più leggibile il listato facendo di quelle quattro righe una macro, non una funzione.

Saluti

Re: Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 5 giu 2015, 11:41
da Candy
In questo caso, hai comunque il codice più semplice con cosa hai già fatto.
Bisognerebbe vedere come controlli i restanti bit, e, magari, valutare se, copiando PORTA su PORTB, cosa devi ancora fare con i segnali da RB0 ad RB3...

Il discorso cambierebbe se una porta avesse i restanti quattro bit come ingressi... Allora potresti fare una copia tra porte, senza altre paure.

Re: Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 5 giu 2015, 12:08
da simo85
Per vedere se è meglio o no un metodo o un altro, fai il disassembling del codice e vedi come lavora ed ottimizza il compilatore in ogni caso.

Re: Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 7 giu 2015, 10:19
da Davide90
WALTERmwp ha scritto:Ciao Foto UtenteDavide90 come ti ha scritto Foto Utentesimo85, in alternativa, puoi usare gli operatori a bit(s) (bitwise) ma considera che ti tocca comunque fare un giro di registri, forse, inefficiente, rispetto all'assegnazione diretta che hai riportato.

Se pensi che la presunta assenza di contemporaneità ti possa creare dei problemi allora ci si può provare ma se credi di ridurre il codice ho dei dubbi sia la strada migliore.
Quindi, se si tratta di questo, ma probabilmente ci hai già pensato, puoi, se non altro, rendere più leggibile il listato facendo di quelle quattro righe una macro, non una funzione.

Saluti


Si , il problema è la presunta assenza di contemporaneità, anche se, sto usando un PIC con clock 32 MHz.


Candy ha scritto:In questo caso, hai comunque il codice più semplice con cosa hai già fatto.
Bisognerebbe vedere come controlli i restanti bit, e, magari, valutare se, copiando PORTA su PORTB, cosa devi ancora fare con i segnali da RB0 ad RB3...

Il discorso cambierebbe se una porta avesse i restanti quattro bit come ingressi... Allora potresti fare una copia tra porte, senza altre paure.


Devo valutare anche questa opzione, grazie!

simo85 ha scritto:r vedere se è meglio o no un metodo o un altro, fai il disassembling del codice e vedi come lavora ed ottimizza il compilatore in ogni caso.


Puoi spiegarti meglio?


Grazie a tutti!!

Re: Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 7 giu 2015, 12:12
da Orionis
Ho provato qualche manipolazione di bit e dovrebbe funzionare, se lo scopo é di garantire la contemporaneita' di sostituzione dei bit in LATA:
Codice: Seleziona tutto
LATA = 0x15
LATB = 0x73
       movlw   0xf0
       andwf   LATB,w
       xorlw   0xf0
       xorwf   LATA,w
       xorlw   0x0f
       movwf   LATA    ;LATA = 0x75


Prova
O_/

Re: Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 7 giu 2015, 12:12
da Candy
Quando compili il programma, in codice C viene comunque convertito in codice assembly, che è il codice macchina, l'elenco istruzioni del micro. Puoi analizzare questo, mettendoci parecchio tempo, oppure, provi i vari codici analizzando con un oscilloscopio, i tempi di istruzione. (Dovrai programmare dei segnali che ti permettano di fare tale analisi), che obbiettivamente è la tecnica più semplice e veloce.

Re: Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 7 giu 2015, 18:04
da WALTERmwp
Ciao Foto UtenteOrionis
Orionis ha scritto:Ho provato qualche manipolazione di bit e dovrebbe funzionare
ma cosa significa ?
Che risultato dovrebbero produrre quella sequenza di xor ?
Forse, limitando la questione alla contemporaneità, si potrebbe fare, più semplicemente, così:
Codice: Seleziona tutto
movlw   0xF0
andwf   LATB,0
movwf   DEP

movlw   0x0F
andwf   LATA,0
iorwf   DEP,0

movwf   LATA

Saluti

Re: Scrivere solo alcuni bit di una PORTA

MessaggioInviato: 7 giu 2015, 21:04
da Orionis
WALTERmwp ha scritto:ma cosa significa ?
Che risultato dovrebbero produrre quella sequenza di xor ?
Forse, limitando la questione alla contemporaneità, si potrebbe fare, più semplicemente, così:


Ciao Foto UtenteWALTERmwp
la sequenza che ho inviato fa esattamente quello che Foto UtenteDavide90 chiede, ovvero sostituisce il nibble alto di LATA con il nibble alto di LATB, senza alterare gli altri bit e modificando LATA in una sola istruzione; questo almeno é quanto dice il mio simulatore.

Lo stesso risultato si ottiene con la tua sequenza, piu' intuitiva, che pero' usa un'istruzione in piu' e richiede una variabile d'appoggio.

A Davide l'ardua sentenza
O_/