Newsgroup: it.hobby.elettronica.digitale
Titolo: PIC e getione numeri negativi a 12 bit

Ciao a tutti,
ho un sensore di temperatura (DS 1631) che mi fornisce una temperatura a 12
bit, organizzata in due byte in questa maniera:
1 byte: Segno 2^6 2^5 2^4 2^3 2^2 2^1 2^0
2 byte: 2^-1 2^-2 2^-3 2^-4 0 0 0 0
Ora, devo gestire la visualizzazione della temperatura su un LCD, e ho
pensato di convertire il numero in BCD, utilizzando la routine presente
nelle Application Notes di Microchip.
Non ho problemi nella conversione di un numero positivo: S è 0, e quindi
prendo il primo byte (che praticamente mi da la parte intera) e la converto
in BCD. Per la parte in virgola fissa (il 2° byte quindi) ho implementato
una specie di LUT, look up table, e va benone, visto che ci sono solo16 casi
possibili (solo 4 byte infatti determinano la parte decimale della
temperatura, ad ogni modo accetto suggerimenti).
Il problema nasce quando devo visualizzare dei numeri negativi, codificati
in complemento a 2, in cui il complemento a 2 è gestito solo sui 12 bit
significativi (i quattro zeri del secondo byte sono fissi, non cambiano
mai). Cioè ad esempio -25.0625 è: 1110 0110 1111 0000
Ora, io ho pensato di controllare il bit di segno, e se è negativo
visualizzo il - sullo schermo, dopodichè converto il dato di 12 bit nella
codifica senza segno, e da qui visualizzo nuovamente il numero positivo,
come già implementato.
Cioè, inverto i 12 bit del negativo e sommo 1. -25.0625 diventerebbe: 0001
1001 0000 + 1 --> 0001 1001 0001
Cosa ne pensate? C'è senza dubbio un metodo migliore per visualizzare
sull'LCD la temperatura...
Ad ogni modo, usando questo metodo ho un problemino: come sommo 1 ad un
numero di 12 bit? Devo fare uno shift a destra di 4 bit dei due registri in
cui memorizzo i 16 bit, in modo da portare gli 8 bit meno significativi in
un unico byte di memoria, e gli altri 4 nell'altro? Come gestisco il riporto
fra i due "pezzi"? Il riporto verso gli altri 4 bit mi salta fuori solo se i
primi 8 sono tutti 1 giusto? Una volta eseguita la somma dovrei,
naturalmente, shifttare di 4 posti a sinistra, per riportarmi alla
situazione "standard" del mio progetto....
Funziona ?
Non c'è un metodo più elegante?
Grazie a tutti!
Nick

 numero di 12 bit? 
cut
Forse è possibile sommare un bit in 5° posizione (ovvero 1 0000)
lasciando invariato il formato dei due byte
piuttosto che shiftare + sommare 1 + rishiftare di nuovo.
In ogni caso, fai la somma sul byte meno significativo,
poi controlli se la somma ha generato un riporto e,
in questo caso, sommi un LSB (ovvero un 1) al byte più significativo.
Saluti
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Nick
Ciao, così, al volo, senza responsabilità!!! Non l'ho provato!
Creati una macro per la somma a 16 bit tra una variabile a 16 bit e un
numero a 16 bit:
----------------------------------------------------------------------------
--------------
; Somma a 16 bit (var = var + n) (n1 parte meno pesante, n2 parte più
pesante)
;---------------------------------------------------------------------------
---------------
Addlf16  macro  var,n2,n1
         movlw  n1
         addwf  var,f
         btfsc  STATUS,C
         incf   var+1,f
         movlw  n2
         addwf  var+1,f
         endm
in n1 metterai il binario "0001000", mentre in n2 metterai "00000000";
in var andrà la parte meno pesante della codifica a 12 bit, mentre in var+1
la parte più pesante.
Eseguendo la somma in questo modo, non devi shiftare e non devi preoccuparti
del riporto in quanto si aggiusta tutto.
Come ti ho detto, io non ho provato, ma dovrebbe funzionare. Prova e fammi
sapere