Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Accedere ai singoli bit di una variabile C18

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Accedere ai singoli bit di una variabile C18

Messaggioda Foto UtenteJAndrea » 2 set 2014, 10:37

Ciao a tutti
Volendo ispirarmi a quanto fatto da Microchip nei file PIC18fxxxx.h, per quel che riguarda l' accesso ai singoli bit di un registro, in modo da realizzare una variabile che contenesse i flag utilizzati all' interno del programma.
Il codice da me steso è il seguente
Codice: Seleziona tutto
unsigned char       INFO;
union   {
  struct    {
        unsigned LCD:1;
        unsigned UP:1;
        unsigned DWN:1;
        unsigned OK:1;
        unsigned MN:1;
            };
        } INFObits;

I singoli bit vengono scritti e letti correttamente, ma, se assegno un valore alla variabile INFO e vado a controllare i singoli bit dopo l' assegnazione, nulla è cambiato.
E' come se la variabile ed i singoli bit che dovrebbero comporla siano in realtà due cose distinte.
Probabilmente sbaglio qualche cosa nel codice, ma non riesco a venirne a capo.
Grazie a tutti coloro che aiuteranno.
Ciao
Avatar utente
Foto UtenteJAndrea
2.877 2 5 9
Master
Master
 
Messaggi: 1535
Iscritto il: 16 giu 2011, 15:25
Località: Rovigo

1
voti

[2] Re: Accedere ai singoli bit di una variabile C18

Messaggioda Foto Utenteemacar » 2 set 2014, 12:01

Ciao,
potresti postare il modo con cui assegni il valore a INFO cosi vediamo se l'errore sta li visto che è proprio quello il problema. Non uso praticamente mai struct e union ma forse non hai bisogno di usarle entrambe per ciò che devi fare. Aggiungo che non sono al mio PC e non ho modo di aprire un file .h per capire come viene scritto.
Emanuele
Avatar utente
Foto Utenteemacar
156 6
Frequentatore
Frequentatore
 
Messaggi: 145
Iscritto il: 3 dic 2013, 11:02

0
voti

[3] Re: Accedere ai singoli bit di una variabile C18

Messaggioda Foto UtenteJAndrea » 2 set 2014, 14:52

Ho provato ad assegnare il valore 0xff alla variabile INFO, che essendo unsigned char, dovrebbe farmi trovare ad 1 tutti i bit.
Codice: Seleziona tutto
INFO=0xff;

Nonostante questo io trovo tutti i flag a 0.
Avatar utente
Foto UtenteJAndrea
2.877 2 5 9
Master
Master
 
Messaggi: 1535
Iscritto il: 16 giu 2011, 15:25
Località: Rovigo

1
voti

[4] Re: Accedere ai singoli bit di una variabile C18

Messaggioda Foto UtenteCandy » 2 set 2014, 14:58

Ma guarda un poco bene la dichiarazione che hai postato. Se è la medesima che hai dichiarato nel programma, non fa cosa vuoi tu.
Non conosco quel compilatore, ma se esiste, la dichiarazione è un poco diversa.
Avatar utente
Foto UtenteCandy
32,4k 7 10 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 10132
Iscritto il: 14 giu 2010, 22:54

1
voti

[5] Re: Accedere ai singoli bit di una variabile C18

Messaggioda Foto Utenteemacar » 2 set 2014, 15:02

Sicuramente Foto UtenteCandy saprà darti indicazioni più precise visto che le struct le uso poco, però mi sa che, non solo la dichiarazione non fa quello che dici tu, ma hai aggiunto pure pezzi che non c'entrano. Ti consiglio anche una semplice ricerca delle struct su google per capire come dichiararle e come accedere alle sue variabili,
Emanuele
Avatar utente
Foto Utenteemacar
156 6
Frequentatore
Frequentatore
 
Messaggi: 145
Iscritto il: 3 dic 2013, 11:02

0
voti

[6] Re: Accedere ai singoli bit di una variabile C18

Messaggioda Foto UtenteJAndrea » 2 set 2014, 15:13

Da quel che ho capito le due cose sembrano scollegate proprio perché lo sono.
prima ho dichiarato una variabile unsigned char dal nome INFO e poi una struttura di bit chiamata INFObits.
Riporto anche il codice da cui ho preso ispirazione, tratto da una libreria Microchip, dove viene dichiarato il registro ANSELB ed i singoli bit che lo compongono.
L' union da me inserito sembra essere di troppo.
Codice: Seleziona tutto
extern volatile far  unsigned char       ANSELB;
extern volatile far  struct {
  unsigned ANSB0:1;
  unsigned ANSB1:1;
  unsigned ANSB2:1;
  unsigned ANSB3:1;
  unsigned ANSB4:1;
  unsigned ANSB5:1;
} ANSELBbits;
Avatar utente
Foto UtenteJAndrea
2.877 2 5 9
Master
Master
 
Messaggi: 1535
Iscritto il: 16 giu 2011, 15:25
Località: Rovigo

1
voti

[7] Re: Accedere ai singoli bit di una variabile C18

Messaggioda Foto UtenteWALTERmwp » 2 set 2014, 15:45

Ciao Foto UtenteJAndrea, non so se nel frattempo hai risolto ma anch'io ho qualche dubbio in merito alla interpretazione alla quale ricorre il compilatore.
Nel codice del Post [1] vedo una struttura non definita, senza nome, inserita in una union.
In questa, la dimensione massima (a prescindere dalla sintassi della struttura) dell'unione stessa, sarebbe determinata dal numero di variabili: in tal caso 5 unsigned (byte, int ... ? ).
Quando esegui l'istruzione "INFO=0xff;", a quale campo della struttura, costituente essa stessa dell'unione, avresti intenzione di assegnare il valore "0xff" ?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

1
voti

[8] Re: Accedere ai singoli bit di una variabile C18

Messaggioda Foto Utenteemacar » 2 set 2014, 17:07

Oltre a ciò che ti ha scritto Foto UtenteWALTERmwp io credo che, pur essendo scritte vicine,
Codice: Seleziona tutto
extern volatile far  unsigned char       ANSELB;

e
Codice: Seleziona tutto
extern volatile far  struct {
  unsigned ANSB0:1;
  unsigned ANSB1:1;
  unsigned ANSB2:1;
  unsigned ANSB3:1;
  unsigned ANSB4:1;
  unsigned ANSB5:1;
} ANSELBbits;

non siano legate o comunque non si evince da queste poche righe. Una cosa è la variabile di tipo unsigned char ANSELB ed un'altra è la struct ANSELbits, la cui modalità di accesso è completamente differente.
Forse ti confondi perché sai che puoi ad es. accedere ad un registro intero così:
Codice: Seleziona tutto
LATD0 = 1;

o ad una sua parte cosi:
Codice: Seleziona tutto
LATDbits.LATD0 = 1;

ma ciò è possibile perché sono stati definiti LATD0 e LATDbits in modo diverso (in particolare LATDbits dovrebbe essere una struct), correggetemi se sbaglio.
Avatar utente
Foto Utenteemacar
156 6
Frequentatore
Frequentatore
 
Messaggi: 145
Iscritto il: 3 dic 2013, 11:02

0
voti

[9] Re: Accedere ai singoli bit di una variabile C18

Messaggioda Foto UtenteJAndrea » 2 set 2014, 17:13

Premetto che la questione, come si evince dal thread non mi é molto chiara e non mi é stato di aiuto il manuale c18.
In buona sostanza io vorrei dichiarare una variabile ad 8 bit, ai quali poter accedere singolarmente, così come vorrei poter assegnare un valore all' intera variabile.
A quanto pare quel che ho scritto non ha senso.
Ditemi se esiste un modo per ottenere quel che chiedo.
P.S per Foto Utenteemacar se io assegno il valore 0xff al registro LATD tutti i bit che lo compongono si trovano a stato logico 1, quindi per esempio LATDbits.LAT1 varrà 1 così come gli altri.
Ora LATDbits é una structure, mentre LATD é una variabile unsigned char.
Come sono collegati i due?
Avatar utente
Foto UtenteJAndrea
2.877 2 5 9
Master
Master
 
Messaggi: 1535
Iscritto il: 16 giu 2011, 15:25
Località: Rovigo

1
voti

[10] Re: Accedere ai singoli bit di una variabile C18

Messaggioda Foto UtenteWALTERmwp » 2 set 2014, 17:29

JAndrea ha scritto:vorrei dichiarare una variabile ad 8 bit, ai quali poter accedere singolarmente, così come vorrei poter assegnare un valore all' intera variabile.
... in tal caso "strutture" ed "union" non servono.
Dichiari semplicemente una variabile unsigned a otto bits, alla quale "accedi" per verificare il valore (stato) di un singolo bit tramite gli operatori bit a bit ( & e | ) o di ogni singolo bit.
Una volta eseguita la "interrogazione" sul bit che ti interessa puoi, eventualmente, depositare il valore 1(uno) o 0(zero) in altra variabile di riferimento, che tu associ appunto al bit che hai verificato.
Questo, se vuoi, ammesso ti semplifichi la stesura del codice: la variabile di riferimento, poi, la vai ad "interrogare" per "vera" o "falsa".
Altrimenti lavori con gli operatori di cui sopra.
Però, a questo punto, non so se ho interpretato correttamente la tua esigenza.

Saluti

p.s.
ho scordato: ricorrendo ai medesimi operatori esegui la scrittura (0 oppure 1) del bit che devi modificare.
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6444
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti