Telescope Control Library
SerialDigitalInput.h@0:6cb2eaf8b133, 2018-08-19 (annotated)
- Committer:
- caoyuan9642
- Date:
- Sun Aug 19 05:21:20 2018 +0000
- Revision:
- 0:6cb2eaf8b133
v0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
caoyuan9642 | 0:6cb2eaf8b133 | 1 | /* |
caoyuan9642 | 0:6cb2eaf8b133 | 2 | * SerialDigitalInput.h |
caoyuan9642 | 0:6cb2eaf8b133 | 3 | * |
caoyuan9642 | 0:6cb2eaf8b133 | 4 | * Created on: 2018Äê2ÔÂ10ÈÕ |
caoyuan9642 | 0:6cb2eaf8b133 | 5 | * Author: caoyuan9642 |
caoyuan9642 | 0:6cb2eaf8b133 | 6 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 7 | |
caoyuan9642 | 0:6cb2eaf8b133 | 8 | #ifndef TELESCOPE_SERIALDIGITALINPUT_H_ |
caoyuan9642 | 0:6cb2eaf8b133 | 9 | #define TELESCOPE_SERIALDIGITALINPUT_H_ |
caoyuan9642 | 0:6cb2eaf8b133 | 10 | |
caoyuan9642 | 0:6cb2eaf8b133 | 11 | #include "mbed.h" |
caoyuan9642 | 0:6cb2eaf8b133 | 12 | |
caoyuan9642 | 0:6cb2eaf8b133 | 13 | /** |
caoyuan9642 | 0:6cb2eaf8b133 | 14 | * A serial interfaced digital input |
caoyuan9642 | 0:6cb2eaf8b133 | 15 | * Example application is to read a parallel input (8~32 bits) using cascaded 74xx165. |
caoyuan9642 | 0:6cb2eaf8b133 | 16 | */ |
caoyuan9642 | 0:6cb2eaf8b133 | 17 | template<uint8_t N> |
caoyuan9642 | 0:6cb2eaf8b133 | 18 | class SerialDigitalInput |
caoyuan9642 | 0:6cb2eaf8b133 | 19 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 20 | public: |
caoyuan9642 | 0:6cb2eaf8b133 | 21 | SerialDigitalInput(PinName c, PinName l, PinName d) : |
caoyuan9642 | 0:6cb2eaf8b133 | 22 | clk(DigitalOut(c)), load(DigitalOut(l)), data(DigitalIn(d)) |
caoyuan9642 | 0:6cb2eaf8b133 | 23 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 24 | if (clk == NC || load == NC || data == NC) |
caoyuan9642 | 0:6cb2eaf8b133 | 25 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 26 | fprintf(stderr, "ERROR in SerialDigitalInput: PIN(s) undefined"); |
caoyuan9642 | 0:6cb2eaf8b133 | 27 | return; |
caoyuan9642 | 0:6cb2eaf8b133 | 28 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 29 | |
caoyuan9642 | 0:6cb2eaf8b133 | 30 | /*Prepare for next reading*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 31 | clk = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 32 | load = 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 33 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 34 | virtual ~SerialDigitalInput() |
caoyuan9642 | 0:6cb2eaf8b133 | 35 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 36 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 37 | |
caoyuan9642 | 0:6cb2eaf8b133 | 38 | uint8_t getBits() const |
caoyuan9642 | 0:6cb2eaf8b133 | 39 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 40 | return N; |
caoyuan9642 | 0:6cb2eaf8b133 | 41 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 42 | |
caoyuan9642 | 0:6cb2eaf8b133 | 43 | uint32_t read() |
caoyuan9642 | 0:6cb2eaf8b133 | 44 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 45 | uint32_t value = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 46 | /*Load the shift register*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 47 | clk = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 48 | load = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 49 | |
caoyuan9642 | 0:6cb2eaf8b133 | 50 | delay(); |
caoyuan9642 | 0:6cb2eaf8b133 | 51 | |
caoyuan9642 | 0:6cb2eaf8b133 | 52 | /*Lock the shift register*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 53 | load = 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 54 | for (int i = 0; i < N; i++) |
caoyuan9642 | 0:6cb2eaf8b133 | 55 | { |
caoyuan9642 | 0:6cb2eaf8b133 | 56 | /*Read value*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 57 | value = (value << 1) + (data != 0); |
caoyuan9642 | 0:6cb2eaf8b133 | 58 | /*Clock. Now the next bit will be loaded*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 59 | clk = 1; |
caoyuan9642 | 0:6cb2eaf8b133 | 60 | /*Delay*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 61 | delay(); |
caoyuan9642 | 0:6cb2eaf8b133 | 62 | /*Reset clock*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 63 | clk = 0; |
caoyuan9642 | 0:6cb2eaf8b133 | 64 | /*Delay*/ |
caoyuan9642 | 0:6cb2eaf8b133 | 65 | delay(); |
caoyuan9642 | 0:6cb2eaf8b133 | 66 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 67 | return value; |
caoyuan9642 | 0:6cb2eaf8b133 | 68 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 69 | |
caoyuan9642 | 0:6cb2eaf8b133 | 70 | |
caoyuan9642 | 0:6cb2eaf8b133 | 71 | private: |
caoyuan9642 | 0:6cb2eaf8b133 | 72 | DigitalOut clk; |
caoyuan9642 | 0:6cb2eaf8b133 | 73 | DigitalOut load; |
caoyuan9642 | 0:6cb2eaf8b133 | 74 | DigitalIn data; |
caoyuan9642 | 0:6cb2eaf8b133 | 75 | |
caoyuan9642 | 0:6cb2eaf8b133 | 76 | void delay(){ |
caoyuan9642 | 0:6cb2eaf8b133 | 77 | uint16_t i=100; |
caoyuan9642 | 0:6cb2eaf8b133 | 78 | while(i--); |
caoyuan9642 | 0:6cb2eaf8b133 | 79 | } |
caoyuan9642 | 0:6cb2eaf8b133 | 80 | }; |
caoyuan9642 | 0:6cb2eaf8b133 | 81 | |
caoyuan9642 | 0:6cb2eaf8b133 | 82 | #endif /* TELESCOPE_SERIALDIGITALINPUT_H_ */ |
caoyuan9642 | 0:6cb2eaf8b133 | 83 | |
caoyuan9642 | 0:6cb2eaf8b133 | 84 |