MySensors Library & Examples  2.3.1
ADS7818.h
1 #ifndef ADS7818_h
2 #define ADS7871_h
3 //------------------------------------------------------------------------------
5 #define nop asm volatile ("nop\n\t")
6 //------------------------------------------------------------------------------
8 #define STATIC_ALWAYS_INLINE static inline __attribute__((always_inline))
9 //------------------------------------------------------------------------------
10 template<uint8_t ClkPin, uint8_t ConvPin, uint8_t DataPin>
12 class ADS7818
13 {
14 public:
15  //----------------------------------------------------------------------------
17  void begin()
18  {
19  fastPinMode(ClkPin, 1);
20  fastDigitalWrite(ClkPin, 0);
21  fastPinMode(ConvPin, 1);
22  fastDigitalWrite(ConvPin, 1);
23  fastPinMode(DataPin, 0);
24  }
25  //----------------------------------------------------------------------------
29  inline __attribute__((always_inline))
30  uint16_t read()
31  {
32  uint16_t v = 0;
33  fastDigitalWrite(ConvPin, 0);
34  fastDigitalWrite(ClkPin, 1);
35  fastDigitalWrite(ClkPin, 0);
36  fastDigitalWrite(ConvPin, 1);
37  fastDigitalWrite(ClkPin, 1);
38  fastDigitalWrite(ClkPin, 0);
39 
40  readBitFast16(v, 11);
41  readBitFast16(v, 10);
42  readBitFast16(v, 9);
43  readBitFast16(v, 8);
44  readBitFast16(v, 7);
45  readBitFast16(v, 6);
46  readBitFast16(v, 5);
47  readBitFast16(v, 4);
48  readBitFast16(v, 3);
49  readBitFast16(v, 2);
50  readBitFast16(v, 1);
51  readBitFast16(v, 0);
52  return v;
53  }
54 private:
55  //----------------------------------------------------------------------------
56  inline __attribute__((always_inline))
57  void readBitFast16(uint16_t &v, uint8_t b)
58  {
59  fastDigitalWrite(ClkPin, 1);
60  if (fastDigitalRead(DataPin)) {
61  v |= (1 << b);
62  }
63  fastDigitalWrite(ClkPin, 0);
64  }
65 };
66 #if 0
67 
68 STATIC_ALWAYS_INLINE void adcBegin()
69 {
70  fastPinMode(ADC_CLK_PIN, 1);
71  fastDigitalWrite(ADC_CLK_PIN, 0);
72  fastPinMode(ADC_CONV_PIN, 1);
73  fastDigitalWrite(ADC_CONV_PIN, 1);
74  fastPinMode(ADC_DATA_PIN, 0);
75 }
76 //------------------------------------------------------------------------------
79 STATIC_ALWAYS_INLINE void fastDummy(bool first)
80 {
81  if (!first) {
82  nop;
83  }
84  fastDigitalWrite(ADC_CLK_PIN, 1);
85  nop;
86  fastDigitalWrite(ADC_CLK_PIN, 0);
87 }
88 //------------------------------------------------------------------------------
93 STATIC_ALWAYS_INLINE void readBitFast16(uint16_t &v, uint8_t b)
94 {
95  fastDigitalWrite(ADC_CLK_PIN, 1);
96  if (fastDigitalRead(ADC_DATA_PIN)) {
97  v |= (1 << b);
98  }
99  fastDigitalWrite(ADC_CLK_PIN, 0);
100 }
101 //------------------------------------------------------------------------------
105 STATIC_ALWAYS_INLINE uint16_t adcRead(bool centered = false)
106 {
107  uint16_t v = 0;
108  fastDigitalWrite(ADC_CONV_PIN, 0);
109  fastDigitalWrite(ADC_CLK_PIN, 1);
110  fastDigitalWrite(ADC_CLK_PIN, 0);
111  fastDigitalWrite(ADC_CONV_PIN, 1);
112  fastDigitalWrite(ADC_CLK_PIN, 1);
113  fastDigitalWrite(ADC_CLK_PIN, 0);
114  // uint16_t v = 0;
115 
116  // fastDummy(1);
117  // fastDummy(0);
118  // fastDummy(0);
119  // fastDummy(0);
120 
121  // readBitFast16(v, 15);
122  // readBitFast16(v, 14);
123  // readBitFast16(v, 13);
124  // readBitFast16(v, 12);
125  readBitFast16(v, 11);
126  readBitFast16(v, 10);
127  readBitFast16(v, 9);
128  readBitFast16(v, 8);
129  readBitFast16(v, 7);
130  readBitFast16(v, 6);
131  readBitFast16(v, 5);
132  readBitFast16(v, 4);
133  readBitFast16(v, 3);
134  readBitFast16(v, 2);
135  readBitFast16(v, 1);
136  readBitFast16(v, 0);
137  return centered ? v ^ 0X8000 : v;
138 }
139 #endif // 0
140 #endif // ADS7818_h
void begin()
Definition: ADS7818.h:17
Definition: ADS7818.h:12
#define nop
Definition: SoftSPI.h:35
__attribute__((always_inline)) uint16_t read()
Definition: ADS7818.h:29