Forum: Mikrocontroller und Digitale Elektronik ADC CS5524 mit Atmega328


von Martin (martindm)


Angehängte Dateien:

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

: Bearbeitet durch Moderator
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Martin schrieb:
> Für einen Tipp wäre ich euch sehr dankbar.
Bitte das beachten, was über jeder Texteingabebox steht.

von Wastl (hartundweichware)


Lesenswert?

Martin schrieb:
> Irgend etwas beim ADC Setup mache ich falsch, vielleicht kann mir jemand
> einen Tipp geben.

Ich habe das Datenblatt nicht tiefgründig durchforstet aber
ich bezweifle mal dass du innerhalb eines CS-Low/CS-High
Zyklus so viele Bytes übertragen kannst wie du es in
<CS5524_init()> tust.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

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).

: Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.