Im Schaltplan sind nicht alle Verbindungen korrekt, z.B. ist der Netzname an der PS/2 Buchse für KBD_DATA N&17, am PIC (RC3) aber N$3.
Wenn Du einen PIC18 verwendest, würde ich keine vier Pins für die PS/2 Schnittstelle verschwenden, sondern lediglich zwei Pins des PICs verwenden (Q2 und Q3 brauchst Du dann auch nicht).
Einen "Quasi-Open-Drain" Ausgang kannst Du mit einem PIC18 sehr einfach erzeugen. Das LAT-Bit für den entsprechenden Pin wird einmalig beim Programmstart auf "0" gesetzt. Um eine "1" zu erzeugen, wird das TRIS-Bit gesetzt (Pullup liefert die "1). Für eine "0" am Ausgang wird das TRIS-Bit gelöscht (der Portpin liefert die "0"). Um Signale von der Tastatur zu lesen, muß das TRIS-Bit natürlich auch gesetzt werden.
Der Code enthält zumindest einen gravierenden Fehler (abgesehen von der nicht vorhandenen Formatierung):
#INT_EXT
VOID interrupt(VOID){
disable_interrupts(INT_EXT);
disable_interrupts(GLOBAL);
PS2_BREAK_DATA = 0;
ps2_getdata();
//delay_ms(50); //Entprellung der Tasten, kann beliebig verändert werden
PS2_DATA_RECEIVED=1;
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
return;}
Das Deaktivieren von Interrupts in der ISR ist sinnlos, da die PIC Hardware automatisch dafür sorgt (GIE ist schon 0). Das globale Aktivieren von Interrupts (GIE=1) darf
niemals in der ISR vorgenommen werden. Anderenfalls kann (und wird es früher oder später) passieren, daß ein Interrupt auftritt, bevor die beim Eintritt in die ISR gesicherten Register zurückgeschrieben worden sind.
Der PIC springt also noch während der Ausführung des Interrupts erneut an den Interruptvektor und die beim Eintritt in die ISR gesicherten Werte werden mit den zum Zeitpunkt der Interruptausführung gültigen Werten überschrieben.
Damit ist ein Fehlverhalten des Nicht-Interrupt Codes vorprogrammiert.
Viele Grüße
Bernd