Robotrontechnik-Forum

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

Robotrontechnik-Forum » Technische Diskussionen » UB 8820 kein Interrupt??? » Themenansicht

Autor Thread - Seiten: -1-
000
17.07.2022, 17:10 Uhr
Haupti65

Avatar von Haupti65

Moin Zusammen,
ich versuche gerade meinen UB8820 zu verstehen.
Alles was ich an Literatur habe ist auch schon 3-4 mal durchgesehen.
Folgendes Listing ist Mein Problem:

.org 0000h
dw dummy
dw dummy
dw dummy
dw sioin
dw siout
dw dummy

.org 000ch
init: di
ld spl,#80h ;Stackpointer
ld imr,#18h ;Interrupt Maskierung
ld ipr,#2fh ;Interrupt Priorität
ld p01m,#04h ;Stack Intern,Timing Normal
ld p3m,#40h ;Betriebsart UART
ld t0,#06h ;Baudrate 9600
ld pre0,#05h
ld tmr,#03h ;Timer Betriebsart
ei

start: ld r6,#01h
ld r7,#00h
out: ldc r4,@rr6
cp r4,#00h
jr z,ende
ld sio,r4
s1: tm irq,#10h
jr z,s1
and irq,#00h
incw rr6
jr out
ende: jr start

sioin: iret
siout: iret
dummy: iret

.org 0100h
db" Z8-Monitor "
db 00h

.end
Das Programm soll ununterbrochen " Z8-Monitor " auf Teraterm ausgeben.
Textadresse steht in Doppelregister R6-R7.
So funktioniert es nicht...
Aber, wenn ich in der Init-Routine den Siout-Interrupt mit ld imr,#08h ausschalte, dann geht es.
Als wenn mein EMR kein Interrupt kann.
Oder wo ist der Fehler???
Freue mich über jede Idee!!!
Gruss Olaf.

P.S. Der TM bzw. TCM- Befehl wird in der DDR Literatur unterschiedlich beschrieben. Einmal prüft TM die Bits auf "0" und im nächsten Buch auf "1"!
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
18.07.2022, 20:42 Uhr
HolgerT



Hallo,
ich habe bisher noch nichts mit dem UB8820 o.ä. gemacht. Allerdings ist nicht klar, was Du mit den Interrupts bewirken willst. Die Routinen sind leer (nur mit IRET abgeschlossen) und Deine ganze Datenverarbeitung findet in der Hauptschleife statt.

Normalerweise verwendet man Interrupts mit einem (in diesem Fall) RAM-Sende-Puffer. Diesen füllt man in der Hauptschleife, stößt das Senden des ersten Bytes in der URAT an und widmet sich dann anderen Aufgaben. Ist das Byte aus der UART hinausgeschoben, wird ein Sende-Interrupt*) ausgelöst. In SIOUT prüft man dann, ob im
RAM-Sende-Puffer noch Zeichen sind. Wenn dies der Fall ist, gibt man das nächste Byte aus diesem an die UART, beendet die Interrupt-Routine, widmet sich also wieder anderen Aufgaben, bis der nächste Sende-Interrupt ausgelöst wird .. usw.

*) lt. Kieser/Bankel "Einchipmikrorechner" 2. Aufl. 1989 (vor mir liegend) S.29 ist genau dies der Fall: "Nach dem Leerwerden des Sendeschieberegisters wird bei entsprechender Freigabe über IRQ4 eine Interruptanforderung ausgelöst, um anzuzeigen, daß neue Daten eingeschrieben werden dürfen."

Ebenfalls aus dem Kieser/Bankel:
TCM Test Complement Under Mask - Symbolische Operation: NOT dst AND src
TM Test Under Mask - Symbolische Operation: dst AND src
Damit prüft nach meinem Verständnis TCM auf 1 und TM auf 0. Dieser Test ist aber ebenfalls im Interruptbetrieb überhaupt nicht nötig.

Zu Deiner Verwunderung, warum es mit eingeschaltetem SIOUT-Interrupt nicht funktioniert: IRQ4 wird bei Aufruf der Interruptroutine zurückgesetzt**) und steht dann für die Auswertung mittels TM-Befehl auf 0. Dein Programm läuft sich also in der Scheife S1 tot.

**) Kieser/Bankel S. 99: "Innerhalb dieses [Interruptquittierungs-] Zyklus werden folgende Aktivitäten ausgeführt: .. im IRQ-Reister R250 wird das zur Interruptanforderung korrespondierende Bit rückgesetzt .."

-Holger

P.S. die Darstellung des Programms ist sehr schlecht! Bitte [ code ] .. [ /code ] benutzen und sinnvoll einrücken. siehe auch https://www.robotrontechnik.de/html/forum/thwb/help.php?page=format

Dieser Beitrag wurde am 18.07.2022 um 21:00 Uhr von HolgerT editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
18.07.2022, 22:43 Uhr
Haupti65

Avatar von Haupti65

Moin Holger,
danke für Deine Antwort.
Kieser/Bankel habe ich auch, finde aber dass die Interruptverarbeitung nicht so eindeutig beschrieben ist. Oder ich bin zu Blöd zum lesen...
Es wird auch jedesmal gleich die Möglichkeit des Pollings erwähnt.
Ich schaue mir das ganze nochmal genauer an.
Mit TM und TCM hast Du natürlich recht, so habe ich das auch verstanden.
In "Programmierung von Einchiprechnern" Reihe Automatisierungstechnik Band 215 steht auf Seite 59 folgendes:
TCM...Dieser Befehl testet ausgewählte Datenbits auf "Null"
TM... Dieser Befehl testet ausgewählte Datenbits auf "Eins"...
Also genau umgekehrt wie in Kieser/Bankel...
Gruss Olaf
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
19.07.2022, 07:39 Uhr
Bert



Mir fehlt noch die globale Interruptfreigabe. Dafür muß Bit 7 im IMR gesetzt werden:

Quellcode:

OR IMR, #080h



Außerdem sollte natürlich in der Interruptroutine noch sinnvoller Code ausgeführt werden.
Um nicht alle Register auf den Stack packen zu müssen, kann man die Registerbank umschalten:

Quellcode:

PUSH RP
SRP #%40
!...!
POP RP
IRET



Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
19.07.2022, 07:47 Uhr
HolgerT



Ergänzung zu:

Zitat:
Ebenfalls aus dem Kieser/Bankel:
TCM Test Complement Under Mask - Symbolische Operation: NOT dst AND src
TM Test Under Mask - Symbolische Operation: dst AND src
Damit prüft nach meinem Verständnis TCM auf 1 und TM auf 0.

Dieses Ergebnis (1 oder 0) wird in das Z-Flag geschrieben. Beachte, dass die Auswertung mittels Sprungbefehl (JR Z,x) dieses Flag negiert betrachtet (Kieser/Bankel, S. 74):
Flag Z (JZ); Z=1 -> Bedeutung Null
Flag NZ (JNZ); Z=0 -> Bedeutung nicht Null

Vielleicht kommt daher die Verwirrung.


Zitat:
Kieser/Bankel habe ich auch, finde aber dass die Interruptverarbeitung nicht so eindeutig beschrieben ist. ... Es wird auch jedesmal gleich die Möglichkeit des Pollings erwähnt.


Möglicherweise ist es für einen Anfänger nicht leicht verständlich. Wichtig ist: Für eine bestimmte Aktion (hier Ausgabe von Zeichen über UART) muß man sich für eine der Varianten Polling oder Interrupt entscheiden. Du hast beides im Programm und das funktioniert eben nicht.

Gruß
Holger

P.S. Ahh. Habe jetzt die Stelle im Kieser/Bankel gefunden (S. 29): "Der Programmierer kann hierzu über IRQ4 einen Interruptbetrieb oder eine Polling-Statusabfrage anwenden"

Dieser Beitrag wurde am 19.07.2022 um 07:57 Uhr von HolgerT editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
19.07.2022, 08:58 Uhr
Bert



Ah, ich sehe gerade, das man die globale Interruptfreigabe mit EI und DI steuert...

An manchen Stellen ist die Originaldokumentation vielleicht auch etwas eindeutiger formuliert als die Übersetzung:
http://cini.classiccmp.org/pdf/MicroMint/Z8_Microcomputer_Technical_Manual_1983.pdf

Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
19.07.2022, 09:50 Uhr
P.S.



@Haupti65 <0002>
Bei mir gibt's ein eBook "Einchipmikrorechner made in GDR - ein Tutorial" -> http://www.ps-blnkd.de/EMR_Inh.pdf
Vielleicht hilft's ja zu mehr Verständnis. Jedenfalls war mir das dabei
-> http://www.ps-blnkd.de/Z8-EKR.htm sehr hilfreich.

Im Übrigen gibt es auch die ausführliche "Technische Beschreibung - Einchip-Mikrorechner-Schaltkreise U881/U882" vom VEB Mikroelektronik "Karl Marx" Erfurt (A4 - 60S).

Das Wissen der Menschheit gehört allen Menschen! -
Wissen ist Macht, wer nur glaubt, der weiß nichts! -
Aber - Unwissenheit schützt vor Strafe nicht! -
Gegen die Ausgrenzung von Unwissenden und für ein liberalisiertes Urheberrecht!
PS
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
19.07.2022, 18:53 Uhr
Bert




Zitat:
P.S. schrieb
Bei mir gibt's ein eBook "Einchipmikrorechner made in GDR - ein Tutorial" -> http://www.ps-blnkd.de/EMR_Inh.pdf


Nein Peter, da gibt es nur das Inhaltsverzeichnis.
Prinzipiell hätte ich Interesse an dem Dokument.

Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
19.07.2022, 18:59 Uhr
PC-Opa




Zitat:
Bert schrieb

Zitat:
P.S. schrieb
Bei mir gibt's ein eBook "Einchipmikrorechner made in GDR - ein Tutorial" -> http://www.ps-blnkd.de/EMR_Inh.pdf


Nein Peter, da gibt es nur das Inhaltsverzeichnis.
Prinzipiell hätte ich Interesse an dem Dokument.

Grüße,
Bert



....hatten wir schon mal.
Für Kohle geht geht alles.....

Ich denke aber, daß bei Volker auf der HP alles über den UB88xx als Download verfügbar ist. Ich wüßte jetzt nicht, was P.S. da neues zu bieten hat.
--
Gruß Wolfgang
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
19.07.2022, 21:08 Uhr
Haupti65

Avatar von Haupti65

Moin Zusammen,
erstmal vielen Dank für Eure Unterstützung.
Habe es jetzt soweit hinbekommen(Danke auch an schnulli!!).
Ohne die S1-Routine läuft es aber nicht.....

.org 0000h
dw dummy
dw dummy
dw dummy
dw sioin
dw siout
dw dummy

.org 000ch
init: di
ld spl,#80h ;Stackpointer
ld imr,#18h ;Interrupt Maskierung
ld ipr,#2fh ;Interrupt Priorität
ld p01m,#04h ;Stack Intern,Timing Normal
ld p3m,#40h ;Betriebsart UART
ld t0,#06h ;Baudrate 9600
ld pre0,#05h
ld tmr,#03h ;Timer Betriebsart
ei

start: ld r6,#01h
ld r7,#00h
out: ldc r4,@rr6
cp r4,#00h
jr z,ende
ld sio,r4
--------------------------------
s1: tm irq,#10h
jr z,s1
ld irq,#00h
--------------------------------
incw rr6
jr out
ende: jr start

sioin: iret

siout: ld imr,#00h
iret

dummy: iret

.org 0100h
db" Z8-Monitor "
db 00h

.end

Würde gerne auch wissen warum das so ist!
Auch warum man die Interrupt Flags löschen muss, kann ich mir nicht erklären.
Ich habe vor ca. 40 Jahren mal gelernt, dass ein Interrupt das laufende Programm unterbricht, eine ISR abarbeitet und dann alles wieder so herstellt
wie es vor dem Interrupt war. Dann gehts weiter im Programm.
Auch weiss ich seitdem was Polling ist.
Warum in den Büchern über den EMR der Interruptmodus nur kurz erwähnt wird und dann gleich zum Polling übergegangen wird finde ich merkwürdig.
Auch habe ich kein Programm gefunden, wo Sioin und Siout mit Intterupt verwendet werden.
Gruss Olaf!
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
20.07.2022, 08:10 Uhr
P.S.



@Bert <007>, PC-Opa <008>
Es hindert Euch niemand daran mir eine eMail zu schreiben ...
Das gilt natürlich auch für "Haupti65".

Vielleicht ist ja auch mal ein Blick in http://www.ps-blnkd.de/KC%2085/KC85-eigeneQuellen/EKR1/DokuEKR(FWE).pdf mit dem zugehörenden Listing http://www.ps-blnkd.de/KC%2085/KC85-eigeneQuellen/EKR1/EKR1_IfAM-Listing1.txt hilfreich ...

Das Wissen der Menschheit gehört allen Menschen! -
Wissen ist Macht, wer nur glaubt, der weiß nichts! -
Aber - Unwissenheit schützt vor Strafe nicht! -
Gegen die Ausgrenzung von Unwissenden und für ein liberalisiertes Urheberrecht!
PS
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
27.07.2022, 18:48 Uhr
Haupti65

Avatar von Haupti65

Moin Zusammen,
nach vielen Versuchen habe ich jetzt ein kleines Programm geschrieben,dass eine Eingabe und gleichzeitige Ausgabe über die serielle Schnittstelle erlaubt:

Quellcode:
        
                            .org 0000h
                dw dummy
                dw dummy
                dw dummy
                dw sioin
                dw siout
                dw dummy

                .org 000ch
    init:                di
                ld spl,#80h        ;Stackpointer
                ld imr,#00h        ;Interrupt Maskierung
                ld ipr,#2fh                ;Interrupt Priorität
                ld p01m,#04h            ;Stack Intern,Timing Normal
                ld p3m,#40h        ;Betriebsart UART
                ld t0,#06h        ;Baudrate 9600
                ld pre0,#05h    
                ld tmr,#03h        ;Timer Betriebsart
                ei
    
    start:        call ci
                call co
                jr start

    ci:            tcm irq,#08h
                jr nz,ci
                call sioin
                ret
    
    co:            ld sio,r4
    co1:                tcm irq,#10h
                jr nz,co1
                ld irq,#80h
                ret
    
    sioin:        ld r4,sio
                ld irq,#80h
                ret

    siout:        iret

    dummy:        iret
                
                .end



Ich hoffe es ist so besser zu Lesen...
Das man jedesmal das Interruptflag löschen muß, auch wenn ich Polling benutze ist mir ehrlich gesagt neu.
Finds immer noch komisch...
Vielleicht kann mir mal bitte jemand schreiben, wie ich das Programm hinsichtlich Interrupt Steuerung ändern muss.
Habe bis jetzt viel gelesen, kriegs aber nicht hin.
Die Ausgabe wird scheinbar auch immer ohne Interrupt gemacht...
Siehe Listing von P.S.!!!
Danke!
Gruss Olaf
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
28.07.2022, 17:26 Uhr
Haupti65

Avatar von Haupti65

Moin Zusammen,
habe jetzt mal 2 Versionen getestet.
Einmal mit Polling, die funktioniert:

Quellcode:

                .org 000ch
    init:        di
                ld spl,#80h        ;Stackpointer
                ld imr,#00h        ;Interrupt Maskierung
                ld ipr,#2fh        ;Interrupt Priorität
                ld p01m,#04h    ;Stack Intern,Timing Normal
                ld p3m,#40h        ;Betriebsart UART
                ld t0,#06h        ;Baudrate 9600
                ld pre0,#05h    
                ld tmr,#03h        ;Timer Betriebsart
                ei
                            
    start:        tm irq,#08h        ;Taste gedrückt?
                jr z,start        ;Nein!
                call sioin
                call co
                jr start

    co:            ld sio,r4
                ld irq,#00h
                ret
    
    sioin:        ld r4,sio
                ld irq,#00h
                ;iret
                ret

    siout:        iret
    dummy:        iret
                
                .end



Und eine weitere mit Sioin Interrupt, bei der nicht immer alle Zeichen ausgegeben werden:


Quellcode:

                .org 000ch
    init:        di
                ld spl,#80h        ;Stackpointer
                ld imr,#08h        ;Interrupt Maskierung
                ld ipr,#2fh        ;Interrupt Priorität
                ld p01m,#04h    ;Stack Intern,Timing Normal
                ld p3m,#40h        ;Betriebsart UART
                ld t0,#06h        ;Baudrate 9600
                ld pre0,#05h    
                ld tmr,#03h        ;Timer Betriebsart
                ei
                            
    start:        tm irq,#08h        ;Taste gedrückt?
                jr z,start        ;Nein!
                call co
                jr start

    co:            ld sio,r4
                ld irq,#00h
                ret
    
    sioin:        ld r4,sio
                ld irq,#00h
                iret
                
    siout:        iret
    dummy:        iret
                
                .end



Warum geht die mit Interrupt nicht so wie die erste?
Danke schonmal für Eure Antworten!
Gruss Olaf
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
15.08.2022, 08:42 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

schau mal Zilogs AN0077 an (SERIAL COMMUNICATIONS USING
THE Z8® CCP™ SOFTWARE UART). Vielleicht findest Du dort weitere Anregungen?

https://www.zilog.com/appnotes_download.php?FromPage=DocTree&dn=AN0077&ft=Application%20Note

Ebenfalls wichtig ist "A Programmer's Guide to the Z8 TM Microcomputer"

z.B. von hier https://ia800401.us.archive.org/12/items/bitsavers_zilogz8Z8FAug89_38800136/Z8_Family_Design_Handbook_Aug89.pdf
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)

Dieser Beitrag wurde am 15.08.2022 um 08:53 Uhr von volkerp editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
014
05.05.2024, 15:49 Uhr
jute-tom



Alter Thread, aber trotzdem ein Hinweis von mir: ich hatte versucht, mit ~9600 Baud mit dem PC zu kommunizieren (PRE0=1, T0=6 oder 7). Das funktionierte nicht zuverlässig, das oberste Bit war meist kaputt. Mit 4800 Baud (PRE0=1, T0=13) funktionierte es deutlich zuverlässiger.
--
Viele Grüße,
Thomas
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