Pagina 1 di 2
Microcontrollore

Inviato:
25 mag 2012, 10:55
da Chip87
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.

Re: Microcontrollore

Inviato:
25 mag 2012, 11:06
da DADO91
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?
Re: Microcontrollore

Inviato:
25 mag 2012, 11:11
da Chip87
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.
Re: Microcontrollore

Inviato:
25 mag 2012, 11:45
da Paolino
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.
Re: Microcontrollore

Inviato:
25 mag 2012, 12:32
da Chip87
ci provo......
grazie di tutto per ora
Re: Microcontrollore

Inviato:
25 mag 2012, 13:10
da TardoFreak
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
- 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.
Re: Microcontrollore

Inviato:
31 mag 2012, 13:24
da Chip87
una piccola curiosità, l'istruzione MOVF f,d non mi carica il dato nell'accumulatore, da cosa è dovuto secondo voi....?
Re: Microcontrollore

Inviato:
31 mag 2012, 13:32
da left
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
Re: Microcontrollore

Inviato:
31 mag 2012, 13:43
da Chip87
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
Re: Microcontrollore

Inviato:
31 mag 2012, 14:22
da Cox
Ciao, come hai dichiarato CHO_HIGH ?
Io ho perso un settimana per averla dichiarata senza "res" !!!