![]() ![]() INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo Wolfgang! In diesem Fall bleibt Dir eigentlich nichts anderes übrig, als die IRQ-Funktionalität auf einen anderen Port zu legen. Allerdings ist IRQ vom Kontroller fest an PORT[3] gebunden und kann nicht verlegt werden. Es ist jedoch möglich, bei einer Änderung an einem Digitalport einen Keyboard-Interrupt auslösen zu lassen. Das wird im Betriebssystem bereits bei FREQ, bzw. FREQ1 benutzt. In diesem Fall benötigst Du ein kleines Assemblerprogramm im Keyboard-Interrupt, mit dem das IRQ-Flag bei Auftreten des Interrupts gesetzt wird. Ich habe einmal auf die Schnelle das folgende Programm erstellt und auf der Open-Micro getestet. Hier wird jedes Mal, wenn an PORT[4] eine High-Low-Flanke detektiert wird, die BASIC-Interruptroutine gestartet. Also auch nicht viel anders als beim IRQ-Interrupt, der nur an PORT[3] nutzbar ist. Es ist allerdings zu beachten, daß PORT[4] nicht mehr als Ausgabepin zu benutzen ist. Außerdem beißt sich die Nutzung des Keyboard-Interrupts üblicherweise mit FREQ, genauer FREQ1. ' --------------------------------------------------------------------------- ' BASIC-Interruptroutine bei einem Keyboard-Interrupt aufrufen ' In OCBASIC fuer Open-Micro, Open-Mini und Open-Midi von Dietmar Harlos. ' --------------------------------------------------------------------------- INCLUDE "om.def" 'Definitionen für die Open-Micro und Open-Mini DEFINE a,b,c BYTE 'ein paar Variablen ' --- Unsere eigene Assembler-Interruptroutine ------------------------------ ' Die OM-Kontroller unterstuetzen das Einbinden einer Assemblerroutine in ' den Keyboard-Interrupt. DEFINE mIrqReq &b00000010 'Maske zum Starten der BASIC-IRQ-Routine PROCEDURE iiar_kyb INLASM ! cbeqa #iKYB,iiar_kyb_1 'Falls kein Aufruf durch KYB-Interrupt, ! jmp iiar_kyb_ende+2 'dann zur naechsten IIAR in der Kette. #iiar_kyb_1 ! lda -3,x 'Das Bit "IrqReq" im OSSTAT-Register setzen. ! ora #mIrqReq 'Bei der naechsten Gelegenheit startet die ! sta -3,x 'BASIC-IRQ-Routine. ! clc 'Ruecksprung ins Betriebssystem ! rts END PROCEDURE #iiar_kyb_ende 'hier hinter folgt die naechste IIAR '(sofern vorhanden) ' --- Das Hauptprogramm ----------------------------------------------------- #main INTERRUPT basirq 'BASIC-Interruptroutine vereinbaren UIRKyb=ON 'User-Assemblerroutine fuer KEYB aktivieren KBIER=&b1001000 'Keyboard-Interrupt fuer PORT[4] aktivieren WHILE TRUE PRINT "Ich warte auf den Interrupt." FOR a=1 TO 10 PAUSE 2 'Der PAUSE-Befehl verzoegert den Aufruf der NEXT a 'BASIC-Interruptroutine. Deshalb auf mehrere WEND 'kurze PAUSE-Befehle aufteilen. END ' --- Die BASIC-Interruptroutine -------------------------------------------- PROCEDURE basirq PRINT "Hier ist die BASIC-Interruptroutine." RETURN INTERRUPT END PROCEDURE Viele Grüße Dietmar Meine Homepage: http://ccintern.dharlos.de |
Antwort schreiben |