ADC CS5524 mit Atmega328

OP #7556417
Lesenswert?

Hallo Alle

Bin der Martin aus Österreich und lese immer gerne die Foren durch. Meistens kann ich damit meine Probleme lösen.

Diesmal stehe ich aber komplett auf der Leitung.

Ich möchte mit dem Atmega 328 einen ADC CS5524 zum Laufen bringen, bekomme aber nur Daten herein die absolut keinen Sinn ergeben.

Irgend etwas beim ADC Setup mache ich falsch, vielleicht kann mir jemand einen Tipp geben. Bin jetzt schon den dritten Tag dabei.

Meine Supercode ist:

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
}

Für einen Tipp wäre ich euch sehr dankbar.

Grüße, Martin

Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #7557436
Lesenswert?

Martin schrieb:

Irgend etwas beim ADC Setup mache ich falsch, vielleicht kann mir jemand einen Tipp geben. Bin jetzt schon den dritten Tag dabei.

Ich hätte spätestens am zweiten Tag, vermutlich aber noch gleich am ersten Tag ein Speicheroszi oder einen Logkanalyzer an den Bus angeschlossen und kontrolliert, ob die Signalqualität und das Datenformat am CS5524 so aussieht, wie der Baustein es laut Datenblatt auf Seite 12 erwartet.

Wastl schrieb:

bezweifle mal dass du innerhalb eines CS-Low/CS-High Zyklus so viele Bytes übertragen kannst wie du es in <CS5524_init()> tust.

Und natürlich auch beim Auslesen. Bei oberflächlicher Durchsicht des DB muss das Datenpaket immmer 32 (8+24) Bit haben (siehe Seite 25).

Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren