1 | //Pins definieren, werden durchgängig mit diesen Namen benutzt
|
2 | #define SLAVESELECT 10
|
3 | #define SPICLOCK 13
|
4 | #define DATAOUT 11 //MOSI
|
5 | #define DATAIN 12 //MISO
|
6 | #define UBLB(a,b) ( ( (a) << 8) | (b) )
|
7 | #define UBLB19(a,b) ( ( (a) << 16 ) | (b) )
|
8 |
|
9 | //Register Adressen
|
10 | #define REVID 0x00 //ASIC Revision Nummer
|
11 | #define OPSTATUS 0x04 //Operation Status
|
12 | #define STATUS 0x07 //ASIC Status
|
13 | #define START 0x0A //Konstante Leserate
|
14 | #define PRESSURE 0x1F //Druck 3 MSB
|
15 | #define PRESSURE_LSB 0x20 //Druck 16 LSB
|
16 | #define TEMP 0x21 //16 bit Temperaut
|
17 |
|
18 | char rev_in_byte;
|
19 | int temp_in;
|
20 | unsigned long pressure_lsb;
|
21 | unsigned long pressure_msb;
|
22 | unsigned long temp_pressure;
|
23 | unsigned long pressure;
|
24 |
|
25 | void setup()
|
26 | {
|
27 | byte clr;
|
28 | pinMode(DATAOUT, OUTPUT);
|
29 | pinMode(DATAIN, INPUT);
|
30 | pinMode(SPICLOCK,OUTPUT);
|
31 | pinMode(SLAVESELECT,OUTPUT);
|
32 | digitalWrite(SLAVESELECT,HIGH); //Sensor ausschalten und neue Konfiguration übernehmen
|
33 |
|
34 | SPCR = B01010011; //MPIE=0, SPE=1 (on), DORD=0 (MSB first), MSTR=1 (master), CPOL=0 (clock idle when low), CPHA=0 (samples MOSI on rising edge), SPR1=0 & SPR0=0 (500kHz)
|
35 | clr=SPSR;
|
36 | clr=SPDR;
|
37 | delay(10);
|
38 | Serial.begin(9600);
|
39 | delay(500);
|
40 |
|
41 | Serial.println("Initialisiere hohe Leserate");
|
42 | write_register(0x03,0x09);
|
43 | }
|
44 |
|
45 | void loop()
|
46 | {
|
47 |
|
48 | rev_in_byte = read_register(REVID);
|
49 |
|
50 | pressure_msb = read_register(PRESSURE);
|
51 | pressure_msb &= B00000111;
|
52 | pressure_lsb = read_register16(PRESSURE_LSB);
|
53 | pressure_lsb &= 0x0000FFFF;
|
54 | pressure = UBLB19(pressure_msb, pressure_lsb);
|
55 | pressure /= 4;
|
56 |
|
57 | Serial.print("Druck in Pascal [");
|
58 | Serial.print(pressure, DEC);
|
59 | Serial.print(" P");
|
60 | Serial.print("");
|
61 | Serial.println("]");
|
62 |
|
63 | Serial.print("Druck in Hekto-Pascal [");
|
64 | Serial.print(pressure/100, DEC);
|
65 | Serial.print(" hPa");
|
66 | Serial.print("");
|
67 | Serial.println("]");
|
68 |
|
69 | temp_in = read_register16(TEMP);
|
70 | temp_in = temp_in / 20;
|
71 | Serial.print("Temperatur in Grad Celcius ["); //Direkte Ausgabe
|
72 | Serial.print(temp_in , DEC);
|
73 | Serial.println("]");
|
74 |
|
75 | Serial.println("");
|
76 | delay(1500);
|
77 |
|
78 | }
|
79 |
|
80 | char spi_transfer(volatile char data)
|
81 | {
|
82 | SPDR = data; // SPDR auf Datenübergabe vorbereiten
|
83 | while (!(SPSR & (1<<SPIF))) // Solange warten bis alle Bytes übertrage wurden
|
84 | {
|
85 | };
|
86 | return SPDR; // return the received byte
|
87 | }
|
88 |
|
89 |
|
90 | char read_register(char register_name)
|
91 | {
|
92 | char in_byte;
|
93 | register_name <<= 2;
|
94 | register_name &= B11111100; //Register lesen
|
95 |
|
96 | digitalWrite(SLAVESELECT,LOW); //SPI auswählen
|
97 | spi_transfer(register_name); //Datenbyte "in" SPI schreiben
|
98 | in_byte = spi_transfer(0x00); //Nichts senden. Gibt Register-Variable aus
|
99 | digitalWrite(SLAVESELECT,HIGH);
|
100 | delay(10);
|
101 | return(in_byte);
|
102 |
|
103 | }
|
104 |
|
105 | float read_register16(char register_name)
|
106 | {
|
107 | byte in_byte1;
|
108 | byte in_byte2;
|
109 | float in_word;
|
110 |
|
111 | register_name <<= 2;
|
112 | register_name &= B11111100; //Register lesen
|
113 |
|
114 | digitalWrite(SLAVESELECT,LOW); //SPI auswählen
|
115 | spi_transfer(register_name); //Datenbyte "in" SPI schreiben
|
116 | in_byte1 = spi_transfer(0x00);
|
117 | in_byte2 = spi_transfer(0x00);
|
118 | digitalWrite(SLAVESELECT,HIGH);
|
119 | in_word = UBLB(in_byte1,in_byte2);
|
120 | return(in_word);
|
121 | }
|
122 |
|
123 | void write_register(char register_name, char register_value)
|
124 | {
|
125 | register_name <<= 2;
|
126 | register_name |= B00000010; //Register lsen
|
127 |
|
128 | digitalWrite(SLAVESELECT,LOW); //Datenbyte "in" SPI schreiben
|
129 | spi_transfer(register_name); //Send register location
|
130 | spi_transfer(register_value); //Send value to record into register
|
131 | digitalWrite(SLAVESELECT,HIGH);
|
132 | }
|