You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

222 lines
4.0 KiB

14 bit registers
extra bits at end are ignored
data sheet for mxp4725 page 25 is good example
you send something like
4 bytes
first is address byte
which is found via
(defun scn ()
(dotimes (p 127)
(with-i2c (str p)
(when str (print p)))))
then
run
(scn)
in ulisp
three bytes will be as in page 25
8 bit bytes
as in ulisp i2c page:
//
Writing to a slave
For example, to write the three bytes 0, 1, and 2 to a slave device with address #x70 you would use:
(with-i2c (str #x70)
(write-byte 0 str)
(write-byte 1 str)
(write-byte 2 str))
//
so as a test
i want to write
0b01000000
first byte
second byte will be
0-4096
divided across
two bytes with last 4 bits being blank
so just play around.
0b11110000
0b11110000
two bytes of that
and see what outputs.
can we output binary direct into i2c in ulisp? or do we need
decimal?
so basic test:
(with-i2c (str #x96)
(write-byte #b01000000 str)
(write-byte #b11110000 str)
(write-byte #b11110000 str))
that doesn't work
(with-i2c (str #x96)
(write-byte 0b01000000 str)
(write-byte 0b11110000 str)
(write-byte 0b11110000 str))
error: no room for long symbols
in that case
(with-i2c (str #x96)
(write-byte 64 str)
(write-byte 192 str)
(write-byte 192 str))
note: 192 == 11000000
sorry
needs to be in function
(defun go ()
(with-i2c (str #x96)
(write-byte #x40 str)
(write-byte #xc0 str)
(write-byte #xc0 str)))
still getting
256> (go)
@⸮⸮
nil
doesnt' seem to send the bytes i want...
EDIT: the address bit is
decimal 96, not hex 96. got this in 5-10 minutes.
ok
(defun go2 ()
(with-i2c (str 96)
(write-byte #x40 str)
(write-byte #xc0 str)
(write-byte #xc0 str)))
256> (defun go2 () (with-i2c (str 96) (write-byte #x40 str) (write-byte #xc0 str) (write-byte #xc0 str)))
go2
229> (go2)
nil
so, nil. no response from mcp, but
now output is 4 volts. success.
that's pretty much it for a test. now just to clarify the numbers I need to
get 0-1V and also to get 1v on output when it starts up (via eeprom)
let's play first.
(defun go2 ()
(with-i2c (str 96)
(write-byte #x40 str)
(write-byte #x00 str)
(write-byte #xA0 str)))
redefining functions, saves on memory
(defun go2 ()
(with-i2c (str 96)
(write-byte #x40 str)
(write-byte #x0F str)
(write-byte #xF0 str)))
about 500mV
(defun go2 ()
(with-i2c (str 96)
(write-byte #x40 str)
(write-byte #xFF str)
(write-byte #xF0 str)))
max at 5v
(defun go2 ()
(with-i2c (str 96)
(write-byte #x40 str)
(write-byte #xFF str)
(write-byte #x00 str)))
still max
(defun go2 ()
(with-i2c (str 96)
(write-byte #x40 str)
(write-byte #x4F str)
(write-byte #x00 str)))
1.75V
pretty much that last byte is useless. small amounts of resolution
in this application
so let's focus on byte 2
(defun go2 ()
(with-i2c (str 96)
(write-byte #x40 str)
(write-byte 200 str)
(write-byte #x00 str)))
4volts
I need a printout of hex to byte for 0-F on my wall...
but instead, lets use decimal. easier here.
(defun go2 ()
(with-i2c (str 96)
(write-byte #x40 str)
(write-byte 100 str)
(write-byte #x00 str)))
2.05volts
1.05 volts for 50
since 50 is roughly 1/5 of 255... 1/5 of VDD
so i want my cpu load converted from whatever it is, to a number
from 0-1, then take 0-1 of 48 or so.
if you send this:
(defun go2 () (with-i2c (str 96) (write-byte #x40 str) (write-byte 48 str) (write-byte #x00 str))) (go2)
as one line, you can see it change instantly. (not using variables yet)
so 47 is 1 volt. that will be 100%
0 will be 0.
basically done.
now to write 0 to eeprom
(defun go2 ()
(with-i2c (str 96)
(write-byte #x60 str)
(write-byte 0 str)
(write-byte 0 str)))
let's restart and make sure its at 0.
otherwise my dial will break
looks good. EDIT: well it's at 200mV, but good enough for now.
don't care really, as long as its lthan 1v.
let's write again. wrote to ram. works. restarted, and value is at 200mv.
OK. all set. Now to build and deploy.