Rotationstaster

Dieses Interface ist eine spezielle Implementierung eines Bit Eingabe Interface mit einer Logik zur Entprellung des Rotations Tasters, wie er auf dem Spartan 3E Starter Kit eingesetzt wird. Die Logik zur Entprellung wurde entsprechend der Applikation zum Spartan 3E Starter kit von Xilinx in Verilog realisiert. Die E/A Register des Modul entsprechen denen des BIT_IN Interface

Funktion


Der Modul hat 3+2 Eingänge, die ein Interruptsignal bei steigender oder fallender Flanke am Eingang erzeugen können. Die Eingänge eines Moduls können einzeln programmiert werden, indem das jeweils korrespondierende Bit des entsprechenden Steuerregisters verändert wird.

Register


OffsetRegisterFunktionZugriffInitialwert
0ROT_TA_DATDatenread
1ROT_TA_IEInterrupt Freigabe für jedes Bitread/write 0x00019
2ROT_TA_EDGSELAuswahl der aktiven Flanke für jedes Bitread/write 0x00019
3ROT_TA_IR_STATUSInterrupt Status für jedes Bitread
4ROT_TA_CONTERZählt mit jedem rechts Impuls hoch und mit links Impuls runterread/write 0x00000


Das Datenregister ROT_TA_DAT enthält die Daten der Pins des Moduls und die Signale RECHTS und LINKS. Bei einem Reset werden diese beiden Bits mit Null initialisiert. Auf das Register kann nur lesend zugegriffen werden. Die Signale RECHTS und LINKS werden erst bei einem Lesen des ROT_TA_IR_STATUS Registers wieder gelöscht. Erst dann können sie erneut bei einer entsprechenden Bewegung gesetzt werden.

Im Steuerregister ROT_TA_IE können für die einzelnen Pins des Moduls Interrupts aktiviert werden. Bei einem Reset werden alle Bits mit Null initialisiert. Auf das Register kann lesend und schreibend zugegriffen werden.

Im Steuerregister ROT_TA_EDGSEL kann für die Pins des Moduls ausgewählt werden, ob sie auf steigende oder fallende Flanken einen Interrupt generieren sollen. Bei einem Reset werden alle Bits mit Null (= fallende Flanke) initialisiert. Auf das Register kann lesend und schreibend zugegriffen werden. (Die Signale RECHTS und LINKS sollten auf die steigende Flanke initialisiert werden.)

Im Statusregister ROT_TA_IR_STATUS wird für die einzelnen Pins des Moduls der Zustand des Interruptsignals angezeigt. Bei einem Reset werden alle Bits mit Null initialisiert. Auf das Register kann nur lesend zugegriffen werden. Die Bits des Registers werden erst bei einem Lesen eines der anderen 3 Register wieder gelöscht. Damit können auch sehr kurze Impulse erkannt werden. Die gesetzten Bits des Registers lösen nur dann Interrupt aus, wenn auch das Bit an der gleichen Position im ROT_TA_IE Register gesetzt ist.

Im Zählerregister ROT_TA_CONTER erhöht jede Bewegung nach rechts den Wert im Register und jede Bewegung nach links verringert den Wert im Register. Das Register kann mit jedem beliebigen Wert geschrieben werden. Nach Reset hat das Register den Wert Null.

Bei diesem Modul gibt es nur 3 Eingänge, die mit den Signalen des Rotations Tasters verbunden werden müssen. In der Dokumentation zum Spartan 3E Starterkit sind dazu folgende Bilder zu finden:

Image Image


Die drei Signale haben im Modul die Namen rot_a, rot_b und rot_p. Sie sind in dieser Reihenfolge mit den Eingängen des Modul Register PIN_IN_DAT verbunden. An den folgenden beiden Bit werden die Signale LINKS und RECHTS erzeugt. Das Register hat also folgenden Aufbau:

Bit Nummer Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Signal rechts links rot_a rot_b rot_p
Signal im Bild A B ROT_CENTER

Die Signale rechts und links werden erst nach einem Lesen des Registers ROT_TA_IR_STATUS wieder gelöscht!

rot.h

#ifndef __ROT_H
#define __ROT_H

#define ROT_PUSH    (1<<0)  // Druecken des Taster
#define ROT_SIG_B   (1<<1)  // Signal B von ROT
#define ROT_SIG_A   (1<<2)  // Signal A von ROT
#define ROT_LEFT    (1<<3)  // Signal Links
#define ROT_RIGHT   (1<<4)  // Signal Rechts

typedef struct rot_ta {
    volatile unsigned int data;    // (r)   (r = reset-interrupt)
    volatile unsigned int ie;      // (r/W) (r = reset-interrupt)
    volatile unsigned int edgsel;  // (r/w) (r = reset-interrupt)
    volatile unsigned int ir_stat; // (r)
    volatile unsigned int counter; // (r/w)
} rot_regs_t;

#endif

Konfiguration und Instanziierung


Die Interruptleitung des Moduls muss an den gewünschten Eingang des Interruptkontrollers angeschlossen werden und die IO-Pins an die Eingänge des Top Level Moduls. Diese müssen dann noch den Pins des FPGA im jConfig zugeordnet werden.

Verbindungen


NameRichtungPin am 3estkFunktion
resetin Reset
introut Interruptsignal mit einem freien Eingang am Interruptkontroller Verbinden.
rot_ainK18Eingangsleitung, die mit Signal A vom Rotationstaster des Boards verbunden ist
rot_binG18Eingangsleitung, die mit Signal B vom Rotationstaster des Boards verbunden ist
rot_pinV16Eingangsleitung, die mit Signal ROT_CENTER vom Rotationstaster des Boards verbunden ist


UCF Einstellungen für die FPGA-Pin K18, G18 und V16 die auf dem 3eSTK-Board mit dem Rotationstaster verbunden sind.
NET "ROT_A"      LOC = "K18" | IOSTANDARD = LVTTL | PULLUP   ;
NET "ROT_B"      LOC = "G18" | IOSTANDARD = LVTTL | PULLUP   ;
NET "ROT_CENTER" LOC = "V16" | IOSTANDARD = LVTTL | PULLDOWN ;

Die Signale des Rotationstaster sind bei diesem Modul alle einzeln konfigurierbar, da hier bei dem verwendeten Board unterschiedliche Eigenschaften eingestellt werden müssen. Die obigen UCF Angaben müssen der Board-Beschreibung (z.B.: ML507 Virtex 5) entnommen werden.

Getestete UCF Einstellungen für die FPGA-Pin AH30, AG30 und AH29 die auf dem ML507-Board mit dem Rotationstaster verbunden sind.
NET "pin_ROT_ROTARY_INCA" LOC = "AH30"  | IOSTANDARD = LVTTL | PULLDOWN;
NET "pin_ROT_ROTARY_INCB" LOC = "AG30"  | IOSTANDARD = LVTTL | PULLDOWN;
NET "pin_ROT_ROTARY_PUSH" LOC = "AH29"  | IOSTANDARD = LVTTL | PULLUP;

Protokoll des Tests

rot_ta.c
Timer, RTI, LED und UART Test in C

1. Zeit auf der Konsole anzeigen
   Ende bei jeder Eingabe
CTRL+B Stunden mit + stellen
CTRL+C Minuten mit + stellen
CTRL+D Sekunden mit + stellen
CTRL+E Ende Stellen

 Aktuelle Zeit: 20:13:55  SpartanMC 18 TU-Dresden InfMR

2. Alle Eingaben werden auf der Konsole angezeigt
   Ende bei ESC

Hallo, das ist der 2. Test


Test des Rotations und Taster Moduls

 ESC = Programm Ende

0    0    1    1    2    2    3
0....5....0....5....0....5....0
    ^

rot_ta2.c
Timer, RTI, LED, UART und Rotationstaster Test in C

1. Zeit auf der Konsole anzeigen
   Ende bei jeder Eingabe
   Stellen mit dem Rotationstaster oder
CTRL+B Stunden mit + stellen
CTRL+C Minuten mit + stellen
CTRL+D Sekunden mit + stellen
CTRL+E Ende Stellen

 Aktuelle Zeit: 07:36:22  Hallo ich bin SpartanMC 18   

2. Alle Eingaben werden auf der Konsole angezeigt
   Ende bei ESC

Hallo, das ist ein Test


3. Test des Rotationstaster Moduls

   ESC = Programm Ende

0    0    1    1    2    2    3
0....5....0....5....0....5....0
                      ^                             

Timer, RTI, LED, UART und Rotationstaster Test in C

1. Zeit auf der Konsole anzeigen
   Ende bei jeder Eingabe
   Stellen mit dem Rotationstaster oder
CTRL+B Stunden mit + stellen
CTRL+C Minuten mit + stellen
CTRL+D Sekunden mit + stellen
CTRL+E Ende Stellen

 Aktuelle Zeit: 09:56:09  Hallo ich bin SpartanMC 18

Testprogramm mit Ausgabe auf die mit der UART verbundene Konsole (mit Interrupt)

Programm für den Rotationstaster als C-Quelle rot_ta.c, als Übersetzungsliste rot_ta.lst und im spho-Format spartanmc_0.sph können hier geladen werden.
Programm für den Rotationstaster als C-Quelle rot_ta2.c, als Übersetzungsliste rot_ta2.lst und im spho-Format spartanmc_0.sph können hier geladen werden.

Konfiguration im binären Format für den Spartan 3E Starter Kit auf der das Programm lauffähig ist.

Die Konfiguration hat 3 Speicherblöcke und kann hier aus der TAR.GZ-Datei(external link) unter /spartanmc-projects-master/praktikum_prog_mc/foerderband/3estk/ oder einzeln aus dem GIT geladen werden.





SpartanMC