amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Interrupts benutzen [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

02.04.2007, 18:16 Uhr

MaikG
Posts: 5172
Nutzer
Wie genau benutzt man Interrupts? Ich weiss es gibt 4 Register(Lesen+Schreiben).
Ich denke man muss irgendwie in eines schreiben das man den gewünschten Int(Serial)
benötigt. Dann das gewünschte auslesen. Ich bekomme immer den selben
wert wenn ich den Interrupt einschalte und von DFF01E oder DFF01C lese.
Also wie macht man das richtig?

[ - Antworten - Zitieren - Direktlink - ]

02.04.2007, 18:52 Uhr

thomas
Posts: 7717
Nutzer

Du weißt aber schon, daß der Amiga ein Betriebssystem hat, das es gar nicht gerne hat, wenn man ihm ins Handwerk pfuscht ?

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

02.04.2007, 23:55 Uhr

DieterG
Posts: 164
Nutzer
@thomas:
Ich denke, er hat keine aandere Wahl, wenn es um sein Serielles project handelt, und savor gehe ich mal aus.

Es gibt verscheidnen interupt, was Du wahrscheinlich meinst ist aber ein sigenannter Hardinterupt,
davon gibt es auf dem amiga 15 Stück (eigentlich 8, wovon eines kaskadiert mit nochmals 8 ist, jedoch eine weiters vom ersten nicht nutzbar ist).
Einige interrupt sind nicht nicht benutzbar, oder einfach nicht beieinflussbar, ohne das AmigaOS lahnzulegen.
Kurz gesagt, 6 interupt kaskadiert auf 15 (von 0-14) verwendete Interupt.
Um auf die serielle Schnittstelle einfluss zu nehmen, müsstest du Interupt-bit (Interupt-Exception 1)
abschalten, denn die kommt jedesmal, wenn der serielle port leer ist.
Dann noch Interrupt-bit 11 (Interrupt Exception 5), die triit imemr auf, wenn der serielle port voll ist.
Asserdem wäen da Interrupt bit 3 (IE 2) für cia-a bzw. 13 (IE 6) für cia-b, die noch irgendwei beteiligt sind.

Doch aufpassen, interrupt-Bit 12 ist auch mit der IE 5 für dir diskettenlaufwerkssysnchroniation zuständig,
Die IE 1 ist aber noch scherer, denn da werden disk-übertragung und softwareinterupts zusätzlich drüber laufen.
Dann können interrupt 3 und 13 (die CIA's) auc von externer Hardware ausgelöst werden, da diese nach aussen dgeführt sind.

Also immer die Interruptexception merken, dann dein program als filter verwenden, welche Interrupts du verhindern willst (kannst du aus dem register auslesen), und alle die du nicht blocken willst, auf die alte adresse weiterspringen lassen.
Dann dein program als neue IE-Adresse eintragen. Hier ist allerdings timing gefragt, also nur schnelle kelein programme soltlen im interupt selber laufen, da in der zeit bis zum rte (nicht rts ! ) sonst nichts anderes mehr läuft, als nix mit multitasking).

Alles in allem nicht so kompliziert, wie es sich anhört, denn du willst ja nicht unbedingt die interupts verhindern, sondern die dahinterstehenden excetion, die dann dein programm, bzw. die schnittlstelle beeinflussen, und nicht das komplette interupthandling neu erfinden.

[ - Antworten - Zitieren - Direktlink - ]

03.04.2007, 10:28 Uhr

MaikG
Posts: 5172
Nutzer
>Du weißt aber schon, daß der Amiga ein Betriebssystem hat, das es
>gar nicht gerne hat, wenn man ihm ins Handwerk pfuscht ?

Hab keine wahl...

Ich kann die Seriellen Daten zwar mittlerweile lesen, aber die
kommen trotz Timing manchmal doppelt rein. <> kann ich nicht machen
weil z.B. 2 mal hintereinander die 0x01 reinkommt.


Um auf die serielle Schnittstelle einfluss zu nehmen, müsstest du Interupt-bit (Interupt-Exception 1)
abschalten, denn die kommt jedesmal, wenn der serielle port leer ist.
Dann noch Interrupt-bit 11 (Interrupt Exception 5), die triit imemr auf, wenn der serielle port voll ist.

Also 0000 1000 0000 0001 in DFF09A schreiben?

>Asserdem wäen da Interrupt bit 3 (IE 2) für cia-a bzw. 13 (IE 6) für cia-b, die noch irgendwei beteiligt sind.

Die CIA's muss ich nicht auslesen, RX/TX reicht aus.

>Also immer die Interruptexception merken, dann dein program als filter verwenden,
>welche Interrupts du verhindern willst (kannst du aus dem register auslesen),
>und alle die du nicht blocken willst, auf die alte adresse weiterspringen lassen.

Aber da gibts doch so ein Set/Clr ich setzte doch nur was ich brauche
lasse das andere stehen und deaktiviere am ende wieder das was ich
aktiviert habe oder nicht?

>Dann dein program als neue IE-Adresse eintragen. Hier ist allerdings timing gefragt, also nur schnelle kelein programme soltlen im interupt selber laufen, da in der zeit bis zum rte (nicht rts ! ) sonst nichts anderes mehr läuft, als nix mit multitasking).

Das Programm was RX/TX abfragt also mit Interrupts arbeitet muss im
Multitasking arbeiten. Ein anderes Programm schreibt während dessen
daten in den CIA zum steuern des Gerätes. Das Gerät antwortet willkürlich,
ich weiss den Zeitpunkt vorher nicht und kann daher nichts unterbrechen.

>Alles in allem nicht so kompliziert, wie es sich anhört, denn du willst ja nicht unbedingt die interupts verhindern,
>sondern die dahinterstehenden excetion, die dann dein programm, bzw. die schnittlstelle beeinflussen, und nicht das komplette
>interupthandling neu erfinden.

Das sieht z.B. ganz einfach aus, schreibt was ins register wie man
den Int prüft sehe ich daraus nicht:

http://www.fooman.fi/load.php?topic=programming&doc=prg-syncser

[ - Antworten - Zitieren - Direktlink - ]

03.04.2007, 11:05 Uhr

DieterG
Posts: 164
Nutzer
@MaikG:
Ich glaube du hast mich falsch verstanden, wenn du die interupts abschlatest indem du ins intena-Registe schreibst, dann werden durch die mehrfacnutzung der interrupts auch funktionen nicht mehr gehen, die du eventuell brauchst.

Also vieleicht fehlt etwas grundsätzliches, ich hole ma was tiefer aus.
Ein interrupt wird direkt am prozzesor ausgelöst, das heisst, sobald der interrupt gesetzt wrid, springt der prozessor den interrupt an, also nichts mehr mit Amiga-Betriebssystem oder sowas, ist eben hochpriorisiert.
Sobald ein Interrupt ausgelöst wird, spricng der Prozzessor auf eine festgelegte Adresse, davon gibt es 7, wovon alerdings nur 6 nutzbar sind.

Nochmals, 15 interupts, fast immer mehrfach genutzt springen auf 6 festgelegte Adressen, die sogennanten Interrupt Exception vectoren.
Diese Adressen wiederum sthen in weiteren Registern, nämlich in Dff064 bis Dff078 für die 6. Exception.

Nochmas der ablauf an einem Beispiel::
Ein interupt level 3 wird ausgelöst, somit in Dff01C zu lesen, aber dann wird die Adresse die in register $Dff068 angesprungen, weil der interupt level 3 der InteruptEXcepton 2 zugeordnet ist.
Das programm, das dort naturgemäss steht, mus nun das interupt register überprüfen, um zu wissen, welcher interrupt denn nun diese Exception ausgelöst hat, da eben mehrere in frage kommen,
damit hat er den auslösenden interupt, aber noch nicht, wie der interupt ausgelöst wurde, da wie gesagt auch so einige interupts mehrfach belegt sind, dazu müsste hier z.B. gepürft werden, ist im CIA-A was auslösendes passiert, oder nicht, dann muss es vom Extension.bus kommen, also muss gesucht werden, welches gerät das denn gewesen sein könnte.
Ok., das letzt brauchst du ja nicht, du musst nir wissen, der interupt wurde ausgelöst, war es einer, den ich ignorieren will ,a slo rte oder will ich ihn an die originalroutine zu weiteren bearbeitung weitergeben.

Das komplette Abschalten der interrupt level, könnte auf dienem oder irgendeinem Rechner natürlich auch funtkionieren, solanfge nichts anderes diesen interrupt benutzt.
Aber das wäre Schade so zu machen, denn dann läuft das Program vieleicht bei Dir supertoll aber auf den meisten anderen Rechnern gibt es nur abstürze.
Die meisten interrupts sind auch nicht mehr dokumetiert, währe man die vom original-nackte Amiga 500 oder 1000 noch nachlesen kann, sind die beim AGa-Chipsatz oder sonstwo nachgekommenen eventuellen interupts nicht zu finden, genausowenig, wei die, die von externen erweiterungen kommen, z.B. den Grafikkarten, die werden mit Sicherheit auch interrupts benutzen.


[ - Antworten - Zitieren - Direktlink - ]

03.04.2007, 16:24 Uhr

whose
Posts: 2156
Nutzer
@DieterG:

Und wieder einmal könnte ein Blick in die OS-Dokumentation helfen, Z.B. Abteilung "Interrupt Server". Diese Möglichkeiten sollte man nutzen, dann gibts auch weniger Probleme mit dem Rest des Systems.

Es ist nur die Frage, in wie weit man das via BASIC überhaupt nutzen kann...

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

03.04.2007, 18:28 Uhr

MaikG
Posts: 5172
Nutzer
>Ich glaube du hast mich falsch verstanden, wenn du die interupts abschlatest
>indem du ins intena-Registe schreibst, dann werden durch die mehrfacnutzung der
>interrupts auch funktionen nicht mehr gehen, die du eventuell brauchst.

ich will ja gar nichts abschalten, ich benötige die Information
das Daten am Serial-Port vorhanden sind, wenn ich diese gelesen
habe soll das wieder aus sein, damit ich die gleichen Daten nicht
nochmal lese.
Nur diese Daten liegen im Moment nicht bei den Interrupt registern,
ich habe die 2 Leseregister parallel zu den Seriellen Daten geloggt,
da kommt immer das selbe. Daher mache ich wohl was falsch.


>Und wieder einmal könnte ein Blick in die OS-Dokumentation helfen,
>Z.B. Abteilung "Interrupt Server". Diese Möglichkeiten sollte man
>nutzen, dann gibts auch weniger Probleme mit dem Rest des Systems.

Ich habe nur den NDK3.9 und da steht nichts über die DFF Int Register
drin. Im Assembler buch steht auch nichts und google bringt
auch keine sinnvolles, einfaches beispiel.

>Es ist nur die Frage, in wie weit man das via BASIC überhaupt nutzen kann...

100%, das ist nur Poken. Wenns ein halbwegs einfaches Beispiel ist reicht
mir irgendeine andere Programmiersprache. Du setzt Basic immer ziemlich runter,
das MaxonBasic und nicht Qbasic.

[ - Antworten - Zitieren - Direktlink - ]

04.04.2007, 09:18 Uhr

DieterG
Posts: 164
Nutzer
@MaikG:
Ic hatte verstanen, das dir interrupts dazwischenfunken, wenn du was an der seriellen schnittstelle tust.
Scheinbar geht es dir aber nur darum, das Du immer die selben daten ausliest ?

Das ist aber ganz einfach: Daten lesen, wenn RBF im Register INTREQR oder SERDATR gesetzt ist, weisst du, das die seriellen Daten anliegen, dann auslesen, und das Nit im Register INTREQ zurücksetzen.
Dadurch wird das Bit ebenfalls in SERDAT zurückgesetzt, und die nächsten Daten werden ins Register gelegt.

War das Dein problem ?

[ - Antworten - Zitieren - Direktlink - ]

04.04.2007, 09:54 Uhr

MaikG
Posts: 5172
Nutzer
>Ic hatte verstanen, das dir interrupts dazwischenfunken, wenn du was an der seriellen schnittstelle tust.

Nein, das serial.device funkte bei RTS/DTR dazwischen, jetzt
will ich das ja per Hand ohne device machen.

>Scheinbar geht es dir aber nur darum, das Du immer die selben daten
>ausliest ?

Ja, manche Chars sind mehrfach da.

>Das ist aber ganz einfach: Daten lesen, wenn RBF im Register INTREQR oder SERDATR gesetzt ist, weisst du, das die seriellen Daten anliegen, dann auslesen, und das Nit im Register INTREQ zurücksetzen.
>Dadurch wird das Bit ebenfalls in SERDAT zurückgesetzt, und die nächsten Daten werden ins Register gelegt.

>War das Dein problem ?

Ich glaube ja, das werde ich nachher gleich mal Probieren.
Danke!

[ - Antworten - Zitieren - Direktlink - ]

04.04.2007, 13:54 Uhr

MaikG
Posts: 5172
Nutzer
Klappt leider nicht muss ich vorher vielleicht noch den Interrupt aktivieren?


code:
OPEN "ram:serlog" FOR OUTPUT AS 1
1 Interrupt%=(PEEKW(&hDFF01E)<<4)>>15
IF Interrupt%=1 THEN
 PRINT #1,BIN$(PEEKW(&hDFF018))
 POKEW &hDFF09C, (PEEKW(&hDFF01E) AND NOT &b0000100000000000)
END IF
IF INKEY$<>"" THEN 2
GOTO 1
2 CLOSE #1


[ - Antworten - Zitieren - Direktlink - ]

05.04.2007, 10:16 Uhr

DieterG
Posts: 164
Nutzer
@MaikG:
Was klappt nicht ?
Du musst dich schon ein bischen genauer äussern.
Wird das RBF-Bit gesetzt ?
Wird es nachdem du es gelöscht has wieder gesetzt (natürlich nur wenn Daten ankommen) ?
Andersrum, wenn keine Daten kommen, bleibt es gelöscht ?

Ganz wichtig, da du ja nur zugriff auf die letzten empfangenen Daten hast, ist das Baudrate, paritiy und ähnliches richtig sind, sonst wird das dahinterliegende Schieberegister keine neuen Daten ins Ausgangsregister legen, weil es zum Beispiel noch auf das Parity-Bit wartet, und somit kene gültigen Daten hat. Genauso, wenn noch 2 Stopbits erwartet werden, oder ,oder oder...

Auch sehe ich in Deinem Beispiel nicht, wo Du TXD löschst, das wird indirekt durch Register UARTBRK (DFF09E) Bit 11 gesteuert.
Damit stopst du sozusagen die serielle Ausgabe, und erzwingst sowas wie einen reset der Schieberegister.

Aber was am schlimmsten ist, Du schreibst völlig falsch ins INTREQ-Register.
Das Register kann man nicht Bitweise überschreiben wie du das versuchst.
Richtig heissen müsste die 5.Zeile etwa so:
POKEW &hDff09c,&b0000100000000000
Da wird nichts gelesenes mit verknüpft, da Bit 15=0 bedeutet, lösche alle gesetzten Bits 0-14.
Bit 15=1 würde im Gegenteil bedueten, lösche alle gesetzten Bits 0-14, o.k. ?


[ - Antworten - Zitieren - Direktlink - ]

06.04.2007, 10:13 Uhr

MaikG
Posts: 5172
Nutzer
>Auch sehe ich in Deinem Beispiel nicht, wo Du TXD löschst, das wird indirekt durch Register UARTBRK (DFF09E) Bit 11 gesteuert.
>Damit stopst du sozusagen die serielle Ausgabe, und erzwingst sowas wie einen reset der Schieberegister.

Muss man das am Anfang machen damit der Seriell Puffer leer ist?

>Aber was am schlimmsten ist, Du schreibst völlig falsch ins INTREQ-Register.

Ah, dafür das set/clear. Ja bis auf die Daten manchmal anfang geht
es jetzt. Das schreiben funktioniert auch.

Danke nochmal.

Leider tuts das Programm trotzdem nicht, die Anfangsantwort kommt
jetzt zwar konstant(im gegensatz zur serial.device benutzung) aber
die befehle per RX/TX werden nicht beantwortet. Nur vom 74HC595 zurückgeschickt.
Irgendwas muss bei der Amiga Schnittstelle anders sein, vielleicht liefert die
weniger Spannung, die zieht das Gerät ja aus der (PC)Schnittstelle.

[ - Antworten - Zitieren - Direktlink - ]

08.04.2007, 20:16 Uhr

DieterG
Posts: 164
Nutzer
@MaikG:
Das die Schnittstelle beim Amiga irgendwie anders ist, ist schon klar. Allerdings weiß ich nicht genua was Dum einst.
Die Signalspannungen sind genormt, und beim PC und Amiga nicht verschieden.
Die Versorgungsspannung die an der Schnittstelle nach aussen geführt ist, ist allerdings keine Norm, und somit ein extra des amigas.
Diese weiderum ist je nach Amigamodell nicth nur verschieden in spannung, sondern auch in der Strombegrenzung.
Ich glaube beim A1200 ist der sogar auf 100mA beschränkt, während eim A500 im Extremfall sogar das ganze netzgerät runtergezogen werden konnte, weil kein Strombegrenzung drin war, jedenfalls bei den meisten Boards.

Das Du ein Antwrot von der internen elektronik nbekommst, ist dich zumindest scon mal das zeichen, das diese zu laufen scheint, als würde ich mal versorgungsspannung ausschliessen.
Eventuell der Stromverbrauch ? Versorg die Elektronik doch mal mit exterenn strom (allerdings nicht wieder in die Schnittstellen reinschicken).

Was soll denn das überhaupt für eine elektronik sein, und was tut sie nicht ?
Wenn Du mir mal ,mehr erzählst, eventuell sogar einen Schaltplan hast, dann kann c8ih Dir sicher helfen, das Ding irgendwie in gang zu bekommen.

[ - Antworten - Zitieren - Direktlink - ]

09.04.2007, 10:06 Uhr

MaikG
Posts: 5172
Nutzer
>Das die Schnittstelle beim Amiga irgendwie anders ist, ist schon klar. Allerdings weiß ich nicht genua was Dum einst.
>Die Signalspannungen sind genormt, und beim PC und Amiga nicht verschieden.

Am Serialport sinds 11 Volt wie beim PC, an der Hypercom sinds 8Volt.


>Die Versorgungsspannung die an der Schnittstelle nach aussen geführt ist, ist allerdings keine Norm, und somit ein extra des amigas.

Nein, die wird nicht benutzt, ist PC-Hardware die am Amiga soll.
RTS, CD und DTR haben je eine Diode und die laden ein Kondensator,
dann kommt ein 5V Regler.
TX hat auch einen 100µ Kondensator aber ohne der Stromversorgung
zu dienen.

>Das Du ein Antwrot von der internen elektronik nbekommst, ist dich zumindest scon mal das zeichen, das diese zu laufen scheint, als würde ich mal versorgungsspannung ausschliessen.
>Eventuell der Stromverbrauch ? Versorg die Elektronik doch mal mit exterenn strom (allerdings nicht wieder in die Schnittstellen reinschicken).

Hab ich schon Probiert, ich hab mit WinUAE herrausgefunden das
SETDTR(Win) wohl DTR 0(Amiga) und SETRTS wohl RTS 0 bedeutet,
vorrausgesetzt das ist kein UAE fehler. Ich hatte damit auf UAE
diesmal etwas bekommen, nicht korrekt aber mehr als sonst. Auf
dem Amiga macht das Prog nichts ausser die Spiegelung des Befehls.

>Wenn Du mir mal ,mehr erzählst, eventuell sogar einen Schaltplan hast, dann kann c8ih Dir sicher helfen, das Ding irgendwie in gang zu bekommen.

Ich hab einen Schaltplan gemacht und letztens sogar einen im Internet
gefunden, gibst du mir deine Email-Adresse dann kann ich sie dir
Mailen.

[ - Antworten - Zitieren - Direktlink - ]

09.04.2007, 17:07 Uhr

DieterG
Posts: 164
Nutzer
@MaikG:
Genormte Spanung an allen signalen sind maximal 12V, wobei noch 6 Volt erkannt werden sollten.
Das heisst, die Ausgangspegel sollten knapp unter 12 Volt liegen, um die genorme maximal erlaubte Kabellänge von 12 Metern mit "normalen Seriellen Kabeln" erreichen zu können (es gibt auch spezialkabel bis zu 99 Metern). Dann sollten die Pegel nicht unter 6 Volt liegen.
Würde die hypercom also nur 8 Volt pegel haben, müssten sie darauf hinweisen, das die Kabellänge entsprechend kürzer sein muss.
O.K. aber das nur zur theorie, neben der Spannung ist di Signalverfälschung da meistens sowieso entscheidender.

Also nehmen wir mal an, Du hast auf jeden Fall noch über 6,2 Volt Signalpegel, dann müsste der 5 Volt-Regler noch funktionieren.
Du hattest noch was von Dioden erzählt, wahrscheinlich sind da Germaniumdioden drin, um den Pegel nicht noch viel mehr abzusenken, stimmts ?
Aber auch diese klauen nochmals 0.4 volt mindestens, also dann bräuchte wir mindestens 6,6 besser 6,7 Volt, geht ma weiter davon as, das etwa 50% der signale high und 50% low sind, würde das schon nicht mehr rennen.
Genaueres, wenn ich den schaltplan mal gesehen habe.
Ich denke, irgendwas mit den Signaldauern spielt da die Hauptrolle, da alle Bits low-activ sind, also bei logisch Null die Spannung anliegt, sollte dessen Dauer mal genauer betrachtet werden.

Was heisst spiegelung des Befehls ? Ist da ein modembaustein drin, der mittels "Echo ein" alles wiederholt, oder woher kommt die Wiederholung ?
Ich sehe schon, ohne zu wissen, von was wir hier rede, komme wir nicht weiter, sende de mir einfach mal zu, und wir können uns gezielter unterhalten.
Sende den einfach mal an mcp@a1k.org oder mcp@dgroppe.de


[ - Antworten - Zitieren - Direktlink - ]

09.04.2007, 18:54 Uhr

MaikG
Posts: 5172
Nutzer
>Du hattest noch was von Dioden erzählt, wahrscheinlich sind da Germaniumdioden drin, um den Pegel nicht noch viel mehr abzusenken, stimmts ?

Ich glaub nicht das es Germanium noch als SMD gibt...
Also mit der Inventrierung sind es über 7 Volt, beim PC sinkt es
beim Datentransfer kurzzeitig auf 4,5V ab, beim Amiga bleibts
relativ konstant(Anzeichen dafür das was falsch läuf).

>Ich denke, irgendwas mit den Signaldauern spielt da die Hauptrolle, da alle Bits low-activ sind,
>also bei logisch Null die Spannung anliegt, sollte dessen Dauer mal genauer betrachtet werden.

Zwar hab ich schon 1000 verschiedene Timings probiert, aber darauf
würde ich auch irgendwie tippen.

>Was heisst spiegelung des Befehls ?

Der 595 ist ein Shiftregister, der Ausgang ist manchmal mit RX
verbunden und so wird der Befehl gespiegelt.

>Ich sehe schon, ohne zu wissen, von was wir hier rede, komme wir nicht weiter, sende de mir einfach mal zu, und wir können uns gezielter unterhalten.

Hab ich rüber gemailt...

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Interrupts benutzen [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.