Forum: FPGA, VHDL & Co. Microblaze Endlosschleife


von Gustl B. (-gb-)


Lesenswert?

Hallo, ich habe jetzt einen Microblaze. Und möchte gerne, dass das 
Programm darauf endlos läuft. Also dass immer wenn ich einen GPIO 
DIP-Switch schalte, das auch zeitnah und ohne Interaktion wie Reset auf 
den ebenfalls angeschlossenen LEDs angezeigt wird.

Ich habe dazu ein while(1){ Anweisungen } geschrieben. Aber: Das scheint 
nur einmal zu laufen?! Oder brauche ich irgendwelche Interrupts, damit 
die LEDs aktualisiert werden?

Hier der vollständige Text:
1
#include "xgpio.h"
2
#include "xparameters.h"
3
#include "platform.h"
4
#include "xil_printf.h"
5
6
int main(void)
7
 {
8
   XGpio LED;
9
   XGpio DIP;
10
   XGpio PB;
11
12
   XGpio_Initialize(&LED, XPAR_LEDS_DEVICE_ID);
13
   XGpio_Initialize(&DIP, XPAR_DIP_SWITCHES_DEVICE_ID);
14
   XGpio_Initialize(&PB, XPAR_PUSH_BUTTONS_DEVICE_ID);
15
16
   XGpio_SetDataDirection(&LED, 1, 0x00000000);
17
   XGpio_SetDataDirection(&DIP, 1, 0x0000001F);
18
   XGpio_SetDataDirection(&PB, 1, 0x0000001F);
19
20
   Xuint32 data_DIP_old = 0;
21
   Xuint32 data_DIP_new = 0;
22
23
   char c = 0;
24
25
   while(1){
26
     data_DIP_new = XGpio_DiscreteRead(&DIP, 1);
27
28
     if(data_DIP_new != data_DIP_old)
29
     {
30
       data_DIP_old = data_DIP_new;
31
       XGpio_DiscreteWrite(&LED, 1, data_DIP_new);
32
       c = (char)data_DIP_new;
33
       xil_printf("%c",c);
34
     }
35
36
   }
37
}

Der PushButton wird derzeit nicht verwendet, der UART schon, der soll 
das an den DIP-Switches eingestelle Byte als Char senden. Das macht der 
auch mehrmals wenn ich statt der while eine for Schleife verwenden. Bei 
while wird nur einmal direkt nach dem Reset gesendet/LEDs zugewiesen.

Was muss ich also noch beachten?

Vielen Dank!

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> XGpio LED;
>    XGpio DIP;
>    XGpio PB;
Hast Du wirklich drei GPIO Instanzen? Ich bin bisher immer mit einem 
GPIO-Port ausgekommen...

Sind die Pins richtig zugeordnet?
Geht xil_printf (-> Hello world)?
Hast Du schon ein Lauflicht programmiert?

Duke

von Gustl B. (-gb-)


Lesenswert?

Ja? Wie soll ich da sonst LEDs, Switches gleichzeitig anbinden?

Nach dem Reset läuft das Programm auch, einmal. Also die LEDs leuchten 
wie die Switches eingestellt sind. Das Hello World läuft auch, aber 
sendet auch nur einmal. Lauflicht habe ich mit C noch nicht probiert, 
wird auch schwierig wenn ich keine Endlosschleife habe.

von Duke Scarring (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Ja? Wie soll ich da sonst LEDs, Switches gleichzeitig anbinden?
Na vielleicht macht ja da der Microblaze wieder 'ne Sonderlocke.
Ich habe bei mir das so ähnlich gemacht, wie bei einem handelsüblichen 
Mikrocontroller. Da ich ein 32-Bit System habe, hab ich auch 32 IO an 
meinem GPIO.
Im Unterschied zum Mikrocontroller komm ich an die Signale vor den 
Ausgangstreibern ran. Daher habe ich z.B.
Button 0 bis 3 auf Input 0 bis 3 liegen (lesen) und
LED 0 bis 7 auf Output 0 bis 7 (schreiben).
Effektiv komme ich so auf bis zu (=DSL speech) 64 Pins, die ich mit 
einem GPIO-Modul abdecken kann (ja, die Richtungsumschaltung könnte man 
auch noch als Ausgänge missbrauchen...).

Gustl Buheitel schrieb:
> Das Hello World läuft auch, aber
> sendet auch nur einmal.
Das steht ja auch nicht in einer while(1)-Schleife, oder?

> Lauflicht habe ich mit C noch nicht probiert,
Mach das mal. So, wie die Schleife da steht, muß sie eigentlich gehen.
Kannst ja das delay erstmal mit einer Zählschleife machen.

Duke

von Gustl B. (-gb-)


Lesenswert?

Ok, Fehler gefunden!

Ich hatte den Reset mit einem Taster verbunden. Jetzt läuft der 
Microblaze aber nur, wenn der Taster gedrückt ist. Konnte es in der 
system.mhs im XPS ändern.

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> Jetzt läuft der
> Microblaze aber nur, wenn der Taster gedrückt ist.
Dann würde ich da mal noch einen Inverter einbauen. Sonst kommst Du vom 
FPGA ja gar nicht mehr weg ;-)

Duke

von Gustl B. (-gb-)


Lesenswert?

Hallo, kann man das in XPS machen oder muss man da über ISE gehen?

Wenn ich RST_POLARITY = 0 nach 1 ändere in den .mhs, dann baut das nicht 
mehr, weil der Reset ja nicht nur für den Microblaze, sondern auch für 
alle anderen Komponenten gebraucht wird, z.B. den clock_generator_0.

Ich könnte das aber vielleicht auf 1 stellen und dafür bei allen anderen 
Komponenten ein NOT davor. Also beim clock_generator_0:
PORT RST = NOT sys_rst_s

Bin mir aber nicht sicher ob das so klappt. Erstmal werde ich den Reset 
auf einen Pin legen und den eben auf High setzen wenn der Microblaze 
laufen soll.

: Bearbeitet durch User
von Duke Scarring (Gast)


Lesenswert?

Gustl Buheitel schrieb:
> kann man das in XPS machen oder muss man da über ISE gehen?
Da hab ich keine Ahnung. Was ich schon gesehen habe:
Statt einem Button wurde ein DIP-Switch verwendet :-)

Duke

von Gustl B. (-gb-)


Lesenswert?

Die sind mir zu kostbar :-D Hab das jetzt auf einem normalen IO Pin und 
den auf 3,3V gelegt. Funktioniert super!

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.