Forum: Mikrocontroller und Digitale Elektronik (PS/2)Signal erzeugen


von Arnold (Gast)


Lesenswert?

Guten Abend

Ich bin noch halbwegs neu in der Welt der Mikrocontroller.
Nun mache ich mich daran ein PS/2 Signal mit einem AT-Mega8 zu emulieren 
(Tastatur emulieren).
Ich frage mich nun wie man am besten die Sache angeht zur 
Signalerzeugung. Benutzt man dazu normalerweise einen Timer, der immer 
zur nächsten Signaländerung ein Interrupt auslöst?
Ausserdem noch eine Frage zur Taktung. Momentan läuft der Mega8 mit dem 
Internen Takt von 1MHz. Da die einzelnen Signaländerungen zum Teil etwa 
25 us auseinander sind, denke ich, dass das also ein wenig zu knapp ist, 
oder? Lieber mit einem 8 - 16 MHz Quarz takten?
Und wie würde man das ganze etwa angehen, wenn man alles Klassenbasiert 
(also allgemein und weiterverwendbar) gestalten möchte? Oder ist das 
wegen dem Gebrauch von Timern und Interrupten nicht mehr zu empfehlen? 
Oder nicht üblich?
Grüsse Arnold

von Achim M. (minifloat)


Lesenswert?

Arnold schrieb:
> Und wie würde man das ganze etwa angehen, wenn man alles Klassenbasiert
> (also allgemein und weiterverwendbar) gestalten möchte? Oder ist das
> wegen dem Gebrauch von Timern und Interrupten nicht mehr zu empfehlen?

Je näher an der Hardware, desto weniger wiederverwendbar.
Gut wäre es, wenn du den Zugriff auf dein Tastaturemulationsmodul als 
Funktionen präsentierst, die immer gleich sind.

Interrupt- bzw. Timerbasierte Sachen kannst du z.B. so lösen, dass du in 
einer "Hardwarenahen Interrupt-/Timer-C-Source", die nur für das 
aktuelle Projekt gültig ist, die ISR selbst schreibst.
In der ISR wird nichts anderes getan, als z.B. eine pstwo_timer_tick()- 
Funktion Aufzurufen. So müsstest du in jedem Projekt, wo du das 
verwendest, immer nur den Timer neu einstellen, in der ISR die Funktion 
aufrufen und das wars.

Für Portzugriffe definiert man sich Makros, z.B.
#define PSTWO_PORT PORTA
#define PSTWO_DDR  DDRA
#define PSTWO_PIN  PINA
#define PSTWO_DATA  (1<<PA1)
#define PSTWO_CLOCK (1<<PA2)
#define PSTWO_CLK_SET PSTWO_PORT|=PSTWO_CLOCK
#define PSTWO_CLK_CLR PSTWO_PORT&=~PSTWO_CLOCK
#define NAECHSTER_PLANMAESSIGER_HALT BERLIN_HBF
Die kommen in eine pstwo_config.h und Konfigurieren das Keyboard-Modul.

mfg mf

PS:
Deine Geschichte vice versa, vielleicht was zum "abschauen" dabei:
http://www2.htw-dresden.de/~beck/Atmel/Keyboard/PS_2-keyboard.html
Beyondlogic über PS/2 Tastenbretter:
http://retired.beyondlogic.org/keyboard/keybrd.htm
Und das Ganze als USB-Gerät mit in Software emuliertem USB1.1:
http://obdev.at/products/vusb/prjhid.html

von Arnold (Gast)


Lesenswert?

Vielen Dank für die Ansätze :)
Ich werde mich heute ans Versuchen machen.

Noch zu der Frage, welche Taktung für diese Aufgabe geeignet wäre.
Natürlich kann ich einfach auf 16MHz takten, aber ich möchte auch gerne 
selbst abschätzen können, was man da etwa so braucht. Das Signal 
benötigt änderungen ja etwa all 25us. Was gerade mal 25 Taktzyklen 
bedeuten würde. Neben dem PS/2 Signal sollte auch noch der UART zeichen 
empfangen können. Daher denke ich, dass das viel zu wenig ist?

von Achim M. (minifloat)


Lesenswert?

Arnold schrieb:
> ollte auch noch der UART zeichen
> empfangen

Das macht er doch von selbst. Interruptgetrieben würde sich Polling 
erübrigen.

Arnold schrieb:
> Das Signal benötigt änderungen ja etwa all 25us. Was gerade mal 25
> Taktzyklen bedeuten würde.

Betreib den Mega8 doch mit 8MHz oder 16MHz. Dann wird das weniger knapp.
Den Takt gibt eine PS/2-Tastatur doch selbst vor, da kann man bei Bedarf 
auch "bremsen". Du kannst natürlich mit einer viel kleneren Datenrate in 
den PS/2 rein senden. 10kHz Clock gehen laut Beyondlogic.
Irgendwie kann man doch bestimmt den USI eines ATtiny dazu 
zweckentfremden.
Ein ATmega8 hätte da auch noch TWI; die Logik zum Startcondition 
erzeugen etc. ist da auch schon drin. Nur: man bräuchte irgendwie 9Bit, 
wie ich das bei Beyondlogic so sehe...

mfg mf

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.