Valore bit di variabili char (RISOLTO)
12 Anni 1 Mese fa - 12 Anni 1 Mese fa #6
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Valore bit di variabili char
...al morale vale ancora!
...ma la devo rileggere bene anche io...
...quell'altrove e' proprio il pezzo mancante che chiude l'anello.
Rivedendo il codice che ho postato effettivamente REFLECT e REFLECTbits sono due cose differenti che non sono legate tra loro.
In questo post e' spiegato come risolvere il problema.
Probabilmente usare una unione e' la cosa piu' semplice ma devi accedere alla variabile intera in questo modo REFLECT.byte o qualcosa di simile.
Saluti,
Mauro
...ma la devo rileggere bene anche io...
...quell'altrove e' proprio il pezzo mancante che chiude l'anello.
Rivedendo il codice che ho postato effettivamente REFLECT e REFLECTbits sono due cose differenti che non sono legate tra loro.
In questo post e' spiegato come risolvere il problema.
Probabilmente usare una unione e' la cosa piu' semplice ma devi accedere alla variabile intera in questo modo REFLECT.byte o qualcosa di simile.
Saluti,
Mauro
Ultima Modifica 12 Anni 1 Mese fa da Mauro Laurenti.
Ringraziano per il messaggio: shinshi
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Mauro Laurenti
- Moderator
Riduci
Di più
12 Anni 1 Mese fa #7
da shinshi
Risposta da shinshi al topic Re: Valore bit di variabili char
Ho testato il primo metodo su freadom2 con il seguente programmino e funziona:
#include <p18f4550.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici
typedef union tagREFLECT {
char byte;
struct {
unsigned R0:1;
unsigned R1:1;
unsigned R2:1;
unsigned R3:1;
unsigned R4:1;
unsigned R5:1;
unsigned R6:1;
unsigned R7:1;
};
} REFLECT_t;
void main (void){
REFLECT_t REFLECT; // dichiaro REFLECT
REFLECT.byte = 0b10101010;
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi
LATC = 0x00;
TRISC = 0xFF;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0b00000000;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
LATDbits.LATD0 = REFLECT.R0;
LATDbits.LATD1 = REFLECT.R1;
LATDbits.LATD2 = REFLECT.R2;
LATDbits.LATD3 = REFLECT.R3;
LATDbits.LATD4 = REFLECT.R4;
LATDbits.LATD5 = REFLECT.R5;
LATDbits.LATD6 = REFLECT.R6;
LATDbits.LATD7 = REFLECT.R7;
// Ciclo infinito
while (1) {
}
}
#include <p18f4550.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici
typedef union tagREFLECT {
char byte;
struct {
unsigned R0:1;
unsigned R1:1;
unsigned R2:1;
unsigned R3:1;
unsigned R4:1;
unsigned R5:1;
unsigned R6:1;
unsigned R7:1;
};
} REFLECT_t;
void main (void){
REFLECT_t REFLECT; // dichiaro REFLECT
REFLECT.byte = 0b10101010;
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi
LATC = 0x00;
TRISC = 0xFF;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0b00000000;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
LATDbits.LATD0 = REFLECT.R0;
LATDbits.LATD1 = REFLECT.R1;
LATDbits.LATD2 = REFLECT.R2;
LATDbits.LATD3 = REFLECT.R3;
LATDbits.LATD4 = REFLECT.R4;
LATDbits.LATD5 = REFLECT.R5;
LATDbits.LATD6 = REFLECT.R6;
LATDbits.LATD7 = REFLECT.R7;
// Ciclo infinito
while (1) {
}
}
Si prega Accedi o Crea un account a partecipare alla conversazione.
- shinshi
- Autore della discussione
- Elite Member
Riduci
Di più
- Messaggi: 293
- Ringraziamenti ricevuti 29
12 Anni 1 Mese fa #8
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Valore bit di variabili char
probabilmente questa e' la soluzione migliore perche' usa il C standard ed e' valida anche per altri compilatori/microcontrollori.
Rispetto al bitmasking una struttura potrebbe non essere efficiente visto che in questo caso il compilatore non puo', o e' improbabile, che indovini i tuoi intenti accesso a byte e/o bit . Questo non e' valido con PORTA e PORTAbits (o altri registri), visto che il compilatore sa che e' una porta e puo' quindi ottimizzare il codice facendo uso del bit masking.
Saluti,
Mauro
Rispetto al bitmasking una struttura potrebbe non essere efficiente visto che in questo caso il compilatore non puo', o e' improbabile, che indovini i tuoi intenti accesso a byte e/o bit . Questo non e' valido con PORTA e PORTAbits (o altri registri), visto che il compilatore sa che e' una porta e puo' quindi ottimizzare il codice facendo uso del bit masking.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
12 Anni 1 Mese fa #9
da shinshi
Risposta da shinshi al topic Re: Valore bit di variabili char
Credo anchio sia il metodo migliore ma soprattutto più "pulito". Per ulteriore prova ho fatto anche il contrario, ovvero setto i bit e leggo il byte:
#include <p18f4550.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici
typedef union tagREFLECT {
char byte;
struct {
unsigned R0:1;
unsigned R1:1;
unsigned R2:1;
unsigned R3:1;
unsigned R4:1;
unsigned R5:1;
unsigned R6:1;
unsigned R7:1;
};
} REFLECT_t;
void main (void){
REFLECT_t REFLECT; // dichiaro REFLECT
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi
LATC = 0x00;
TRISC = 0xFF;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0b00000000;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
REFLECT.R0 = 0;
REFLECT.R1 = 0;
REFLECT.R2 = 1;
REFLECT.R3 = 1;
REFLECT.R4 = 1;
REFLECT.R5 = 0;
REFLECT.R6 = 1;
REFLECT.R7 = 0;
LATD = REFLECT.byte;
// Ciclo infinito
while (1) {
}
}
#include <p18f4550.h>
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici
typedef union tagREFLECT {
char byte;
struct {
unsigned R0:1;
unsigned R1:1;
unsigned R2:1;
unsigned R3:1;
unsigned R4:1;
unsigned R5:1;
unsigned R6:1;
unsigned R7:1;
};
} REFLECT_t;
void main (void){
REFLECT_t REFLECT; // dichiaro REFLECT
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi
LATC = 0x00;
TRISC = 0xFF;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0b00000000;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
REFLECT.R0 = 0;
REFLECT.R1 = 0;
REFLECT.R2 = 1;
REFLECT.R3 = 1;
REFLECT.R4 = 1;
REFLECT.R5 = 0;
REFLECT.R6 = 1;
REFLECT.R7 = 0;
LATD = REFLECT.byte;
// Ciclo infinito
while (1) {
}
}
Si prega Accedi o Crea un account a partecipare alla conversazione.
- shinshi
- Autore della discussione
- Elite Member
Riduci
Di più
- Messaggi: 293
- Ringraziamenti ricevuti 29
12 Anni 1 Mese fa #10
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Valore bit di variabili char (RISOLTO)
Dal momento che non affermi che non funziona, presumo che funzioni!
Saluti,
Mauro
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.