Forum: FPGA, VHDL & Co. Microbalze LED und Switches an einem PLB


von Mirco (Gast)


Lesenswert?

Hallo,

ich habe einen Microbalze aufgesetzt, bei dem ich im Moment bei meinem 
Spartan3AN Board die Stellung der Switches mit den LEDs anzeige.
Das funktioniert mit folgendem Code sehr gut:

#include "platform.h"
#include "xparameters.h"
#include "xgpio.h"


int main()
{
    init_platform();

    Xuint32 value;
    Xuint32 stop;

    XGpio gpio_led;
    XGpio gpio_switch;
    XGpio gpio_stop;

    XGpio_Initialize(&gpio_led, XPAR_LEDS_8BIT_DEVICE_ID);
    XGpio_Initialize(&gpio_switch, XPAR_DIPS_4BIT_DEVICE_ID);
    XGpio_Initialize(&gpio_stop, XPAR_BTNS_4BIT_DEVICE_ID);

    XGpio_SetDataDirection(&gpio_led, 1, 0x00000000);
    XGpio_SetDataDirection(&gpio_switch, 1, 0xffffffff);
    XGpio_SetDataDirection(&gpio_stop, 1, 0xffffffff);

    while(1)
    {
    value = XGpio_DiscreteRead(&gpio_switch, 1);
    XGpio_DiscreteWrite(&gpio_led, 1 , value);

    stop = XGpio_DiscreteRead(&gpio_stop,1);

    if(stop == 0x01)
    {
      break;
    }
    }

    cleanup_platform();

    return 0;
}


Meine erste Frage wäre nun, was genau macht denn die 
XGpio_SetDataDirection() Methode? Denn eigentlich kann ich hier denn 
Hex-Wert setzen wie ich möchte, oder sie ganz weg lassen. Das Programm 
funktioniert so oder so.

Als nächstes würde ich gerne die drei Gpio Instanzen für LEDs, Switches 
und den Stop Button durch nur einer Gpio Instanz ersetzen. Das müsste 
doch irgendwie gehen, wegen 32Bit System.
Ich weiss dazu unter anderem nicht wie ich dieses Gpio dann 
Initialisieren kann, damit nur 7 Register für die LEDS, 4 Register für 
die Switches und 4 Register für die Buttons hergenommen werden.
Und wie verschachtel ich dazu die Device_Ids? Bis jetzt habe ich immer 
die Device_IDs aus der xparameters.h hergenommen.

Muss man evt. was in XPS ändern?

Ich verwende ISE 13.4 zur Programmierung.

Danke schon mal für eure Hilfe.

Mirco

von Tobias B. (sessl3r)


Lesenswert?

Mirco schrieb:
> Meine erste Frage wäre nun, was genau macht denn die
> XGpio_SetDataDirection() Methode? Denn eigentlich kann ich hier denn
> Hex-Wert setzen wie ich möchte, oder sie ganz weg lassen. Das Programm
> funktioniert so oder so.

Na es schaltet deine IO's als Eingang oder Ausgang.
Das du nichts davon merkst dürfte mit zusammenhängen, dass du für die 
LEDs vermutlich einen _O und keinen _IO Port nutzt...
Aber um das zu verstehen Hilft dir das Datenblatt zu dem IP-Core und 
dessen Treibern (die Beschreibung der Methoden die du nutzt)

>
> Als nächstes würde ich gerne die drei Gpio Instanzen für LEDs, Switches
> und den Stop Button durch nur einer Gpio Instanz ersetzen. Das müsste
> doch irgendwie gehen, wegen 32Bit System.

Jap. Da die GPIO-Cores bis zu 2x32 IOs können.

> Ich weiss dazu unter anderem nicht wie ich dieses Gpio dann
> Initialisieren kann, damit nur 7 Register für die LEDS, 4 Register für
> die Switches und 4 Register für die Buttons hergenommen werden.

mit Register meinst du vermutlich Bit also z.B. 7 LEDs .. oder? 
Zumindest sieht deine Benennung oben danach aus ;)
Wenn ja dann z.B. so (unterste Bits LEDs):
1
XGpio_SetDataDirection(&dein_neuer_gpio, 1, 0xffffff80);

> Und wie verschachtel ich dazu die Device_Ids? Bis jetzt habe ich immer
> die Device_IDs aus der xparameters.h hergenommen.

Wieso verschachteln? Du willst doch nur noch eine Instanz deines 
GPIO-Cores haben. Also hast du auch nur noch eine Device-ID.

> Muss man evt. was in XPS ändern?

Natürlich. Du willst ja etwas an deiner Hardware ändern. Du musst deine 
LEDs, Schalter und Buttons auf einen GPIO legen. Ist nicht schwer und 
sollte mit Google recht schnell bewältigbar sein!

Grüße

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.