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 |
}
|