AD7793 Continious Conversation Mode

OP (Firma: NO) #1946137
Lesenswert?

Hallo,

ich habe die im Anhang sich befindende Schaltung und folgendes Problem 
bei der C-code Programmierung:

datenblatt: 
http://www.analog.com/static/imported-files/data_sheets/AD7792_7793.pdf

Microcontroller: Psoc

Der adc soll im continious Mode laufen, also ständig neue Datenwerte 
herausgeben. Bei mir schick er aber andauernd nur 00 raus. Die Register 
sollten richtig gesetzt sein.

das habe ich geschrieben um alles zu starten.
1
void send(BYTE d)
2
  {
3
  SPIM_SendTxData(d);
4
  while(!(SPIM_bReadStatus() & SPIM_SPIM_SPI_COMPLETE)){};
5
        
6
  send(0xFF);//reset
7
  send(0xFF);
8
  send(0xFF);
9
  send(0xFF);
10

11
        //Config schreiben
12
  send(0x10);
13
  //Config Schreibevorgang
14
  send(0xB16);
15

16
        //Mode schreiben
17
  send(0x8);
18
  //Mode Schreibevorgang 16bit
19
  send(0x0009); 
20

21
        //IO schreiben
22
  send(0x28);
23
  //IO Schreibevorgang
24
  send(0x03); //IEXC2 an IOUT2 // 1mA
25

26
send(0x58); //Continuous Conversion Mode einleiten
27

28
while(1) {
29
    if (((PRT0DR & 0x10) == 0x00) && (i < 2)) {
30
      send(0x00);
31
      i++;
32
      x = SPIM_bReadRxData();
33
      y = x + (y << 8);
34
      
35
    } //Warten bis Din Flanke unten ist >>dann ausgeben
36
    
37
    if (((PRT0DR & 0x10) == 0x00) && (i == 2)) { 
38
      send(0x00);
39
      i++;
40
      }
41
    if(i >= 3) {
42

43
      LCD_Position(1,0);
44
      LCD_PrHexInt(y);
45
      y=0;
46
      i=0;
47
    }
In der while-schleife sollte er andauernd das Data register ausgeben mit 
der 0x00.

Als Ausgabe am Display sieht man nichts sinnvolles. Ich hab mir die 
anderen Threads angeschaut, haben mir aber nicht geholfen.
Angehängte Dateien:
#1946150
Lesenswert?

Man kann das Dout/Ready beobachten und weiss so wann die konversion 
beendet ist. Aha, wird das beim blockierenden Senden gemacht ? Ohne 
diesen Chip zu kennen, aber aehniche, sind mir die Schreibbefehle zu 
kurz. Config und Mode sollten laenger sein, nein ?

Da war doch was mit dem kontinuierlichen Mode... ja. das ist immer 
derselbe Kanal. Probier's doch mal mit dem nicht-kontinuierlichen Mode, 
den man anwerfen muss.
OP (Firma: NO) #1946211
Lesenswert?

ich hab mal ein screenshot vom Oszi gemacht.

1. Graf ist SClock

2. Din (Miso)

3. Dout (Mosi)

Am Anfang kann man die Initialisierung erkennen (Config,Mode, usw werden 
geschrieben).

Dann bleibt für eine lange Zeit, Dou, Din auf High. Und am Ende kann man 
im gezoomten Ausschnitt die 3 Clocks (24bit) sehen und die Din Flanke 
auf low, genauso wie Dout. Aber dann passiert nix, der Continous Mode 
funktioniert nicht mehr.

::Die 16bit config hab ich als 0x0009 oder als 0x00; 0x09; probiert,ist 
das gleiche.
Angehängte Dateien:
#1946222
Lesenswert?

Soweit ich das sehe, übergibst du bei "send" nur ein Byte. Später rufst 
du es teilweise mit 2 Byte auf.
1
  //Config Schreibevorgang
2
  send(0xB16);
3
...
4
  //Mode Schreibevorgang 16bit
5
  send(0x0009);

ich denke hier geht Information an den Chip verloren.
Weiterhin sollte nach send ... eine Klammer "}" kommen.

[c]void send(BYTE d)
  {
   SPIM_SendTxData(d);
   while(!(SPIM_bReadStatus() & SPIM_SPIM_SPI_COMPLETE)){};
  }
[c]

Da ich die Funktione "SPIM_SendTxData(d);" nicht kenne, stellt sich noch 
die Frage, wer die CS Leitung kontrolliert.
OP (Firma: NO) #1946273
Lesenswert?

1
{
2
   SPIM_SendTxData(d);
3
   while(!(SPIM_bReadStatus() & SPIM_SPIM_SPI_COMPLETE)){};
4
  }

Genau, die } war natürlich drin. der CS ist andauernd low
1
PRT1DR &=0x7F;

sollte richtig sein. Chip ist aktiv.

Ich hab die Config und Mode jetzt mal so geschrieben:
1
        //Config schreiben
2
  send(0x10);
3
  //Config Schreibevorgang
4
  send(0x47); //BiasOn /BO=0 /unipolar /Boost=0/ gain=128
5
  send(0x90); //Internal Ref /BUF=1 /CH=AIN1
6

7
        //Mode schreiben
8
  send(0x8);
9
  //Mode Schreibevorgang 16bit (2Takte)
10
  send(0x00); //Continous Mode
11
  send(0x05); //50 Hz ADC

SPIM_SendTxData(d) ist zum schreiben von Master auf Slave
#1946288
Lesenswert?

Peter hast du den ganzen Code gepostet. Beim Überfliegen des 
Datenblattes ist mir aufgefallen, das die Kommunikation in etwa so 
abläuft.

CS auf low
Configbyte senden (Lesen, schreiben, Register und Länge (über 
Registerauswahl)
Datenbyte 1 senden
Datenbyte 2 senden falls Register = 16bit
CS high

Anschließend verarbeitet der Chip seinen Befehl. Bei dir sehe ich aber 
den Abschluss der Kommunikation nicht.

Bei deinem Code müsste das so sein:
1
  CS_LOW
2
        //Config schreiben
3
  send(0x10);
4
  //Config Schreibevorgang
5
  send(0x47); //BiasOn /BO=0 /unipolar /Boost=0/ gain=128
6
  send(0x90); //Internal Ref /BUF=1 /CH=AIN1
7

8
  CS_HIGH
9
  // eventuell nops, um dem Chip Zeit zur Verarbeitung zu geben (vgl. Datenblatt)
10
  CS_LOW
11

12
        //Mode schreiben
13
  send(0x08);
14
  //Mode Schreibevorgang 16bit (2Takte)
15
  send(0x00); //Continous Mode
16
  send(0x05); //50 Hz ADC
17

18
  CS_HIGH

Du kannst auch die Register wieder auslesen um zu sehen ob alles richtig 
gesetzt wurde.

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