123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /*********************************************************************
- *
- * Load Cell Amplifier HX711 library for Fraise pic18f device
- *
- *********************************************************************
- * Author Date Comment
- *********************************************************************
- * Antoine Rousseau sept 2016 Original.
- ********************************************************************/
- /*
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
- # MA 02110-1301, USA.
- */
- #include <hx711.h>
- static long valA = 0 , valB = 0;
- static unsigned char gainA = 0;
- static unsigned char currentFront = 0; // chanA=24+2 bits, chanB=25 or 27 bits = 51 or 53 bits total = 102 or 106 fronts.
- void hx711Init(unsigned char _gainA)
- {
- gainA = (_gainA != 0);
- digitalClear(HX711_SCK_PIN);
- pinModeDigitalOut(HX711_SCK_PIN);
- pinModeDigitalIn(HX711_DATA_PIN);
- }
- static unsigned char shiftIn() // shift HX711_DATA_PIN with HX711_SCK_PIN, MSB first.
- {
- unsigned char v = 0;
- unsigned char i = 8;
- while(i--) {
- v <<= 1;
- digitalSet(HX711_SCK_PIN);
- /*nop();
- nop();*/
- digitalClear(HX711_SCK_PIN);
- if(digitalRead(HX711_DATA_PIN)) v += 1;
- }
- return v;
- }
- static long format(unsigned long in)
- {
- #if 0
- in = ~in;
- if( ((in & 0x00FF0000) != 0x00800000) && (in != 0xFF7FFFFF))
- in &= 0x00FFFFFF;
- in += 1;
- return (long)in;
- #endif
- return in^0x800000;
- }
- void hx711Service()
- {
- static unsigned long tmpVal;
- static unsigned char curBit = 0;
-
- if(((curBit == 0) || (curBit == 25)) && digitalRead(HX711_DATA_PIN)) return;
- if((curBit == 0) || (curBit == 26)) tmpVal = 0;
-
- curBit += 1;
- digitalSet(HX711_SCK_PIN);
- Nop();
- Nop();
- Nop();
- Nop();
- digitalClear(HX711_SCK_PIN);
-
- tmpVal <<= 1;
- if(digitalRead(HX711_DATA_PIN)) tmpVal += 1;
-
- if(curBit == 24) valA = format(tmpVal);
- if(curBit == 50) valB = format(tmpVal);
-
- if((gainA==0) && (curBit == 51)) curBit = 0;
- if(curBit >= 53) curBit = 0;
- }
- long hx711Read(unsigned char channel)
- {
- if(channel == 0) return valA;
- else return valB;
- #if 0
- unsigned char i;
- unsigned long value = 0;
- unsigned char data[3] = { 0 };
- unsigned char filler = 0x00;
-
- if(mode>2) mode=2;
- mode += 1;
- // pulse the clock pin 24 times to read the data
- data[2] = shiftIn();
- data[1] = shiftIn();
- data[0] = shiftIn();
- // set the channel and the gain factor for the next reading using the clock pin
- for (i = 0; i < mode; i++) {
- digitalSet(HX711_SCK_PIN);
- digitalClear(HX711_SCK_PIN);
- }
- // Datasheet indicates the value is returned as a two's complement value
- // Flip all the bits
- data[2] = ~data[2];
- data[1] = ~data[1];
- data[0] = ~data[0];
- // Replicate the most significant bit to pad out a 32-bit signed integer
- if ( data[2] & 0x80 ) {
- filler = 0xFF;
- } else if ((0x7F == data[2]) && (0xFF == data[1]) && (0xFF == data[0])) {
- filler = 0xFF;
- } else {
- filler = 0x00;
- }
- /*// Construct a 32-bit signed integer
- value = ( static_cast<unsigned long>(filler) << 24
- | static_cast<unsigned long>(data[2]) << 16
- | static_cast<unsigned long>(data[1]) << 8
- | static_cast<unsigned long>(data[0]) );
- // ... and add 1
- return static_cast<long>(++value);*/
- value = (unsigned long)(filler) << 24
- | ((unsigned long)(data[2]) << 16)
- | ((unsigned long)(data[1]) << 8)
- | ((unsigned long)(data[0]) );
- value += 1;
-
- return value;
- #endif
- }
- /*void hx711Service_()
- {
- static unsigned long tmpVal;
- //unsigned char curBit;
-
- if((currentFront == 0) || (currentFront == 54)) tmpVal = 0;
-
- currentFront += 1;
- if(currentFront & 1) {
- digitalSet(HX711_SCK_PIN);
- return;
- }
- digitalClear(HX711_SCK_PIN);
-
- tmpVal <<= 1;
- if(digitalRead(HX711_DATA_PIN)) tmpVal += 1;
-
- if(currentFront == 48) valA = format(tmpVal);
- if(currentFront == 100) valB = format(tmpVal);
-
- if((gainA==0) && (currentFront == 102)) currentFront = 0;
- if(currentFront >= 106) currentFront = 0;
- } */
|