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.