Vivado SDK: Registerlesen

Gast #5595396
Lesenswert?

Hallo zusammen,
ich habe ein Zybo Z7-20 und möchte damit eine AD Wandlung im Event-Modus 
durchführen.
Dazu hab ich mich ein bisschen eingelesen und festgestellt, dass man um 
die Wanldung zu aktivieren im Register 0x0C das LSB 1 setzen muss. Ich 
verwende die Library xadcps.h
1
XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), 0x0C, 0x1);

Nun debugge ich das ganze und lese das Register aus und stelle fest, 
dass die 1 im LSB nicht übernommen wurde.

Hat jemand von Euch Erfahrungen damit, wo ich meinen Fehler habe?
Übrigens Ich setzte das Signal anschließend sofort wieder zurück!

Hoffe jemand kann dem Verzweifelten helfen :P
VG Andi
Gast #5602680
Lesenswert?

Sehr gerne!

Vivado+SDK 2018.2 mit Zybo Z7-20.
XADC mit event-driven Mode.

So laut PG091 kann ich über CONVST den XADC sampeln.
In das Register 0x0C kann ich die Konvertierung starten lassen. Der Code 
dazu zum Auslesen ist ja oben abgebildet.

Und danach warte ich eigentlich nur noch auf EOS (ist ja mit CONVST 
verbunden). Und hier passiert nichts mehr. Der Interrupt wird nie 
erkannt.
1
#include <stdio.h>
2
#include "xadcps.h"
3
#include "sleep.h"
4
#include "xtime_l.h"
5

6
#define XADCPS_DEVICE_ID  XPAR_PS7_XADC_0_DEVICE_ID
7

8
XAdcPs XAdcPtr;
9
XTime stamp[1];
10
u32  test=0;
11

12
int main(void)
13
{
14
  XAdcPs_Config *ConfigPtr;
15
  int status;
16

17
  ConfigPtr = XAdcPs_LookupConfig(XADCPS_DEVICE_ID);
18
  if (ConfigPtr == NULL)
19
  {
20
    return XST_FAILURE;
21
  }
22
  status = XAdcPs_CfgInitialize(&XAdcPtr, ConfigPtr, ConfigPtr->BaseAddress);
23
  if (status != XST_SUCCESS)
24
  {
25
    return XST_FAILURE;
26
  }
27

28
  //set CONVST first time high
29
  XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), XADCPS_MSTS_OFFSET, 0x0);    //set CONVST to 0
30
  usleep(500);
31
  XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), XADCPS_MSTS_OFFSET, 0x1);    //set CONVST to 1 (rising edge)
32
  usleep(2);
33
  XAdcPs_WriteReg((&XAdcPtr)->Config.BaseAddress, XADCPS_MSTS_OFFSET, 0x0);    //set CONVST back to 0
34
  usleep(1000);
35

36

37
  while(1)
38
  {
39
    if (((XAdcPs_ReadReg((&XAdcPtr)->Config.BaseAddress, XADCPS_INT_STS_OFFSET)) & 0x20) == 0x20) //if EOS is high
40
    {
41
      XTime_GetTime(&stamp[0]);
42
      break;
43
    }
44
    test++;
45
  }
46

47
  printf("%llu\n", (unsigned long long)stamp[0]);
48
  printf("Successful!\n");
49

50
  return XST_SUCCESS;
51
}
Gast #5602961
Lesenswert?

So ich habe jetzt gerade einen Test gemacht.
Wenn ich das kontinuierliche Samplen aktiviere, dann ich auf dem Oszi 
das EOS/EOC Signal sehen, aber ein Auslesen über XAdcPs_ReadReg aus dem 
Statusregister ist nicht möglich.

Verwende ich den Event-getriggerten Modus, funktioniert XAdcPs_WriteReg 
in das 0x0C Register (Aktivierung der Konvertierung zu Beginn durch 
CONVST) nicht und somit läuft die ganze Konvertierung nicht.
Gast #5604171
Lesenswert?

Hast du das externe CONVST-Signal belegt?
Das CONVST startet den Samplingprozess bei einer steigenden Flanke. 
Allerdings wird das CONVST, das du ins Register schreibst, mit dem 
externen CONVST verODERt. Wenn auf dem externen Signal bereits ein high 
liegt, bekommst du keine steigende Flanke durchs Registerschreiben.
Gast #5604844
Lesenswert?

Wie muss ich das externe CONVST-Signal belegen? Ich habe in meinem 
Blockdiagramm von EOS eine Verbindung zu CONVST (XADC_Wiz-Block) 
gezogen.

Wie im Programmcode zu sehen ist, schreibe ich zuerst eine 0 in das Bit 
des Registers und dann erst die 1 und dann wieder die Null.

derVerzweifelte schrieb:

>   XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), XADCPS_MSTS_OFFSET,
> 0x0);    //set CONVST to 0
>   usleep(500);
>   XAdcPs_WriteReg(((&XAdcPtr)->Config.BaseAddress), XADCPS_MSTS_OFFSET,
> 0x1);    //set CONVST to 1 (rising edge)
>   usleep(2);
>   XAdcPs_WriteReg((&XAdcPtr)->Config.BaseAddress, XADCPS_MSTS_OFFSET,
> 0x0);    //set CONVST back to 0
>   usleep(1000);

Das Auslesen des Bits (im kontinuierlichen Sampling-Modus) -hier kann 
ich mit dem Oszi EOS messen- funktioniert zudem nicht.
Also habe ich irgendwie keinen Schreib-/Lesezugriff

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