Forum: FPGA, VHDL & Co. XADC Zybo / ZC701 - AUX updated nicht


von Timmo H. (masterfx)


Lesenswert?

Hallo,
ich habe hier ein Zybo Board (Zynq 7010) und programmiere es Bare-Metal.
Jetzt wollte ich eine AUX (AD6) verwenden über den XADC. Also habe ich 
im Block-Design ein XADC Wizard IP Core eingefügt, den AD6P_P/N 
ausgewählt und die Pins im IO Planner entsprechend verbunden.
Jetzt habe ich ein Beispiel auf Basis des xadc polling Beispiels 
erstellt. In einer Schleife frage ich die XADCPS_CH_TEMP und 
(XADC_CH_AUX_MIN + 6) ab (500ms Interval). Der Wert vom XADCPS_CH_TEMP 
ändert sich, der AD6 bleibt immer gleich. Nach einem Reset ändert sich 
der AD6 (der Wert der dann aber ausgegeben wert stimmt, nur wird er eben 
nicht aktualisiert). Jemand eine Idee woran das liegen kann?
Im Wizard habe ich Continuous ausgewählt und alle Alarme deaktiviert.
1
int xadc_init(){
2
  XAdcPs_Config *ConfigPtr;
3
4
  int Status;
5
6
  ConfigPtr = XAdcPs_LookupConfig(XADC_DEVICE_ID);
7
  if (ConfigPtr == NULL) {
8
    return XST_FAILURE;
9
  }
10
  XAdcPs_CfgInitialize(XAdcInstPtr, ConfigPtr, ConfigPtr->BaseAddress);
11
12
  Status = XAdcPs_SelfTest(XAdcInstPtr);
13
  if (Status != XST_SUCCESS) {
14
    return XST_FAILURE;
15
  }
16
  XAdcPs_SetSequencerMode(XAdcInstPtr, XADCPS_SEQ_MODE_SAFE);
17
18
19
  return 0;
20
}
21
22
int xadc_read(int channel){
23
  int val = 0;
24
  val = XAdcPs_GetAdcData(XAdcInstPtr, channel);
25
  return val;
26
}
27
...
28
//in der main
29
while(1){
30
 val = xadc_read(XADCPS_CH_TEMP);
31
 xil_printf("xadc Temp: %d\r\n", val);
32
33
 val = xadc_read(XADC_CH_AUX_MIN + 6);
34
 xil_printf("xadc AUX: %d\r\n", val);
35
}

von Timmo H. (masterfx)


Angehängte Dateien:

Lesenswert?

Anbei noch die Bilder von XADC Wizard und Blockdesign

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Alles ohne Gewaehr, weil ich schon ewig nicht mehr den XADC benutzt habe 
und gerade keinen alten Code da habe zum nachschauen.

Schau dir mal das Kapitel ueber den Channel Sequencer in UG480 an. Da 
wuerde ich vermuten, liegt der Hund begraben.

Versuch mal die XAdcPs_SetSequencerMode Zeile durch
1
XAdcPs_SetSequencerMode(XAdcInstPtr, XADCPS_SEQ_MODE_SAFE);
2
XAdcPs_SetSeqInputMode(XAdcInstPtr, XADCPS_SEQ_CH_AUX06);
3
XAdcPs_SetSequencerMode(XAdcInstPtr, XADCPS_SEQ_MODE_CONTINPASS);

zu ersetzen.

Was mir noch auffaellt: Bist du sicher das XADC_CH_AUX_MIN stimmt und 
nicht XADCPS_CH_AUX_MIN lauten muss? Ich wuerde hier eigentlich einen 
Error zur Compilezeit erwarten.

von Timmo H. (masterfx)


Lesenswert?

Hallo Tobias,
danke für deine Antwort.
Habe das gerade mal getestet, hat aber leider keine Änderung gebracht.

> Was mir noch auffaellt: Bist du sicher das XADC_CH_AUX_MIN stimmt und
> nicht XADCPS_CH_AUX_MIN lauten muss? Ich wuerde hier eigentlich einen
> Error zur Compilezeit erwarten.
gut gesehen, aber ich hatte mir die DEFINEs für meinen "xadc_drv.h" 
nochmal dupliziert und leicht unbenannt damit ich kein Redefine habe. 
Hätte ich mal erwähnen sollen...Ist beides 16, also offset zu den AUX 
Channels
1
xadc AUX:  13756
2
xadc Temp: 41470
3
xadc AUX:  13756
4
xadc Temp: 41574
5
xadc AUX:  13756
6
xadc Temp: 41532
7
xadc AUX:  13756
8
xadc Temp: 41654
9
xadc AUX:  13756
10
xadc Temp: 41602
11
xadc AUX:  13756
12
xadc Temp: 41596
13
xadc AUX:  13756

: Bearbeitet durch User
von Timmo H. (masterfx)


Lesenswert?

So, ich noch mal.
Der Tipp mit dem Sequencer hat zumindest insofern geholfen, als dass ich 
dann den XADC Wizard von Single Channel auf Channel Sequencer gestellt 
habe und dann scheint es zu gehen.

EDIT:
Ach ich sehe gerade... hätte ich vermutlich den SequencerMode auf 
XADCPS_SEQ_MODE_SINGCHAN stellen müssen!? Ja vermutlich

: Bearbeitet durch User
von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Ok das kann sein. Ich wuerde mal im Treiber Code schauen, da stehen 
vielleicht noch ein par Infos. Ich glaub zumindest am Anfang musst du 
einmal XADCPS_SEQ_MODE_SAFE setzen und anschliessend dann mit den 
entsprechenden Mode ueberschreiben. Ein Hinweis darauf steht zumindest 
in der Treiber Doku.

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.