[Message Prev][Message
Next][Thread Prev][Thread Next][Message
Index][Thread Index]
Re: [OT] Some pic asm code help
I see an immediate problem in the code as you are SUBTRACING the mask
not ANDing !
and you can make the rotates a lot simpler... (without firing up my
simulator and checking)
HTH Stephen
Try this :-
CEL2760
;rotate both (don't worry about carrys into MSB as you will mask later)
rrf DS_DATA1,1 ;shift down MSB and move bit into carry
rrf DS_DATA0,1 ;then move it into the LSB and move it down
rrf DS_DATA1,1 ;and again
rrf DS_DATA0,1
rrf DS_DATA1,1 ;and again
rrf DS_DATA0,1
btfss DS_DATA1,4 ;check sign status
goto mask_up_nib ;
comf DS_DATA1,1 ;yes , 2,s compliment
comf DS_DATA0,1 ;invert and
incf DS_DATA0,1 ;add 1
btfsc C_bit ;
incf DS_DATA1,1 ;
mask_up_nib
movlw 0fh ;mask out rubbish
andwf DS_DATA1,1
cely return ;
Frank Mc Alinden wrote:
>
>
> Hi Ian
>
> I forgot to rotate the MSB so those values in my last post are way
out....
> try these MSB D2h .....LSB BBh................MSB D1h.....LSB F0h
>
> Heres a copy of my current code which is suppose to convert the raw
dat to
> 16 bit
>
> Thanks agian
> Frank
>
> CEL2760
>
> bcf neg ;clear negative flag
> btfss DS_DATA1,7 ;negative ? if yes , skip next
> goto cel2 ;no
>
> bsf neg ;set negative flag
>
> cel2 ;rotate LSB
>
> bcf C_bit ;clear carry flag
> rrf DS_DATA0,1 ;Data0 holds LSB data (0F)
>
> bcf C_bit ;clear carry flag
> rrf DS_DATA0,1 ;
>
> bcf C_bit ;clear carry flag
> rrf DS_DATA0,1
>
> ;SHIFT AND ROTATE MSB
>
> chec_msb_bit0
> btfss DS_DATA1,0 ;Check MSB Byte bit 0
> goto set_lsb_5_lo ;
> bsf DS_DATA0,5 ;set bit 5 of lsb byte
> goto chec_msb_1 ;
>
> set_lsb_5_lo
> bcf DS_DATA0,5 ;
>
> chec_msb_1
>
> btfss DS_DATA1,1 ;Check MSB Byte bit 1
> goto set_lsb_6_lo ;
> bsf DS_DATA0,6 ;set bit 6 of lsb byte
> goto chec_msb_2 ;
>
> set_lsb_6_lo
> bcf DS_DATA0,6 ;
>
> chec_msb_2
> btfss DS_DATA1,2 ;Check MSB Byte bit 2
> goto set_lsb_7_lo ;
> bsf DS_DATA0,7 ;set bit 7 of lsb byte
> goto shift_data1 ;
>
> set_lsb_7_lo
> bcf DS_DATA0,7 ;
>
> shift_data1
>
> bcf DS_DATA1,0 ;
> bcf DS_DATA1,1 ;
> bcf DS_DATA1,2 ;
>
> bcf C_bit ;clear carry flag
> rrf DS_DATA1,1 ;
>
> bcf C_bit ;clear carry flag
> rrf DS_DATA1,1 ;
>
> bcf C_bit ;clear carry flag
> rrf DS_DATA1,1 ;
>
> btfss neg ;check sign status
> goto mask_up_nib ;
>
> comf DS_DATA1,1 ;yes , 2,s compliment
>
> comf DS_DATA0,1 ;yes , 2,s compliment
> incf DS_DATA0,1 ;
>
> btfsc C_bit ;
> incf DS_DATA1,1 ;
>
> mask_up_nib
>
> movlw 0fh ;mask upper nibble
> subwf DS_DATA1,1 ;
>
> cely return ;
>
> ----- Original Message -----
> From: "Ian Davidson" <ian@xxxxxxx <mailto:ian%40galeforce9.co.uk>>
> To: <ukha_d@xxxxxxx <mailto:ukha_d%40yahoogroups.com>>
> Sent: Sunday, September 09, 2007 6:45 PM
> Subject: RE: [ukha_d] [OT] Some pic asm code help
>
> > Hi Frank
> >
> > As a first test I would read the device and output the actual
raw word
> > value you read. Then manually convert this. This will prove if
you are
> > actually reading the correct value and converting wrong or if
the raw
> > value is wrong in the first place. If you want to post the raw
values I
> > can convert them here and let you know what I get the result to
be.
> >
> > Ok just reading your post again.
> >
> > I can see where this is going wrong. You need to do the rotating
first.
> > If you don't then when you add the 1 and later rotate you rotate
it
> > straight off the end. In your case the bit 0 position starts at
bit 3 so
> > instead of adding 1 you would have to add 8 but it is easier
just to
> > rotate first then do the complementing. Also treat the two bytes
as one
> > value so when you complement and add 1 only add 1 to the LSB.
The only
> > other point to watch out for is after you complement you can
mask off
> > the top nibble of the MSB as after rotating the first three are
not used
> > and the next is just the sign bit which is not part of the 2's
> > complement.
> >
> > I hope that made sense it far easier to talk it than write it!
> >
> > Ian D
> >
> >
> > -----Original Message-----
> > From: ukha_d@xxxxxxx <mailto:ukha_d%40yahoogroups.com>
> [mailto:ukha_d@xxxxxxx <mailto:ukha_d%40yahoogroups.com>]
On Behalf
> > Of Frank Mc Alinden
> > Sent: 09 September 2007 08:31
> > To: Ian
> > Subject: Re: [ukha_d] [OT] Some pic asm code help
> >
> > Hi Ian
> >
> > Firstly thanks for your feedback much appreciated...
> >
> > What i have done is this firstly is test bit 7 of the MSB 0E and
if it
> > is
> > set i compliment each byte and add 1 to each of them...??
> >
> > I then rotate right the LSB register OF 3 times each time
clearing the
> > carry flag........
> >
> > I then shift bits 0,1,2 of the MSB into bits 5,6 +7 of the LSB
and
> > rotate
> > the MSB 3 times.........???
> >
> > With the result im using existing sub routines that i use to
convert
> > the
> > ds18s20 results into temperature readings....
> >
> > The results im getting do not tally up with readings im getting
using
> > another device (opnode) which also has moisture sensors attached
to
> > it.........
> >
> > The moisture sensors use an external resistor so the range
should go
> > from
> > +64mV to -64mV
> >
> > Thanks again
> > Frank
> >
> >
> > ----- Original Message -----
> > From: "Ian Davidson" <ian@xxxxxxx
> <mailto:ian%40galeforce9.co.uk>>
> > To: <ukha_d@xxxxxxx <mailto:ukha_d%40yahoogroups.com>>
> > Sent: Sunday, September 09, 2007 12:11 PM
> > Subject: RE: [ukha_d] [OT] Some pic asm code help
> >
> >
> >> Hi Frank
> >>
> >> I've not used that ic before but looking at the data sheet
it works
> > like
> >> this.
> >>
> >> The value you read from the ic will be a word value. It is
left
> >> justified so you need to rotate the value right three times
to get the
> >> LSB into the bit 0 position.
> >>
> >> Say you read
> >> 00000000 01010000
> >>
> >> By rotating it 3 times it will become
> >> 00000000 00001010
> >>
> >> Now you need to test bit 12, in the example it is a zero
which means
> > the
> >> number is a positive number. You can therefore just use that
number in
> >> this case decimal 10. If you are using the internal resistor
then the
> >> resolution is 0.625mA. 10 x 0.625mA is 6.25mA which is the
current the
> >> device is seeing.
> >>
> >> Now if bit 12 was a 1
> >>
> >> I.e.
> >> 00011111 11110110
> >> Then that is a negative number. In two complement you need
to invert
> > all
> >> the bits and add one for all the bits below bit 12 so
> >>
> >> 00000000 00001001
> >>
> >> Add 1
> >>
> >> 00000000 00001010
> >>
> >> Which is 10 decimal times by 0.625mA equals -6.25mA
> >>
> >> I hope that made sense Frank.
> >>
> >> Ian D
> >>
> >>
> >> -----Original Message-----
> >> From: ukha_d@xxxxxxx <mailto:ukha_d%40yahoogroups.com>
> [mailto:ukha_d@xxxxxxx <mailto:ukha_d%40yahoogroups.com>]
On Behalf
> >> Of Frank Mc Alinden
> >> Sent: 08 September 2007 23:45
> >> To: Ian
> >> Subject: [ukha_d] [OT] Some pic asm code help
> >>
> >> Hi Guys
> >>
> >> Sorry for the OT post but im hoping some of the pic coders
can help
> >> me....Im
> >> trying to add support for the Hobby Boards moisture sensor
to my Probe
> >> system and im stuck trying to write some code to convert the
readings
> >> from
> >> the "current registers (OE +OF) " of the
DS2760...(The mositure sensor
> >> uses
> >> the current sense) ...I can read the DS2760 and get the
values i just
> >> cant
> >> work out how to convert it to mVolts.......Any help much
> >> appreciated......If
> >> i get this sorted i will then have a crack at their Humidity
> >> sensor.......
> >> Heres a link to the hobby boards sensor and the DS2760 PDF
> >> http://datasheets.maxim-ic.com/en/ds/DS2760.pdf
> <http://datasheets.maxim-ic.com/en/ds/DS2760.pdf>
> >>
> >>
> >
> http://www.hobby-boards.com/catalog/product_info.php?cPath=22&products_i
> <http://www.hobby-boards.com/catalog/product_info.php?cPath=22&products_i>
> >> d=70
> >>
> >> Thanks
> >> Frank
> >> www.armaghelectrical.com.au
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
>
>
UKHA_D Main Index |
UKHA_D Thread Index |
UKHA_D Home |
Archives Home
|