Hello guys, reliving this old topic. I sucessed on reading HX711 with ULP coprocessor. I achieve this a few days later my post here, but i completely forgot to post the code for those who may need to do this in future. Since ULP is a small processor, i tought easier to work just with the 24 bits decimal value read from HX711, instead of converting this decimal value to weight and then analysing the value. The system wake up if the value read from HX711 is higher than a threshold (that is calculated by main processor equivalent to an weight threshold). The comments are in portuguese, but i guess google translator can translate it easily
Code: Select all
#include "soc/soc_ulp.h"
#include "soc/rtc_io_reg.h"
#include "soc/sens_reg.h"
#include "soc/rtc_cntl_reg.h"
.data
.global trshHoldADMSB
trshHoldADMSB: .long 0x00
.global trshHoldADLSB
trshHoldADLSB: .long 0x00
.bss//Variaveis sao declaradas dentro da secao .bss
.global bytelsb
bytelsb: .long 0
.global bytemsb
bytemsb: .long 0
.global valorADMSB
valorADMSB: .long 0
.global valorADLSB
valorADLSB: .long 0
.global debugVar
debugVar: .long 0
.global contador
contador: .long 0
.global MediaZeroTaraMSB
MediaZeroTaraMSB: .long 0
.global MediaZeroTaraLSB
MediaZeroTaraLSB: .long 0
.text//O codigo é feito dentro da secao .text
.global main
main://O codigo e iniciado aqui, equivale ao void setup()
WRITE_RTC_REG(RTC_GPIO_OUT_W1TS_REG, RTC_GPIO_OUT_DATA_W1TS_S+12, 1, 1)//sobe add0
jump loop
loop: //add0 = 9 adsk = 8
move r3, 0x00
move r1, bytelsb
st r3, r1, 0
move r3, 0x00
move r2, bytemsb
st r3, r2, 0
WRITE_RTC_REG(RTC_GPIO_OUT_W1TS_REG, RTC_GPIO_OUT_DATA_W1TS_S+9, 1, 1)//sobe add0
WRITE_RTC_REG(RTC_GPIO_OUT_W1TC_REG, RTC_GPIO_OUT_DATA_W1TC_S+8, 1, 1)//desce adsk
le_add0:
READ_RTC_REG(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT_S + 9, 1) // le gpio_num_15 = rtc gpio 13
and r0, r0, 1 // faz uma and do valor lido com 0x01
jumpr le_add0, 1, eq // se o valor de r0 for igual 1, volta para ler dnv add0
stage_rst
loop_count:
WRITE_RTC_REG(RTC_GPIO_OUT_W1TS_REG, RTC_GPIO_OUT_DATA_W1TC_S+8, 1, 1)//sobe adsk
move r1, bytelsb
ld r1, r1, 0
move r2, bytemsb
ld r2, r2, 0
move r1, bytelsb
ld r1, r1, 0
move r2, bytemsb
ld r2, r2, 0
and r0, r1, 0x8000 // R0 = R1 & 0X8000
jumpr b_lsb_1, 32767, gt// if R1 (LSB BYte) MSB BIT is 1, R0 will be greater than 32767 then jump to b_lsb_1
b_lsb_0: // R1 MSB Bit equal 0
move r0, r1
lsh r0, r0, 1 // shift 1 bit left from LSB Byte
move r1, bytelsb
st r0, r1, 0
move r0, r2
lsh r0, r0, 1 // shift 1 bit left from MSB Byte
move r2, bytemsb
st r0, r2, 0
jump inc_count
b_lsb_1: // R1 MSB Bit equal 1
move r0, r1
lsh r0, r0, 0x01 // shift 1 bit left from lsb byte
move r1, bytelsb
st r0, r1, 0
move r0, r2
lsh r0, r0, 0x01 // shift 1 bit left from msb byte
add r0, r0, 1 // add 1 to the value corresponding to MSB bit from LSB byte that now is LSB bit of MSB Byte.
move r2, bytemsb
st r0, r2, 0
inc_count:
WRITE_RTC_REG(RTC_GPIO_OUT_W1TC_REG, RTC_GPIO_OUT_DATA_W1TC_S+8, 1, 1)//desce adsk
READ_RTC_REG(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT_S + 9, 1) // le gpio_num_15 = rtc gpio 13
and r0, r0, 1 // faz uma and do valor lido com 0x01
jumpr fim_loop, 0, eq // se o valor de r0 for igual zero significa q gpio esta baixo então n incrementa r1
move r1, bytelsb
ld r0, r1, 0
add r0, r0, 1
jump ovflw_soma, ov
move r3, bytelsb
st r0, r3, 0
jump fim_loop
ovflw_soma:
move r3, bytelsb
st r0, r3, 0
move r3, bytemsb
ld r0, r3, 0
add r0, r0, 1
st r0, r3, 0
fim_loop:
stage_inc 1
jumps loop_count, 24, lt
xor:
move r2, bytemsb
ld r2, r2, 0
WRITE_RTC_REG(RTC_GPIO_OUT_W1TS_REG, RTC_GPIO_OUT_DATA_W1TC_S+8, 1, 1)//sobe adsk
and r3,r2,0x0080
or r0,r2,0x0080
sub r0,r0,r3
sub r0,r0,r3
move r2, r0
move r3, valorADMSB
st r2, r3, 0
move r3, valorADLSB
move r1, bytelsb
ld r1, r1, 0
st r1, r3, 0
//lsb nao precisa de xor já que o valor feito o xor em 32bits é 0x00800000, portanto todo o LSB seria feito o xor com 0x00
// em que o resultado é igual a entrada.
fim:
WRITE_RTC_REG(RTC_GPIO_OUT_W1TC_REG, RTC_GPIO_OUT_DATA_W1TC_S+8, 1, 1)//desce adsk
compair_trshHold:
move r2, trshHoldADMSB
ld r2, r2, 0
move r3, valorADMSB
ld r3, r3, 0
sub r0, r2, r3
jumpr msb_igual, 0, eq
jump wake_up, ov // overflow significa que r3 > r2 portanto vloadAD > threshHold
// msb ad menor q threshhold
move r3, debugVar
move r0, 0x05
st r0, r3, 0
jump loop
msb_igual:
move r3, debugVar
move r0, 0x07
st r0, r3, 0
move r2, trshHoldADLSB
ld r2, r2, 0
move r3, valorADLSB
ld r3, r3, 0
sub r0, r2, r3
move r1, contador
st r0, r1, 0
jump wake_up, ov // overflow significa que r3 > r2 portanto vloadAD > threshHold
jump loop
wake_up:
move r3, debugVar
move r0, 0x06
st r0, r3, 0
/* Check if the system can be woken up */
READ_RTC_FIELD(RTC_CNTL_LOW_POWER_ST_REG, RTC_CNTL_RDY_FOR_WAKEUP)
and r0, r0, 1
jump loop, eq
/* Wake up the SoC, end program */
wake
WRITE_RTC_FIELD(RTC_CNTL_STATE0_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN, 0)
halt