Voleo chiedervi se nelle istruzione contenute nel PIC 16f873 esiste un modo semplice per suddividere il numero binario a 8 bit in due nibbles, cioe due gruppi da 4 bit per la visualizzazione su due display 7 segmenti. In pratica devo effettutare una converione binario/bcd col PIC.
Microcontrollore
Moderatori:
carloc,
g.schgor,
BrunoValente,
IsidoroKZ
14 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
[1] Microcontrollore
Salve, sono nuovo del forum.
Voleo chiedervi se nelle istruzione contenute nel PIC 16f873 esiste un modo semplice per suddividere il numero binario a 8 bit in due nibbles, cioe due gruppi da 4 bit per la visualizzazione su due display 7 segmenti. In pratica devo effettutare una converione binario/bcd col PIC.
Voleo chiedervi se nelle istruzione contenute nel PIC 16f873 esiste un modo semplice per suddividere il numero binario a 8 bit in due nibbles, cioe due gruppi da 4 bit per la visualizzazione su due display 7 segmenti. In pratica devo effettutare una converione binario/bcd col PIC.
0
voti
Sappi che la semplice suddivisione di 8 bit in gruppi da 4, non fa una conversione bin->dec.
Semmai bin->hex, anche perché il massimo numero rappresentabile con 8bit è 255 e quindi con 2 display non fai niente.
Cosa vuoi fare precisamente?
Semmai bin->hex, anche perché il massimo numero rappresentabile con 8bit è 255 e quindi con 2 display non fai niente.
Cosa vuoi fare precisamente?
-

DADO91
3.552 3 12 13 - Expert EY

- Messaggi: 965
- Iscritto il: 27 feb 2009, 18:19
- Località: Prov. di Firenze
0
voti
Col PIC 16f873 prima effetuo una conversione A/D e poi devo convertire il numero binario in bcd per la visualizzazione su due display 7 segmenti.
0
voti
La cosa più semplice da fare è la mascheratura.
Ad esempio:
byte di origine: 0x57
Lo metti in AND con 0x0F e ottieni:
0x57 AND 0x0F = 0x07
Lo metti in AND con 0xF0, fai uno shift a destra di 4 posizione e ottieni:
(0x57 AND 0xF0)>>4 = 0x05
Per lo shift a dx dovrai usare le istruzioni di rotate.
Ciao.
Paolo.
Ad esempio:
byte di origine: 0x57
Lo metti in AND con 0x0F e ottieni:
0x57 AND 0x0F = 0x07
Lo metti in AND con 0xF0, fai uno shift a destra di 4 posizione e ottieni:
(0x57 AND 0xF0)>>4 = 0x05
Per lo shift a dx dovrai usare le istruzioni di rotate.
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
2
voti
Per fare la conversione da esadecimale a decimale di un byte:
- Si isola la parte bassa del byte con un' operazione di and 0x0F.
- Se il risultato è maggiore di 0x09 si aggiunge al byte originario 0x06
- Si isola la parte alta del byte eventualmente modificato con un' operazione di and con 0xF0
- Se il risultato è maggiore di 0x90 si aggiunge al byte originario 0x60.
Scritto in C
Chiaramente la cosa vale solo per dati che vanno da 0 a 0x63 altrimenti si perde il riporto.
- Si isola la parte bassa del byte con un' operazione di and 0x0F.
- Se il risultato è maggiore di 0x09 si aggiunge al byte originario 0x06
- Si isola la parte alta del byte eventualmente modificato con un' operazione di and con 0xF0
- Se il risultato è maggiore di 0x90 si aggiunge al byte originario 0x60.
Scritto in C
- Codice: Seleziona tutto
unsigned char decimalAdjust(unsigned char dato)
{
if ((dato & 0x0F) > 0x09) dato += 0x06;
if ((dato & 0xF0) > 0x90) dato += 0x60;
return (dato);
}
Chiaramente la cosa vale solo per dati che vanno da 0 a 0x63 altrimenti si perde il riporto.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
una piccola curiosità, l'istruzione MOVF f,d non mi carica il dato nell'accumulatore, da cosa è dovuto secondo voi....?
0
voti
Chip87 ha scritto:una piccola curiosità, l'istruzione MOVF f,d non mi carica il dato nell'accumulatore, da cosa è dovuto secondo voi....?
come spiega il datasheet:
movf registro,0 => risultato in W
movf registro,1 => risultato in f
0
voti
Su quello non c'e dubbio, ma per esempio io ho impostato l'istruzione in tale modo:
MOVF CHO_HIGH,0
MOVWF R0
MA L'ISTRUZIONE "MOVF" NON MI SPOSTA IL DATO NELL'ACCUMULATORE
MOVF CHO_HIGH,0
MOVWF R0
MA L'ISTRUZIONE "MOVF" NON MI SPOSTA IL DATO NELL'ACCUMULATORE
14 messaggi
• Pagina 1 di 2 • 1, 2
Chi c’è in linea
Visitano il forum: Nessuno e 95 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


