Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Z1013 Schrittbetrieb » Themenansicht

Autor Thread - Seiten: -1-
000
01.12.2011, 07:35 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

ich habe eine Frage zum N-Kommando (Schrittbetrieb) des Z1013

An der System-PIO geht Port B Bit 5 an den Adressbus AB Bit 0 (Eingabe).
Die PIO wird beim N-Kommando so programmiert, dass bei B5 H -> L ein Interrupt generiert wird.
Vor den aktuellen Befehl wird EI gepoked und gestartet. Sobald nun EI und nachfolgender Befehl ausgeführt wird, und AB0 => 0 generiert PIO B5 einen Interrupt und der Interrupt-Code wird ausgeführt (Registeranzeige etc.)

Aber wann [b]genau[b] erfolgt die Aktivierung an Pio B5?
In vermute: entweder steht der Befehl selbst auf gerader Adr. oder beim Wechsel zur nächsten Adr. geht AB0 auf 0. Aber ist das wirklich so und reicht das aus?

nb: Beim Z9001 wird die CTC genutzt. Hier wird 1 Takt gezählt und dann der Interrupt ausgelöst. Dies erfolgt also stets innerhalb des aktuellen Befehls.


Quellcode:
PIOBC    equ    03h        Bit5->AB0 in
      
;NEXT-Kommando, Step-Betrieb
;
;Initialisierungstabelle fuer PIO bei NEXT
;PIO B5 => AB0 in
;
NKTA:    DB    Lo(NINTA)        ;Interruptvektor Low Byte
    DB    10010111b        ;Interruptsteuerwort, EI, Low-aktiv, Mask folgt
    DB    11011111b        ;Interruptmaske Bit5 aktiv
;
;NEXT-Kommando
;
N_KDO:    LD    A,Hi(NINTA)
    LD    I,A            ;Interruptvektor
    DI
    LD    HL,NKTA         ;Initialisieren PIO Port B
    LD    BC,0303H        ;3 Bytes, Port PIOBC
    OTIR                ;loest selbstaendig INT aus
    LD    HL,(BPADR)        ;Byte vor Breakadr.(!)
    DEC    HL            ;wird EI
    LD    A,(HL)
    LD    (NBYTE),A        ;Byte retten
    LD    (HL),0FBH        ;Code EI einschreiben
    LD    (SPADR),SP
    LD    SP,(REGSP)
    PUSH    HL            ;Adr. mit EI-Befehl
    JP    REGH            ;Register sichern und Start
;
;Eingang bei Interrupt
....


--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
01.12.2011, 08:12 Uhr
jmueller




Zitat:
Aber wann [b]genau[b] erfolgt die Aktivierung an Pio B5?

Noch innerhalb des OTIR-Befehls auf Adresse F732 (Monitor 2.02),
und zwar ganz genau mit der ersten passenden Flanke bei Lesen
des OP-Codes des OTIR-Befehls zur der Ausgabe des 3. Bytes,
weil mit dem zweiten Byte der Interrupt-Status der PIO freigeben wird
und die Betriebsart, die eigentlich erst mit dem 3. Byte gesetzt wird,
schon vorher richtig gesetzt war.

Jens

Update:
Kleines Versehen von mir: Das dritte Byte ist nicht die Betriebsart,
sondern, wie Du in dem Code schon geschrieben hast, die Interrupt-Bit-Maske.
Das ändert aber am Kern der Antwort nichts,
denn die Bit-Maske wird schon bei der Anfangsinitialisierung so gesetzt,
weshalb die Interrupt-Bedingung damit weiterhin beim Lesen des OP-Codes
für das dritte Byte erfüllt ist.

Dieser Beitrag wurde am 01.12.2011 um 08:37 Uhr von jmueller editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
01.12.2011, 19:42 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

hast Du das ausprobiert?

Eigentlich steht ja ein DI vor der PIO-Init; damit dürfte kein Interrupt ausgelöst werden. Der käme auch viel zu früh.
Der Kommentar hinter OTIR ist noch original C.Fischer; aber genau den zweifel' ich an!
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
01.12.2011, 20:52 Uhr
jmueller



Volker, Du darfst Interrupt-Anmeldung und Interrupt-Annahme nicht durcheinanderbringen.
Die PIO weiß doch gar nicht, ob in der CPU der Interrupt gesperrt ist oder nicht.
Sobald in der PIO der Interrupt freigegeben und die Interrupt-Bedingung erfüllt ist
(und die Daisy Chain geschlossen ist), meldet die PIO einen Interrupt an,
indem sie die INT-Leitung auf L zieht und die Daisy Chain öffnet.
Und das passiert im konkreten Beispiel spätestend hinter dem OTIR.
Die CPU nimmt den Interrupt dagegen erst einen Befehl hinter dem EI an
und quittiert es gegenüber der PIO,
damit diese den Interrrupt-Vektor auf den Datenbus legt.
Das Ende der Interrupt-Routine (RETI-Befehl) erkennt die PIO selbst
(lauscht am Datenbus) und schließt die Daisy Chain wieder.

Das mit der Interrupt-Anmeldung am Ende vom OTIR kannst Du auch
im JKCEMU-Debugger sehen, indem Du auf den OTIR-Befehl einen Breakpoint legst
und dann mit "In Aufruf springen" die drei Zyklen einzeln durchdebuggst.
Nach jedem Zyklus klickst Du auf den Reiter "Interrupt-Quellen" und da dann
auf die PIO, damit die PIO-Innereien angezeigt werden.
Da siehst Du dann, dass nach dem zweiten Zyklus,
mit dem die PIO die Interrupt-Freigabe erhalten hat,
der Interrupt-Status direkt von gesperrt auf angemeldet geht.

An der Stelle gibt es eine kleine Diskrepanz zwischen Emulator und Realität,
die aber nur in der Z1013-Emulation und nur an dieser einen Stelle sichtbar wird
(und damit belanglos ist).
Das Hochzählen des PC-Registers erfolgt ja noch während des alten Befehls,
das Anlegen der Adresse auf den Adressbus aber erst im M1-Zyklus
des neuen Befehls. In JKCEMU erfolgt das in einem Schritt, weshalb die PIO
die Statusänderung noch im zweiten OTIR-Zyklus sieht und deshalb am Ende
dieses Zyklus' schon die Interrupt-Anmeldung vorliegt.
In der Realität sieht die PIO die Änderung am Adressbus aber erst im M1-Zyklus
beim dritten OTIR-Durchlauf.


Zitat:
hast Du das ausprobiert?

Nö, aber damit der Emulator richtig funktioniert,
muss man das Interrupt-Handling schon genau kennen.

Jens
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
02.12.2011, 19:18 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

oh, vielen Dank.
An den wichtigen Unterschied zwischen Interrupt-Anmeldung, -Annahme und -Freigabe habe ich ich nicht gedacht.
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
03.12.2011, 11:09 Uhr
jmueller



Ich gebe zu, so richtig detailliert ist das Interrupt-Handling wohl nirgends beschrieben.
Und obwohl ich glaube, das Zusammenspiel der einzelnen Komponenten im Detail
verstanden zu haben, werde ich gelegentlich auch immer mal wieder mit neuen Facetten
des Interrupt-Handlings überrascht. So eine "Überraschung" war z.B. auch der Grund
für die JKCEMU-Version 0.8.2.

Jens
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
03.12.2011, 12:24 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

ich habe mir den Kieser/Meder vorgenommen und finde dort eigentlich sehr viel zum Interrupt-Handling: mehr als 20 Seiten, incl. PAPs und Zeitdiagrammen zu den verschiedensten Aspekten. Auch meine Frage wird beantwortet. Man müsste das eben nur alles im Kopf haben...
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek