Keyboard / INT Problem

Gast #129183
Hallo!

Habe ein PS2 Keyboard an einen 8051 angeschlossen.
DATA auf P1.5
CLOCK auf /INT0 (P3.2)
Vcc und GND entsprechend

Nun mache ich folgendes:

EA = 1 (interrupts enable)
EX0 = 1 (int0 enable)
IT0 = 1 (react on falling edge)
CLK = 1   (keyboard only sends if clk & data are 1)
DATA = 1   (~)

Jetzt hab ich mir eine interrupt 0 funktion geschrieben,
die nix macht, außer das da ein breakpoint drin ist.

Problem ist, er springt dort nie rein. Sobald ich ne Taste
drücke müsste das keyboard doch ein clk signal senden und der
controller in die interrupt behandlung springen, oder?

Habe ich was vergessen?

Danke
Karl
Gast
Muss ich das so connecten wie auf der Seite von Tobi beschrieben mit
Kondensatoren oder geht es auch einfach die leitungen an den uC
anzuschließen so wie es in den atmel application notes z.b. beschrieben
steht?

Danke.
Gast
Da der 8051 quasi Open Collector Ausgänge hat, kannst du die Leitungen
direkt anschließen.
Wie gesagt: Einige Tastaturen funktionieren nur, nachdem sie
initialisiert wurden. D.h. nach dem Einschalten senden sie eine Meldung
an den PC, der darauf mit einer Bestätigung und meistens mit der
Initialiaiserung antwortet. Nur dann funktionieren die Tastaturen.
Gast
Heißt quasi open collector ausgänge das ich sowohl ein signal von der
tastatur empfangen kann sowie ein signal vom uC auf die leitung legen
kann?
"D.h. nach dem Einschalten senden sie eine Meldung" -> müsste das
nicht schon den interrupt auslösen? Oder schalt ich die interrupts
vielleicht zu spät ein und krieg das signal deswegen nicht?

Danke
Gast
>Heißt quasi open collector ausgänge das ich sowohl ein signal von der
>tastatur empfangen kann sowie ein signal vom uC auf die leitung legen
>kann?
Ja, immer wenn ein Bit auf High gesetzt ist, ist es als Eingang
verwendbar.

Nach dem Selbststest der Tastatur sendet diese den Wert AA und zeigt
an, dass der Test erfolgreich war. Es müsste also eigentlich ein
Interrupt kommen. Poste mal den Code.
Gast
sbit CLK = P3^2;
sbit DAT = P1^2;

void esr0_int() interrupt 0
{
   counter++;    //hier ist ein breakpoint
}

void main()
{
 IT0 = 1;
 EX0 = 1;
 EA = 1;

 DAT = 1;
 CLK = 1;

 while(1);
}

Ich hab den Code leider nicht hier, aber so ungefähr sieht er aus.
Hängt ne Tastatur dran, springt er nie zum breakpoint. Setz ich den
Interrupt per hand mit nem 10k pullup widerstand springt er bei
absteigender taktflanke rein.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.