Forum: Mikrocontroller und Digitale Elektronik AD7793 Continious Conversation Mode


von A. P. (Firma: NO) (blackjack18)


Angehängte Dateien:

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.

von Purzel H. (hacky)


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.

von A. P. (Firma: NO) (blackjack18)


Angehängte Dateien:

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.

von Benjamin S. (recycler)


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.

von A. P. (Firma: NO) (blackjack18)


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

von Jens (Gast)


Lesenswert?

Das send(0x8); ist komisch. Ist das send(0x80); oder send(0x08); ?

von Benjamin S. (recycler)


Lesenswert?

0x8 ist kurz für 0x08. Für die Verständlichkeit und Übersicht wäre 0x08 
besser.

von Benjamin S. (recycler)


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.

von Benjamin S. (recycler)


Lesenswert?

Auf Seite 22 im Datenblatt steht, das für eine fortwährende Wandlung 
immer der Wert 58 gesendet werden muss. CS kann dabei auf low bleiben. 
DOUT bzw. /RDY zeigt dabei an, wenn die Wandlung durchgeführt wurde.

von A. P. (Firma: NO) (blackjack18)


Lesenswert?

Benjamin S. schrieb:
> Auf Seite 22 im Datenblatt steht, das für eine fortwährende Wandlung
> immer der Wert 58 gesendet werden muss. CS kann dabei auf low bleiben.
> DOUT bzw. /RDY zeigt dabei an, wenn die Wandlung durchgeführt wurde.

Danke, das hat geholfen.

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.