www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AD7793 Continious Conversation Mode


Autor: A. Peter (Firma: NO) (blackjack18)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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_s...

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.
void send(BYTE d)
  {
  SPIM_SendTxData(d);
  while(!(SPIM_bReadStatus() & SPIM_SPIM_SPI_COMPLETE)){};
        
  send(0xFF);//reset
  send(0xFF);
  send(0xFF);
  send(0xFF);

        //Config schreiben
  send(0x10);
  //Config Schreibevorgang
  send(0xB16);

        //Mode schreiben
  send(0x8);
  //Mode Schreibevorgang 16bit
  send(0x0009); 

        //IO schreiben
  send(0x28);
  //IO Schreibevorgang
  send(0x03); //IEXC2 an IOUT2 // 1mA

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

while(1) {
    if (((PRT0DR & 0x10) == 0x00) && (i < 2)) {
      send(0x00);
      i++;
      x = SPIM_bReadRxData();
      y = x + (y << 8);
      
    } //Warten bis Din Flanke unten ist >>dann ausgeben
    
    if (((PRT0DR & 0x10) == 0x00) && (i == 2)) { 
      send(0x00);
      i++;
      }
    if(i >= 3) {

      LCD_Position(1,0);
      LCD_PrHexInt(y);
      y=0;
      i=0;
    }
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.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. Peter (Firma: NO) (blackjack18)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soweit ich das sehe, übergibst du bei "send" nur ein Byte. Später rufst 
du es teilweise mit 2 Byte auf.
  //Config Schreibevorgang
  send(0xB16);
...
  //Mode Schreibevorgang 16bit
  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.

Autor: A. Peter (Firma: NO) (blackjack18)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
{
   SPIM_SendTxData(d);
   while(!(SPIM_bReadStatus() & SPIM_SPIM_SPI_COMPLETE)){};
  }

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

sollte richtig sein. Chip ist aktiv.

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

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

SPIM_SendTxData(d) ist zum schreiben von Master auf Slave

Autor: Jens (Gast)
Datum:

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

Autor: Benjamin S. (recycler)
Datum:

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

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht 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:
  CS_LOW
        //Config schreiben
  send(0x10);
  //Config Schreibevorgang
  send(0x47); //BiasOn /BO=0 /unipolar /Boost=0/ gain=128
  send(0x90); //Internal Ref /BUF=1 /CH=AIN1

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

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

  CS_HIGH

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

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. Peter (Firma: NO) (blackjack18)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.