1 | // Version 8, 09.04.2023
|
2 |
|
3 | #include <LiquidCrystal_I2C.h>
|
4 | #include<SPI.h>
|
5 | #include <stdio.h>
|
6 |
|
7 |
|
8 | #define MOSI 11
|
9 | #define MISO 12
|
10 | #define SPICLOCK 13
|
11 |
|
12 | #define CS 4 //CS
|
13 |
|
14 | byte clr;
|
15 | byte clr1;
|
16 |
|
17 |
|
18 |
|
19 | LiquidCrystal_I2C lcd(0x27, 20, 4); //Zuweisen Adresse (0x27); 20 (Stellen); 4 (Zeilen)
|
20 |
|
21 | byte counterStart = 131; // alternative: 6
|
22 | unsigned int scaleFactor = 250; // alternative: 1000
|
23 |
|
24 |
|
25 | //char spi_transfer(volatile char data)
|
26 | unsigned char spi_transfer(char data)
|
27 | {
|
28 |
|
29 | SPDR = data; // Start the transmission
|
30 | while (!(SPSR & (1<<SPIF))) // Wait the end of the transmission
|
31 | {
|
32 | };
|
33 | clr = SPSR;
|
34 | clr = SPIF;
|
35 | return SPDR; // return the received byte
|
36 |
|
37 | }
|
38 |
|
39 |
|
40 | void CS5524_init()
|
41 | {
|
42 | lcd.setCursor(0, 2); // setze Kursor in zweite Zeile
|
43 | //lcd.print(" "); // dritte Zeile
|
44 | lcd.print(" posinit"); // dritte Zeile
|
45 | delay(1000);
|
46 |
|
47 | byte data = 0b11111111;
|
48 | PORTD &= ~(1 << PD4); //CS5524 Chip-select auf low
|
49 | for(int i = 1; i <= 15; i++)
|
50 | {
|
51 | spi_transfer(data);
|
52 | }
|
53 | data = 0b11111110;
|
54 | spi_transfer(0xFE);
|
55 |
|
56 | data = 0b00000011;
|
57 | spi_transfer(0x03);
|
58 | data = 0b00100000;
|
59 | spi_transfer(0x20);
|
60 |
|
61 | data = 0b00000000;
|
62 | for(int i = 1; i <= 3; i++)
|
63 | {
|
64 | spi_transfer(data);
|
65 | }
|
66 | delay(10);
|
67 |
|
68 | data = 0b00000011;
|
69 | spi_transfer(data);
|
70 | data = 0b00000000;
|
71 | for(int i = 1; i <= 4; i++)
|
72 | {
|
73 | spi_transfer(data);
|
74 | }
|
75 | PORTD |= (1 << PD4); //CS5524 Chip-select auf high
|
76 | delay(500);
|
77 | lcd.setCursor(0, 2); // setze Kursor in zweite Zeile
|
78 | //lcd.print(" "); // dritte Zeile
|
79 | lcd.print(" posinitaus"); // dritte Zeile
|
80 | delay(2000);
|
81 | }
|
82 |
|
83 | unsigned char ADC_Werte0 = 'a'; //MSB
|
84 | unsigned char ADC_Werte1 = 'a';
|
85 | unsigned char ADC_Werte2 = 'a'; //LSB
|
86 | unsigned char ADC_Werte3 = 'a'; //Infos
|
87 |
|
88 | void CS5524_read(char Kannal) //(char Kannal)
|
89 | {
|
90 | //lcd.setCursor(0, 3);
|
91 | //lcd.print(" Autobus2 ");
|
92 | delay(10);
|
93 |
|
94 | //char ADC_Werte[4];
|
95 | PORTD &= ~(1 << PD4); //CS5524 Chip-select auf low
|
96 |
|
97 | byte data = 0b10000000; //select Kannal 1, Temperatur
|
98 | spi_transfer(data);
|
99 | delay(500);
|
100 |
|
101 | data = 0b00000000; //SDO flag loeschen
|
102 | //spi_transfer(data);
|
103 |
|
104 | //ADC-Werte einlesen
|
105 |
|
106 | ADC_Werte0 = spi_transfer(data); //MSB
|
107 | ADC_Werte1 = spi_transfer(data);
|
108 | ADC_Werte2 = spi_transfer(data); //LSB
|
109 | ADC_Werte3 = spi_transfer(data); //Infos
|
110 |
|
111 | PORTD |= (1 << PD4); //CS5524 Chip-select auf high
|
112 |
|
113 | //lcd.setCursor(0, 3);
|
114 | //lcd.print(" Autobus3 ");
|
115 | delay(10);
|
116 |
|
117 | lcd.setCursor(0, 0);
|
118 | lcd.print(ADC_Werte0);
|
119 | lcd.setCursor(0, 1);
|
120 | lcd.print(ADC_Werte1);
|
121 | lcd.setCursor(0, 2);
|
122 | lcd.print(ADC_Werte2);
|
123 | lcd.setCursor(0, 3);
|
124 | lcd.print(ADC_Werte3);
|
125 | }
|
126 |
|
127 | void setup()
|
128 | {
|
129 |
|
130 | // Watchdog Anfang
|
131 | TCCR2A = 0x00; // OC2A and OC2B disconnected; Wave Form Generation Mode 0: Normal Mode
|
132 | TCCR2B = (1<<CS22) + (1<<CS21); // prescaler = 256
|
133 | // TCCR2B = (1<<CS22); // prescaler = 64;
|
134 | TIMSK2 = (1<<TOIE2); // interrupt when TCNT2 is overflowed
|
135 | TCNT2 = counterStart;
|
136 | DDRD |= (1<<PD7);
|
137 | // Watchdog Ende
|
138 |
|
139 | Serial.begin(9600);
|
140 |
|
141 |
|
142 | DDRD |= (1 << PD4); // CS5524 Chip-select
|
143 | DDRB |= (1 << PB3) | (1 << PB5); // MOSI, MISO, SCK
|
144 | delay(10);
|
145 |
|
146 | PORTD |= (1 << PD4); //CS5524 Chip-select auf high
|
147 |
|
148 | // SPCR = 01010000
|
149 | //interrupt disabled,spi enabled,msb 1st,controller,clk low when idle,
|
150 | //sample on leading edge of clk,system clock/8 rate (fastest)
|
151 | delay(100);
|
152 |
|
153 |
|
154 | SPI.begin();
|
155 |
|
156 | //SPCR |= (1 << SPE)|(1 << MSTR)|(1 << SPR1) | (1 << SPR0);
|
157 | //bitSet(SPCR, 4); // MSTR Bit
|
158 | //bitSet(SPCR, 7);
|
159 | SPI.setBitOrder(MSBFIRST); //bit transmission order
|
160 | SPI.setDataMode(SPI_MODE2); // Mode2
|
161 | SPI.setClockDivider(SPI_CLOCK_DIV16);
|
162 | bitClear(SPCR, 7); //local SPI interrupt is disable
|
163 | //bitSet(SPCR, 7);
|
164 |
|
165 | //clr = SPSR;
|
166 | //clr = SPDR;
|
167 |
|
168 | /*
|
169 | SPCR |= (1 << MSTR);
|
170 | SPCR |= (1 << CPOL) | (1 << CPHA);
|
171 | SPCR &= ~(1 << DORD);
|
172 | SPSR &= ~(1 << SPI2X);
|
173 | SPCR |= (1 << SPR0) | (1 << SPR1);
|
174 | SPCR |= (1 << SPE);
|
175 | */
|
176 |
|
177 |
|
178 | //sei();
|
179 |
|
180 |
|
181 | delay(100);
|
182 | //CS5524_init();
|
183 |
|
184 | //clr = SPSR;
|
185 | //clr1 = SPDR;
|
186 |
|
187 |
|
188 | /*
|
189 | PORTD |= (1 << PD4); //CS5524 Chip-select auf high
|
190 | PORTD &= ~(1 << PD4); //CS5524 Chip-select auf low
|
191 | */
|
192 |
|
193 | delay(100);
|
194 |
|
195 | lcd.init(); // LCD initialisierung
|
196 | lcd.backlight(); // Einschalten Backlight
|
197 |
|
198 | lcd.setCursor(0, 0); // Hochfahrbildschrim 1
|
199 | lcd.print(" V1 "); // erste Zeile
|
200 | lcd.setCursor(0, 0); // Hochfahrbildschrim 1
|
201 | lcd.print(clr1); // erste Zeile
|
202 |
|
203 | lcd.setCursor(0, 1); // setze Kursor in zweite Zeile
|
204 | lcd.print(" "); // zweite Zeile
|
205 | lcd.setCursor(0, 2); // setze Kursor in zweite Zeile
|
206 | lcd.print(" "); // dritte Zeile
|
207 | lcd.setCursor(0, 3); // Hochfahrbildschrim 1
|
208 | lcd.print(" ");
|
209 |
|
210 | delay(1000);
|
211 |
|
212 | lcd.setCursor(0, 0); // Hochfahrbildschrim 1
|
213 | lcd.print(" Pos1 "); // erste Zeile
|
214 |
|
215 | delay(100);
|
216 | CS5524_init();
|
217 | delay(500);
|
218 |
|
219 | lcd.setCursor(0, 0); // Hochfahrbildschrim 1
|
220 | lcd.print(" Pos2 "); // erste Zeile
|
221 |
|
222 | Read_config_register();
|
223 |
|
224 | lcd.setCursor(0, 0); // Hochfahrbildschrim 1
|
225 | lcd.print(" Pos3 "); // erste Zeile
|
226 | }
|
227 |
|
228 | void Read_config_register()
|
229 | {
|
230 | unsigned char config_register_werte = '1';
|
231 |
|
232 | lcd.setCursor(0, 0); // Hochfahrbildschrim 1
|
233 | lcd.print(" Pos8 "); // dritte Zeile
|
234 | lcd.setCursor(9, 0); // Hochfahrbildschrim 1
|
235 | lcd.print(config_register_werte); // erste Zeile
|
236 | delay(1000);
|
237 |
|
238 | PORTD &= ~(1 << PD4); //CS5524 Chip-select auf low
|
239 | char data = 0b00001011; // byte zum Lesen von config_register
|
240 | spi_transfer(data);
|
241 | data = 0b00000000; //SDO flag loeschen
|
242 | spi_transfer(data);
|
243 | delay(1);
|
244 | ADC_Werte0 = spi_transfer(data); //MSB
|
245 | ADC_Werte1 = spi_transfer(data);
|
246 | ADC_Werte2 = spi_transfer(data); //LSB
|
247 | //ADC_Werte3 = spi_transfer(data); //Infos
|
248 |
|
249 | PORTD |= (1 << PD4); //CS5524 Chip-select auf high
|
250 |
|
251 | //lcd.setCursor(0, 3);
|
252 | //lcd.print(" Autobus3 ");
|
253 | delay(10);
|
254 |
|
255 | lcd.setCursor(5, 0);
|
256 | lcd.print(ADC_Werte0);
|
257 | lcd.setCursor(5, 1);
|
258 | lcd.print(ADC_Werte1);
|
259 | lcd.setCursor(5, 2);
|
260 | lcd.print(ADC_Werte2);
|
261 | lcd.setCursor(0, 3);
|
262 | lcd.print(" "); // dritte Zeile
|
263 |
|
264 | delay(5000);
|
265 |
|
266 | channel_setup();
|
267 | delay(500);
|
268 | }
|
269 |
|
270 | void channel_setup()
|
271 | {
|
272 | PORTD &= ~(1 << PD4); //CS5524 Chip-select auf low
|
273 |
|
274 | //Setting the channel setup register
|
275 |
|
276 | char data;
|
277 |
|
278 | data = 0b00000101;
|
279 | spi_transfer(data);
|
280 |
|
281 | data = 0b00000100;
|
282 | spi_transfer(data);
|
283 |
|
284 | data = 0b11000000;
|
285 | spi_transfer(data);
|
286 |
|
287 | data = 0b01000100;
|
288 | spi_transfer(data);
|
289 |
|
290 | data = 0b11000000;
|
291 | spi_transfer(data);
|
292 |
|
293 | PORTD |= (1 << PD4); //CS5524 Chip-select auf high
|
294 | }
|
295 |
|
296 | ISR(TIMER2_OVF_vect)
|
297 | {
|
298 | static int counter = 0;
|
299 | TCNT2 = counterStart;
|
300 | counter++;
|
301 | if(counter == 250) // scaleFactor = 250
|
302 | {
|
303 | PORTD ^= (1<<PD7);
|
304 | counter = 0;
|
305 | }
|
306 |
|
307 | }
|
308 |
|
309 |
|
310 | void loop()
|
311 | {
|
312 | //lcd.print(" Autobusdd ");
|
313 | delay(200);
|
314 | CS5524_read(1);
|
315 | delay(200);
|
316 | //lcd.setCursor(0, 3);
|
317 | //lcd.print(" Autobus9aa ");
|
318 | }
|