We have light!! P1 I2C driver questions and PASM
Ludis
Posts: 69
in Propeller 1
I've been working on my own P1 I2C driver based on JonnyMac's I2C demos for P2. I'm attempting to drive14 segment LEDs using a HT16K33 in an adafruit feather. And finally tonight, we have light! lol
In P2, JonnyMac called a method which included PASM code (see below). Is there a way to do something equivalent in P1 where I can call different PASM subroutines? Based on the command or data I'm writing with the HT16K33, I need flexibility to write a different number of bytes.
Can I have multiple DAT structures with a different ORG followed by a number? I've only ever seen P1 code with 1 DAT PASM code. I've attached my P1 driver.
Thanks,
JonnyMac's driver for I2C write in P2
pub write(i2cbyte) : ackbit | scl, sda, tix, bits '' Write byte to I2C bus '' -- leaves SCL low longmove(@scl, @sclpin, 3) ' copy pins & timing org shl i2cbyte, #24 ' align i2cbyte.[7] to i2cbyte.[31] .wr_byte mov bits, #8 ' output 8 bits, msbfirst .wb0 shl i2cbyte, #1 wc ' msb --> c drvc sda ' c -- sda waitx tix ' let sda settle drvh scl ' scl high testp scl wc ' check for clock stretch if_nc jmp #$-2 waitx tix waitx tix drvl scl ' scl low waitx tix djnz bits, #.wb0 .get_ack drvh sda ' pull-up sda waitx tix drvh scl ' scl high testp scl wc ' check for clock stretch if_nc jmp #$-2 waitx tix testp sda wc ' sample sda (ack bit) muxc ackbit, #1 ' update return value waitx tix drvl scl ' scl low waitx tix waitx tix end
HT16K33 has different length for a COMMAND and READ/WRITE.
spin
13K
Comments
Would it help to start with the JonnyMac's P1 versions?
See attached (from GitHub).
yes very much. Thank you.
I started on the path of SPIN code. Then decided to go PASM because I had a brain fart looking at the spec and was thinking SPIN was too slow. I even remember JonnyMac saying that SPIN is NOT too slow in the live forum, so I should have thought about it more at the time. While writing the PASM code I realized that the HT16K33 clock speed is a maximum of 400 kHz and not a minimum. So I figured SPIN might be the answer to my PASM road block. I will try that next! Onward!
I2C uses a clock, hence can run at any speed -- up to a point. I have used my I2C Spin code in numerous commercial products. I wrote the "fast" code to expedite reloading the EEPROM from SD card for the laser tag product.
I've attached my Spin1 code for that display in case you want to have a look.
thanks, Jon! yes I will definitely review your files as I get stuck and as a comparison to what I come up with. Working on the SPIN driver now.
I see what you mean about using the clock as the reference and the speed can vary. Interesting!
On the P1, it is also interesting how to drive the pins for the SDA/SCL with the pull up resisters (Input direction to pull the line high or Output/Low to pull the line low. I'm glad to see you are doing the same thing. All good stuff!
Moving forward...