Forum - MCS Electronics

 HX711 Goto page Previous  1, 2
Author Message
odemmo Joined: 26 Jun 2007
Posts: 19  Posted: Thu Jan 21, 2021 12:59 pm    Post subject: O-Family wrote:
You can create four types of ports for the program you copied and worked on, and call each of them.
 Code: Hx711_clk Alias Portd.2    Hx711_dat Alias Pind.3    '    '  ******************************************************************************    '  * Subroutine to retrieve A/D data from channel A of HX711 with a gain of 128 *  (Hx711ad = 2's complement format 24bit)    '  ******************************************************************************    ' Hx711get:    Hx711ad = 0    For Hx711count = 23 To 0 Step -1                         'Extract 24-bit data.       Set Hx711_clk                                         'Set the [PD_SCK] pin of the HX711 to [H].       Waitus 1                                              'Period of [H]. (T3 = 1uS)       Hx711ad.hx711count = Hx711_dat                        'Place the data of the [DOUT] pin of HX711 in each bit.       Reset Hx711_clk                                       'Set the [PD_SCK] pin of the HX711 to [L].       Waitus 1                                              'Period of [L]. (T4 = 1uS)    Next Hx711count    '    '  * Send the 25th clock pulse (set channel A and gain to 128 for the next conversion) *    '    Set Hx711_clk                                            'Set the [PD_SCK] pin of the HX711 to [H].    Waitus 1                                                 'Period of [H]. (T3 = 1uS)    Reset Hx711_clk                                          'Set the [PD_SCK] pin of the HX711 to [L].    Waitus 1                                                 'Period of [L]. (T4 = 1uS)    '    If Hx711ad.23 = 1 Then                                   'Is the 24-bit value of A/D a negative value?       Hx711ad = Hx711ad Or &HFF000000                       'Set to a negative value of 32 bits.    End If    Return

Assign 4 types of ports directly to 4 types of subroutines as shown below.
 Code: Hx711get1:    Hx711ad = 0    For Hx711count = 23 To 0 Step -1                         'Extract 24-bit data.       Set Portd.2                                           'Set the [PD_SCK] pin of the HX711 to [H].       Waitus 1                                              'Period of [H]. (T3 = 1uS)       Hx711ad.hx711count = Pind.3                           'Place the data of the [DOUT] pin of HX711 in each bit.       Reset Portd.2                                         'Set the [PD_SCK] pin of the HX711 to [L].       Waitus 1                                              'Period of [L]. (T4 = 1uS)    Next Hx711count    '    '  * Send the 25th clock pulse (set channel A and gain to 128 for the next conversion) *    '    Set Portd.2                                              'Set the [PD_SCK] pin of the HX711 to [H].    Waitus 1                                                 'Period of [H]. (T3 = 1uS)    Reset Portd.2                                            'Set the [PD_SCK] pin of the HX711 to [L].    Waitus 1                                                 'Period of [L]. (T4 = 1uS)    '    If Hx711ad.23 = 1 Then                                   'Is the 24-bit value of A/D a negative value?       Hx711ad = Hx711ad Or &HFF000000                       'Set to a negative value of 32 bits.    End If    Return '--------------------------------------------------------------- Hx711get2:    Hx711ad = 0    For Hx711count = 23 To 0 Step -1                         'Extract 24-bit data.       Set Portd.4                                           'Set the [PD_SCK] pin of the HX711 to [H].       Waitus 1                                              'Period of [H]. (T3 = 1uS)       Hx711ad.hx711count = Pind.5                           'Place the data of the [DOUT] pin of HX711 in each bit.       Reset Portd.4                                         'Set the [PD_SCK] pin of the HX711 to [L].       Waitus 1                                              'Period of [L]. (T4 = 1uS)    Next Hx711count    '    '  * Send the 25th clock pulse (set channel A and gain to 128 for the next conversion) *    '    Set Portd.4                                              'Set the [PD_SCK] pin of the HX711 to [H].    Waitus 1                                                 'Period of [H]. (T3 = 1uS)    Reset Portd.4                                            'Set the [PD_SCK] pin of the HX711 to [L].    Waitus 1                                                 'Period of [L]. (T4 = 1uS)    '    If Hx711ad.23 = 1 Then                                   'Is the 24-bit value of A/D a negative value?       Hx711ad = Hx711ad Or &HFF000000                       'Set to a negative value of 32 bits.    End If    Return '--------------------------------------------------------------- Hx711get3: '--------------------------------------------------------------- Hx711get4:

If your technology makes it difficult to create a complete program, please contact me directly on the bulletin board on my site. (English is also acceptable)

Thanks, but where / how to call up these subroutines?

Oddvar  Duval JP  Joined: 22 Jun 2004
Posts: 974
Location: France  Posted: Thu Jan 21, 2021 3:10 pm    Post subject: hi, do you know what is a sub ? see the help for Gosub I prefer use call subxxxxx() or using function that is the fondamental of basic language. I did an help about starting with Basic langage in french, if you need it let me your mail JP_________________pleasure to learn, to teach, to create   odemmo Joined: 26 Jun 2007
Posts: 19  Posted: Thu Jan 21, 2021 7:33 pm    Post subject: I am aware of Gosub but where in my code should I insert Gosub Hx711get1, Gosub Hx711get2, Gosub Hx711get3 abd Gosub Hx711get4. I am aware of the principle of Basic since the 80's with CBM64 but Bascom Basic is more advanced Basic than what I learned then. I really need this gadget that reads all 4 weights one by one. I speak only Norwegian and google English   albertsm  Joined: 09 Apr 2004
Posts: 5171
Location: Holland  Posted: Thu Jan 21, 2021 8:32 pm    Post subject: there are multiple solutions.
the most simple would be when you use a full port for example PORTB.
Say portb.0 and portb.1 for the first device, portb.2 and portb.3 for the next, etc.

code becomes :

 Code: For Hx711count = 23 To 0 Step -1                         'Extract 24-bit data.       Set PORTB.0   'clock of first device       SET PORTB.2  'clock of second device       SET PORTB.4       SET PORTB.6         Waitus 1                                              'Period of [H]. (T3 = 1uS)       Hx711ad1.hx711count = PINB.1       Hx711ad2.hx711count = PINB.3       Hx711ad3.hx711count = PINB.5       Hx711ad4.hx711count = PINB.7       Reset PORTB.0       Reset PORTB.2       Reset PORTB.4       Reset PORTB.6       Waitus 1                                              'Period of [L]. (T4 = 1uS)    Next Hx711count

this is just a partial sample to show the idea where you perform the operations on 4 devices at once. this also requires 4 variables to contain the data.
you could also make a sub routine where you pass the bit numbers of the port.

and you can simple copy the code and then assign 4 different ports as the author suggested.

_________________
Mark   albertsm  Joined: 09 Apr 2004
Posts: 5171
Location: Holland  Posted: Thu Jan 21, 2021 8:35 pm    Post subject: - you should start with the code you have for 1 device. - then show us which pins you have for the other 3 devices._________________Mark   odemmo Joined: 26 Jun 2007
Posts: 19  Posted: Thu Jan 21, 2021 11:56 pm    Post subject: I use this code when I have only one HX711 \$regfile = "m8def.dat" \$crystal = 3686400 \$baud = 9600 \$hwstack = 64 \$swstack = 10 \$framesize = 24 Hx711_clk Alias Portb.0 Hx711_dat Alias Pinb.1 Dim Hx711ad As Long Dim Hx711avg As Long Dim Hx711count As Byte Dim Average(16) As Long Dim Avgpoi As Byte Dim Avgsum As Long Dim Zeroadj As Long Dim Stablecount As Byte Dim Lastvalue As Long Dim Sensorcal As Long ' Dim Temp1 As Byte Dim Temp2 As Byte Dim Templ1 As Long Dim Tempstr As String * 40 ' Dim Dummy As Eram Long Dim Eepprgid As Eram Long Dim Eepsensorcal As Eram Long Config Hx711_clk = Output Reset Hx711_clk Config Hx711_dat = Input If Eepprgid <> &H31375848 Then Eepprgid = &H31375848 Eepsensorcal = 30065 End If Sensorcal = Eepsensorcal For Temp1 = 1 To 20 Do Loop Until Hx711_dat = 0 ' Gosub Hx711get Gosub Hx711movavg Locate 2 , 1 Print Hex(hx711avg) Next Temp1 Zeroadj = 0 - Hx711avg Stablecount = 0 Lastvalue = 0 Temp2 = 0 Main: If Hx711_dat = 0 Then Gosub Hx711get Gosub Hx711movavg Templ1 = Hx711avg + Zeroadj Templ1 = Templ1 * 100 Templ1 = Templ1 / Sensorcal ' Temp2 = Temp2 + 1 If Temp2 > 10 Then Temp2 = 0 End If waitms 100 Tempstr = Str(templ1) If Templ1 < 0 Then print Format(tempstr , " 0") If Temp2 = 0 Then Print Format(tempstr , " 0") End If Else print Format(tempstr , " 0") If Temp2 = 0 Then Print Format(tempstr , " 0") End If End If If Templ1 = Lastvalue Then Stablecount = Stablecount + 1 If Stablecount > 5 Then Stablecount = 5 End If Else Lastvalue = Templ1 Stablecount = 0 End If End If Goto Main Hx711get: Hx711ad = 0 For Hx711count = 23 To 0 Step -1 Set Hx711_clk Waitus 1 Hx711ad.hx711count = Hx711_dat Reset Hx711_clk Waitus 1 Next Hx711count Set Hx711_clk Waitus 1 Reset Hx711_clk Waitus 1 ' If Hx711ad.23 = 1 Then Hx711ad = Hx711ad Or &HFF000000 End If Return Hx711movavg: Avgsum = Avgsum - Average(avgpoi) Average(avgpoi) = Hx711ad Avgsum = Avgsum + Hx711ad ' Avgpoi = Avgpoi + 1 If Avgpoi > 16 Then Avgpoi = 1 End If ' Hx711avg = Avgsum Shift Hx711avg , Right , 4 , Signed Return end but now I want to use there more HX711 on port b2 to port b7 Thanks  O-Family Joined: 23 May 2010
Posts: 231
Location: Japan  Posted: Fri Jan 22, 2021 12:11 am    Post subject: If the questioner has a high level of programming, we can also suggest simplifying the program. For example, the [PD_SCK] pin is shared by all four ports and connected to one port, and only the [DOUT] pin is received individually by the four ports. However, since many modifications of the provided test program are required, I proposed a method to make the four easiest subroutines by copying. Even so, the questioner often doesn't understand the BASIC language. You'll have to learn a little more and then ask questions or ask for all the programming. It also does not provide any hardware information such as the power supply voltage (AVDD) for the HX711 load cell or the characteristics of the load cell used.   odemmo Joined: 26 Jun 2007
Posts: 19  Posted: Fri Jan 22, 2021 12:29 am    Post subject: Thanks. I understand simple basic programming but this is too complicated for an old man like me and therefore I wants lots of help, help with the whole program is of course invaluable help and thanks. To learn this I think will be very time consuming for a hobby project. Thanks  O-Family Joined: 23 May 2010
Posts: 231
Location: Japan  Posted: Fri Jan 22, 2021 1:27 am    Post subject: Yes, I think it takes some effort. The coefficient calculation of the program changes depending on the power supply voltage (AVDD) for the load cell of the HX711 and the characteristics (resistance value and output voltage) of the load cell. Also, for each of the four load cells, error adjustment and zero adjustment are required, so simply speaking, the program is quadrupled. It corresponds to the idea of measuring with four separate AVR circuits and summarizing the four results obtained. Simply asking only the subroutine part of a program can be difficult to solve if you don't know how the entire program works. It may take some time, but do your best!   odemmo Joined: 26 Jun 2007
Posts: 19  Posted: Wed Jan 27, 2021 1:09 am    Post subject: Finally I got it, tips from you and lots of copying and pasting, I am not a trained programmer but have tried and failed since CBM64 in my youth but this type of programming is very complicated, but I got it. \$regfile = "m16def.dat" \$crystal = 3686400 \$baud = 9600 \$hwstack = 64 \$swstack = 10 \$framesize = 24 Hx711_clk Alias Portd.2 Hx711_dat Alias Pind.3 Dim Hx711ad As Long Dim Hx711avg As Long Dim Hx711count As Byte Dim Average(16) As Long Dim Avgpoi As Byte Dim Avgsum As Long Dim Zeroadj As Long Dim Stablecount As Byte Dim Lastvalue As Long Dim Sensorcal As Long ' Dim Temp1 As Byte Dim Temp2 As Byte Dim Templ1 As Long Dim Tempstr As String * 40 ' Dim Dummy As Eram Long Dim Eepprgid As Eram Long Dim Eepsensorcal As Eram Long Config Hx711_clk = Output Reset Hx711_clk Config Hx711_dat = Input If Eepprgid <> &H31375848 Then Eepprgid = &H31375848 Eepsensorcal = 30065 End If Sensorcal = Eepsensorcal For Temp1 = 1 To 20 Do Loop Until Hx711_dat = 0 ' Gosub Hx711get Gosub Hx711movavg Locate 2 , 1 Print Hex(hx711avg) Next Temp1 Zeroadj = 0 - Hx711avg Stablecount = 0 Lastvalue = 0 Temp2 = 0 Main: If Hx711_dat = 0 Then Gosub Hx711get Gosub Hx711movavg Templ1 = Hx711avg + Zeroadj Templ1 = Templ1 * 100 Templ1 = Templ1 / Sensorcal ' Temp2 = Temp2 + 1 If Temp2 > 10 Then Temp2 = 0 End If waitms 100 Tempstr = Str(templ1) If Templ1 < 0 Then print Format(tempstr , " 0") If Temp2 = 0 Then Print Format(tempstr , " 0") End If Else print Format(tempstr , " 0") If Temp2 = 0 Then Print Format(tempstr , " 0") End If End If If Templ1 = Lastvalue Then Stablecount = Stablecount + 1 If Stablecount > 5 Then Stablecount = 5 End If Else Lastvalue = Templ1 Stablecount = 0 End If End If Goto Main Hx711get: Hx711ad = 0 For Hx711count = 23 To 0 Step -1 Set Hx711_clk Waitus 1 Hx711ad.hx711count = Hx711_dat Reset Hx711_clk Waitus 1 Next Hx711count Set Hx711_clk Waitus 1 Reset Hx711_clk Waitus 1 ' If Hx711ad.23 = 1 Then Hx711ad = Hx711ad Or &HFF000000 End If Return Hx711movavg: Avgsum = Avgsum - Average(avgpoi) Average(avgpoi) = Hx711ad Avgsum = Avgsum + Hx711ad ' Avgpoi = Avgpoi + 1 If Avgpoi > 16 Then Avgpoi = 1 End If ' Hx711avg = Avgsum Shift Hx711avg , Right , 4 , Signed Return end  albertsm  Joined: 09 Apr 2004
Posts: 5171
Location: Holland  Posted: Wed Jan 27, 2021 10:15 am    Post subject: hi

you should use the CODE tags when posting code like this :

 Code: \$regfile = "m16def.dat" \$crystal = 3686400 \$baud = 9600 \$hwstack = 64 \$swstack = 10 \$framesize = 24 Hx711_clk Alias Portd.2 Hx711_dat Alias Pind.3 Dim Hx711ad As Long Dim Hx711avg As Long Dim Hx711count As Byte Dim Average(16) As Long Dim Avgpoi As Byte Dim Avgsum As Long Dim Zeroadj As Long Dim Stablecount As Byte Dim Lastvalue As Long Dim Sensorcal As Long ' Dim Temp1 As Byte Dim Temp2 As Byte Dim Templ1 As Long Dim Tempstr As String * 40 ' Dim Dummy As Eram Long Dim Eepprgid As Eram Long Dim Eepsensorcal As Eram Long Config Hx711_clk = Output Reset Hx711_clk Config Hx711_dat = Input If Eepprgid <> &H31375848 Then    Eepprgid = &H31375848    Eepsensorcal = 30065 End If Sensorcal = Eepsensorcal For Temp1 = 1 To 20    'Do    'Loop Until Hx711_dat = 0    Bitwait Hx711_dat , Reset                                'instead of do loop    Gosub Hx711get    Gosub Hx711movavg    Locate 2 , 1    Print Hex(hx711avg) Next Temp1 Zeroadj = 0 - Hx711avg Stablecount = 0 Lastvalue = 0 Temp2 = 0 'Main: Do    If Hx711_dat = 0 Then       Gosub Hx711get       Gosub Hx711movavg       Templ1 = Hx711avg + Zeroadj       Templ1 = Templ1 * 100       Templ1 = Templ1 / Sensorcal '       Temp2 = Temp2 + 1       If Temp2 > 10 Then          Temp2 = 0       End If       waitms 100       Tempstr = Str(templ1)       If Templ1 < 0 Then          print Format(tempstr , " 0")          If Temp2 = 0 Then             Print Format(tempstr , " 0")          End If       Else          print Format(tempstr , " 0")          If Temp2 = 0 Then             Print Format(tempstr , " 0")          End If       End If       If Templ1 = Lastvalue Then          Stablecount = Stablecount + 1          If Stablecount > 5 Then             Stablecount = 5          End If       Else          Lastvalue = Templ1          Stablecount = 0       End If    End If   ' Goto Main Loop Hx711get:    Hx711ad = 0    For Hx711count = 23 To 0 Step -1       Set Hx711_clk       Waitus 1       Hx711ad.hx711count = Hx711_dat       Reset Hx711_clk       Waitus 1    Next Hx711count    Set Hx711_clk    Waitus 1    Reset Hx711_clk    Waitus 1 '    If Hx711ad.23 = 1 Then       Hx711ad = Hx711ad Or &HFF000000    End If Return Hx711movavg:    Avgsum = Avgsum - Average(avgpoi)    Average(avgpoi) = Hx711ad    Avgsum = Avgsum + Hx711ad '    Avgpoi = Avgpoi + 1    If Avgpoi > 16 Then       Avgpoi = 1    End If '    Hx711avg = Avgsum    Shift Hx711avg , Right , 4 , Signed Return End

Also use the Proper Indent feature so you get automatic indention.
In your code i replaced main: goto main with a Do Loop
And the do loop until with a BITWAIT which is the equivalent.

Your code still uses 1 sensor but when it works as you want it is indeed a matter of copy & paste.
One important thing however : it is always a good idea to invest some time in what the end goal is. It is like making an IKEA furniture : best read all the pages before you start.

Now you have something working you can probably also better understand the commands better and you are able to use one of the methods to enhance with multiple sensors.
- simple copy & rename
- do all the 4 sensors at the same time
- make a sub routine and pass info like the bit number.

for example you have 2 bits you use. these you could pass :

 Code: declare function Something(byval sensorpin0 as byte, byval sensorpin1 as byte) as word 'or what ever you return 'call it like this myword1=Something(0,1) myword2=Something(2,3) and in the sub you have a reference to the pin number : function Something(byval sensorpin0 as byte, byval sensorpin1 as byte) as word 'or what ever you return    portd.sensorpin0 = 0 'for example end function

you best make a small example without the other code and look in the simulator how it will work.

_________________
Mark   Display posts from previous: All Posts1 Day7 Days2 Weeks1 Month3 Months6 Months1 Year Oldest FirstNewest First
 All times are GMT + 1 HourGoto page Previous  1, 2 Page 2 of 2

 Jump to: Select a forum BASCOM AVR/8051----------------BASCOM-AVRBASCOM-8051BASCOM-ARDUINOShare your working BASCOM-8051 code hereShare your working BASCOM-AVR code hereBASCOM BETA-SLA BASCOM Related----------------EASY TCP/IPAVR-DOSAR7212KokkeKat FAT-free SD card libBASCOM Project Blog Other Stuff----------------VariousPCB'sRoboticsNew WebSiteAnnouncementsAVR Archive----------------BASCOM-AVR ArchiveBASCOM-8051 ArchiveBASCOM-AVR Unsupported versionsEasy TCP/IP ArchiveBASCOM-EDB
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You cannot download files in this forum