Datum: 13.05.2008 21:33
Hi, ich verzweifle hier gerade und weiß nicht so recht weiter. Ich möchte Tastendrücke an einer PC-Tastatur erkennen und auch auswerten. Prinzipiell habe ich es schon geschafft, Daten einzulesen und auch die Tasten auf einem LCD anzuzeigen. Es hapert aber im Detail. Ein Tastendruck wird von der Tastatur in 11 bits verpackt. Ein Startbit(0), 8 Datenbits die den Tastaturcode angeben, ein Parity und ein Stopbit(1). Die Datenleitung ist vor und nach der Datenübertragung immer auf High. Ich hatte mir nun ein Shiftregister gebastelt das die Daten kontinuierlich einliest und shiftet. Das führt aber zu Problemen, wenn man die Tasten auswerten möchte(ich möchte im speziellen einen Druck auf die ShiftTasten erkennen/auswerten) Nun versuche ich mich daran, einen Zähler der bis 11 zählt zu bauen(habe ich), der das Shiftregister irgendwie enabelt wenn das Startbit 0 erkannt wurde, und das dann einfach 11 Werte in den Speicher reinshiftet und danach das Shiften bis zum nächsten Tastendruck stoppt. Irgenwie bekomme ich die Steurung des ganzen aber nicht hin Ich habe einen Zähler und einen Shift Process, aber irgendwie müssen die sich ja gegenseitig enablen bzw. steuern. Vorallem darf der Zähler ja nur gestartet werden, wenn ein Startbit=0 erkannt wurde. Wenn eines der Datenbits 0 ist, soll ja einfach weitergezählt werden. Kann mir jemand einen Denkanstoß geben? Ich hab da irgendwie einen Knoten im Kopp und bin leider auch kein VHDL Profi Oder mache ich das ganze viel zu kompliziert und es geht auch einfacher? Hier mal mein Codeauszug: SHIFT_TASTE: process (RESET, INTERN_KEY_INTERUPT) begin if RESET='0' then --initialisieren elsif (INTERN_KEY_INTERUPT = '0' and INTERN_KEY_INTERUPT'event) then KEY_INPUT <= KEY_INPUT(10 downto 0) & K_IN_DATA; end if; end process SHIFT_TASTE; COUNT11:process(RESET,INTERN_KEY_INTERUPT) begin if RESET='0' then COUNT_INTR <= (others => '0'); elsif (INTERN_KEY_INTERUPT = '0' and INTERN_KEY_INTERUPT'event) then COUNT_INTR <= COUNT_INTR + 1; end if; end process COUNT11;
Datum: 14.05.2008 21:33
Hast Du eine passende Testbench dazu? Rick
Datum: 14.05.2008 21:51
öhm...das ist ein spartan 3 board. ich simuliere mit do files in modelsim. an testbenches hab ich mich noch net rangetraut. reichen meine angaben? ich denke mir gehts auch eher um so bischen pseudocode...vhdl ist einfach von der denkweise irgendwie total anders als c oder andere hochsprachen. ich tu mich da recht schwer mit
Datum: 14.05.2008 21:55
Du brauchst eine state machine (-> google, wiki, forumssuche, etc) mit drei Zuständen: idle, warten und auswerten. Aus idle gehst du nach warten, wenn eine 0 erkannt wird, dnan zählst du bis 11, und dann wertest du das Schieberegister aus und gehst wieder in idle.
Datum: 14.05.2008 23:17
Um was handelt es sich bei INTERN_KEY_INTERUPT ? Ist das ein Takt oder ein Signal von der Tastatur ? Wenn es "nur" ein Signal ist könnte es schon mal daran liegen, dass dein Prozess keinen Takt hat und somit nur bei jedem Tastendruck reagiert. Ich würde Dir raten einen Testbench zu schreiben, dann kannst Du Dir wenigstens mal anschauen was da wirklich passiert. Ansonsten ist Jans Tip sehr gut. Eine Statemachine ist wohl die einfachste Lösung dafür.
Datum: 14.05.2008 23:26
ich probiere es mal mit einer statemachine. INTERN_KEY_INTERUPT ist quasi ein runtergeteilter Systemtakt. ich prüfe 256 mal ob eine clock von der tastatur anliegt, und erst dann lese ich die tastaturdaten aus. soll störungen verhindern
Datum: 15.05.2008 18:05
Mach Dir eine richtige Testbench. Ein, die Dir die Werte generiert, die Du erwartest. Damit kannst Du erstmal schauen ob Dein Modul richtig reagiert. Alles andere ist doch nur stochern im Nebel und macht auf Dauer keinen Spaß. Rick
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
- Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [vhdl]VHDL-Code[/vhdl]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel