Pagina 1 di 2

Microcontrollore

MessaggioInviato: 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. :D

Re: Microcontrollore

MessaggioInviato: 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

MessaggioInviato: 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

MessaggioInviato: 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

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

Re: Microcontrollore

MessaggioInviato: 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

MessaggioInviato: 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

MessaggioInviato: 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

MessaggioInviato: 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

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