1 | void RFM12_ISR(void)
|
2 | {
|
3 | static uint8_t daten[32];
|
4 | static uint8_t checksum = 0;
|
5 | static uint8_t bytecount = 0;
|
6 | uint8_t i, sensor_nr, byte;
|
7 |
|
8 | digitalWrite(RFM12_SCK, LOW); // CLK auf L
|
9 | digitalWrite(RFM12_SDI, LOW); // DATA auf L
|
10 | digitalWrite(RFM12_CS, LOW); // CS auf L
|
11 |
|
12 | byte = 0xB0; // Receive FIFO
|
13 |
|
14 | for (i = 0; i < 8; i++) // Kommando senden
|
15 | {
|
16 | if (byte & 0x80)
|
17 | {
|
18 | digitalWrite(RFM12_SDI, HIGH); // DATA auf H
|
19 | }
|
20 | else
|
21 | {
|
22 | digitalWrite(RFM12_SDI, LOW); // DATA auf L
|
23 | }
|
24 | digitalWrite(RFM12_SCK, HIGH); // Clock auf H
|
25 | byte = (byte << 1); // nächstes Bit nach oben
|
26 | digitalWrite(RFM12_SCK, LOW); // Clock auf L
|
27 | }
|
28 |
|
29 | byte = 0;
|
30 |
|
31 | for (char j = 0; j < 8; j++)
|
32 | {
|
33 | byte = (byte << 1); // eins höher schieben
|
34 | if (digitalRead(RFM12_SDO) == 1) // Bit 1?
|
35 | {
|
36 | byte = (byte | 0x01); // ja
|
37 | }
|
38 | digitalWrite(RFM12_SCK, HIGH); // CLK auf H
|
39 | digitalWrite(RFM12_SCK, LOW); // CLK auf L
|
40 | }
|
41 | digitalWrite(RFM12_CS, HIGH); // CS auf H
|
42 |
|
43 | daten[bytecount] = byte; // Daten speichern
|
44 | bytecount++;
|
45 | checksum ^= byte; // XOR-Prüfsumme
|
46 |
|
47 | if (bytecount == PAKET_LEN) // fertig?
|
48 | {
|
49 | RFM12_send_cmd(0xCA81); // set FIFO mode
|
50 | RFM12_send_cmd(0xCA83); // enable FIFO
|
51 |
|
52 | if (checksum == 0) // Checksumme ok?
|
53 | {
|
54 | sensor_nr = (daten[0] & 0x0F) - 1; // jetzt ab 0
|
55 | if (sensor_nr < SENSOR_ANZ) // im gültigen Beeich?
|
56 | {
|
57 | daten[bytecount - 1] = 1; // 1 ins letzte Byte (Checksumme) für neue Daten
|
58 | memcpy((void *) sensor[sensor_nr], (void const *) daten, PAKET_LEN);
|
59 | }
|
60 | }
|
61 | checksum = 0;
|
62 | bytecount = 0;
|
63 | }
|
64 | }
|
65 |
|
66 | //------------------------------------------------------------------
|
67 |
|
68 | void RFM12_init(void)
|
69 | {
|
70 | pinMode(RFM12_CS, OUTPUT);
|
71 | digitalWrite(RFM12_CS, HIGH);
|
72 |
|
73 | pinMode(RFM12_SDI, OUTPUT);
|
74 | digitalWrite(RFM12_SDI, LOW);
|
75 |
|
76 | pinMode(RFM12_SCK, OUTPUT);
|
77 | digitalWrite(RFM12_SCK, LOW);
|
78 |
|
79 | pinMode(RFM12_SDO, INPUT);
|
80 | pinMode(RFM12_IRQ, INPUT_PULLUP);
|
81 |
|
82 | delay(200);
|
83 |
|
84 | RFM12_send_cmd(0x0000); // Status read
|
85 |
|
86 | RFM12_send_cmd(0xC080); // CLK-Frequenz / Batterie-Level
|
87 | RFM12_send_cmd(0x80D7); // FIFO ein, TX-Regisrer ein, 433MHZ-Band, C = 12pF
|
88 | RFM12_send_cmd(0xC2AB); // Clock Recovery Auto, Filter digital, DQD-Thresold 3
|
89 | RFM12_send_cmd(0xCA81); // FIFO-Level 8 Bit, Sync Pattern ein, High senity Reset aus
|
90 | RFM12_send_cmd(0xE000); // WakeUp aus
|
91 | RFM12_send_cmd(0xC800); // Low Duty Cycle aus
|
92 | RFM12_send_cmd(0xC4F3); // AFC immer, +7,5 / -10kHz, Add Freq-Offset zur PLL, Berechne Freq. Offset aus AFC // Status read
|
93 | RFM12_send_cmd(0xA620); // Frequenz 433,92MHz // Status read
|
94 | RFM12_send_cmd(0x948C); // VDI Output, VDI Fast, Bandbreite 200kHz, LBA-Gain -6dB, RSSI-Thresold -79dB
|
95 | RFM12_send_cmd(0xC610); // Baudrate 19200 ->> stimmt nicht...
|
96 | RFM12_send_cmd(0x8281); // Empfänger ein
|
97 |
|
98 | attachInterrupt(RFM12_IRQ, RFM12_ISR, FALLING);
|
99 |
|
100 | RFM12_send_cmd(0xCA81); // set FIFO mode
|
101 | RFM12_send_cmd(0xCA83); // enable FIFO
|
102 | }
|