Autor Thema: Tastatur druck erzeugt kein Interrupt  (Gelesen 9992 mal)

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« am: 19. August 2005, 20:56 »
Ich hab den PIC umprogrammiert und IDT + GDT eingerichtet.
Funktioniert soweit auch. Aber jetzt möchte ich natürlich kleine Treiber für ein paar Hardware Komponenten programmieren. Und hab gelesen, dass der PIC dafür zuständig ist die Hardware ständig zu überprüfen und bei einer positiven Überprüfung ein Interrup auszulösen. Doch wenn ich in einer Endlosschleife (in der zurzeit noch nichts steht) bin und eine Taste drück wird kein Innterrupt ausgelöst.
Muss noch etwas gemacht werden, dass ich nicht weiß? Oder hab ich den PIC falsch umprogrammiert? (hab in umprogrammiert auf Int 32 –Int 47)  :?:

PS. Was hat es mit dem IRQ 0 (System Zeit Interrup bei mit Int 32) auf sich, wir of wird er aufgerufen und muss ich noch was zu programmieren (Zur Zeit ist fast nicht bei Int 32 da) sprich System Zeit Uhr oder so etwas?  :?:

mov al, 00010001b ;Das ICW in AL schreiben
out 0x20, al ;ICW an PIC1 senden
out 0xA0, al ;ICW an PIC2 senden

mov al, 0x20 ;AL auf 32 setzen
out 0x21, al ;ICW2 an ersten PIC senden
mov al, 0x28 ;AL auf 40 setzen
out 0xA1, al ;ICW2 an zweiten PIC senden

mov al, 00000100b ;Die IRQ2 Leitung auf 1 setzen
out 0x21, al ;An den Master-PIC senden
mov al, 2 ;Hier nun die NUMMER der IRQ-Leitung angeben
out 0xA1, al ;An den Slave-PIC senden

mov al, 00000001b ;Die Bits wie oben beschrieben setzen
out 0x21, al ;ICW4 an Master-PIC senden
out 0xA1, al ;ICW4 an Slave-PIC senden

mov al, 0x20 ;EOI-Wert in AL ablegen
out 0x20, al ;EOI an Master-PIC senden

mov al, 0x20 ;EOI-Wert in AL ablegen
out 0xA0, al ;EOI an Slave-PIC senden
out 0x20, al ;EOI an Master-PIC senden

Code vor dem Sprung zum PMode.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 19. August 2005, 21:54 »
Du musst das EOI Signal erst senden, wenn der Interrupt aufgetreten ist.
Hast du die Interrupts mit STI wieder aktiviert, falls du sie deaktiviert hattest?
Du solltest den PIT demaskieren, also 0 an beide PIT Ports senden. (Ich glaub es waren die 2. Ports, guck lieber nochmal im Tutorial hier auf der Seite nach.)

IRQ 0 ist der PIT IRQ, standardmässig tritt er 18,5 mal pro Sekunde auf, das kann man aber über den PIT( Programmable Interrupt Timer ) ändern.
Das CMOS stellt ausserdem noch einen Timer bereit (IRQ9) der bis zu 8192 mal in der Sekunde aufgerufen werden kann.

Für IRQ 0 solltest du auf jeden Fall einen ISR bereitstellen oder den Interrupt maskieren, da man den Timer soweit ich weiß nicht deaktiveren kann.
Der CMOS Timer wird erst aktiviert, wenn man ein Bit im CMOS setzt.

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 20. August 2005, 09:44 »
Ich hab jetzt den Code umgeändert. Jetzt sind am Anfang nur noch die 4 Code Abschnitte.
Jetzt wird der Tastatur Treiber (Int 33) aufgerufen bei einem Tastendruck. Jetzt soll ich doch (EOI):
mov al, 0x20 ;EOI-Wert in AL ablegen
out 0xA0, al ;EOI an Slave-PIC senden
out 0x20, al ;EOI an Master-PIC senden

senden. Bei welchen IRQs muss ich denn:
mov al, 0x20 ;EOI-Wert in AL ablegen
out 0x20, al ;EOI an Master-PIC senden

senden.
Bis jetzt sende ich es bei IRQ 0 (Int 32)
Und was soll ich noch machen? Denn so wie ich es jetzt habe wird der Tastatur Interrupt nur einmal aufgerufen. Da fehlt doch noch etwas oder?:?:

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 20. August 2005, 11:30 »
Bei IRQs 0 - 7 musst du das EOI an den Master PIC senden, bei 8-15 musst du das EOI an beide PICs senden.

Eventuell musst du beim Tastatur IRQ noch den Keycode lesen, damit ein weiterer Interrupt auftritt, ich bin mir nicht sicher, ob das bei der Tastatur nötig ist. Der Keycode wird bei der Tastatur aus Port 0x60 ausgelesen.

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 23. August 2005, 17:00 »
Es funktioniert jetzt, hatte zwar noch ein paar Probleme welche ich jetzt auch noch gelöst habe. Vielen Dank für die Hilfe.  :lol:

 

Einloggen