Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Scrivere solo alcuni bit di una PORTA

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Scrivere solo alcuni bit di una PORTA

Messaggioda Foto UtenteDavide90 » 5 giu 2015, 10:39

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
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[2] Re: Scrivere solo alcuni bit di una PORTA

Messaggioda Foto Utentesimo85 » 5 giu 2015, 10:46

Puoi anche usare l'assegnazione logica bit a bit.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: Scrivere solo alcuni bit di una PORTA

Messaggioda Foto UtenteWALTERmwp » 5 giu 2015, 11:31

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
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8986
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[4] Re: Scrivere solo alcuni bit di una PORTA

Messaggioda Foto UtenteCandy » 5 giu 2015, 11:41

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.
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10123
Iscritto il: 14 giu 2010, 22:54

0
voti

[5] Re: Scrivere solo alcuni bit di una PORTA

Messaggioda Foto Utentesimo85 » 5 giu 2015, 12:08

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.
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[6] Re: Scrivere solo alcuni bit di una PORTA

Messaggioda Foto UtenteDavide90 » 7 giu 2015, 10:19

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!!
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[7] Re: Scrivere solo alcuni bit di una PORTA

Messaggioda Foto UtenteOrionis » 7 giu 2015, 12:12

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_/
Nemmeno gli Dei possono nulla contro la stupidità umana ?
Avatar utente
Foto UtenteOrionis
2.083 1 6 13
Expert
Expert
 
Messaggi: 103
Iscritto il: 16 mag 2015, 10:33
Località: Bergamo

0
voti

[8] Re: Scrivere solo alcuni bit di una PORTA

Messaggioda Foto UtenteCandy » 7 giu 2015, 12:12

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.
Avatar utente
Foto UtenteCandy
32,5k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10123
Iscritto il: 14 giu 2010, 22:54

0
voti

[9] Re: Scrivere solo alcuni bit di una PORTA

Messaggioda Foto UtenteWALTERmwp » 7 giu 2015, 18:04

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
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8986
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[10] Re: Scrivere solo alcuni bit di una PORTA

Messaggioda Foto UtenteOrionis » 7 giu 2015, 21:04

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_/
Nemmeno gli Dei possono nulla contro la stupidità umana ?
Avatar utente
Foto UtenteOrionis
2.083 1 6 13
Expert
Expert
 
Messaggi: 103
Iscritto il: 16 mag 2015, 10:33
Località: Bergamo

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 20 ospiti