I2C Busmaster

  • Hallo,

    was mir noch fehlt, ist ein I2C Busmaster...

    Hier mal ein erster Entwurf für eine Karte mit dem PCF8584: MFA_I2C_0_1.pdf


    • Muss ich da noch einen 74LS245 zwischen PFC und Datenbus hängen?
    • Was ich mit dem /IACK mache, weiß ich noch nicht.
    • Eventuell fasse ich den INT und INTI2C noch zusammen. (Das mit dem Interrupt / Vektor muss ich noch mal nachschlagen)
    • Sonstige Vorschläge?

    ... und ja, ist mein erstes KiCad-Projekt ;o)

  • Hi,

    cool. Eine solche Karte steht auch noch auf meiner ToDo-Liste. Aber wenn Du eine Karte dafür baust, wäre ich direkt dabei. Den Chip hatte mir schon vor längerem bei Reichelt bestellt, aber noch keine Zeit dafür gefunden, das Projekt anzugehen ...


    Ich denke auf den 245 kannst Du verzichten, denn die wenigsten Karten im MFA haben einen solchen Bustreiber.


    Da die Karte aber vermutlich nur zu einem Bruchteil belegt ist, wie wäre es wenn man Platz und Steckplätze dafür vorsieht um andere I2C-Module mit "aufstecken" kann?


    Was mir beim MFA auch immer fehlt(e): sind ein Uhrenbaustein und ein nichtflüchtiger Speicher (EEPROM). Diesen könnte man hier direkt mit entsprechenden I2C-Bausteinen auf der Platine integrieren. Auch eine Schnittstelle für eine SD-Karte wäre vielleicht sinnvoll.


    Was hälst Du davon?


    Gruß

    Thilo

    Das Wissen ist das einzige Gut, das sich vermehrt, wenn man es teilt. (Marie von Ebner-Eschenbach)

  • da müssen funkenzupfer u. ä. ran ...

    Immer die kleinen dicken. ;)




    Sonstige Vorschläge?

    Zum Adressdekoder habe ich mich schon mal geaeussert. Auch zur Verwendung von IOR und IOW am LS85.

    WICHTIG! Schau dir im Datasheet das Interface Mode Control an.


    Wo kommt der INTI2C denn her? Ich seh nur einen Pullup.


    LS245 ist empfehlenswert. Der PCF8584 kann aehnlich wenig treiben wie der 8251.



    BTW, was willst du denn mit dem I2C Busmaster machen?

    Man kann I2C auch mit einfacheren Bausteinen und Software aufbauen. Sinngemaess 1. Bild aus RE: Midicom Floppy Anschluss

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Wo kommt der INTI2C denn her? Ich seh nur einen Pullup.

    Kommt von extern, einige I2C-Bausteine erzeugen den bei Statusänderung.

    Zum Adressdekoder habe ich mich schon mal geaeussert.

    Da gings Dir um den verschwendeten Adressraum? Oder habe ich im Kleingedruckten noch was übersehen?

    Da die Karte aber vermutlich nur zu einem Bruchteil belegt ist, wie wäre es wenn man Platz und Steckplätze dafür vorsieht um andere I2C-Module mit "aufstecken" kann?

    Ja, da ist noch massig Platz für Steckplätze vorhanden. Was stellst du Dir den so als Modulbauform so vor? Pinheads? Card-Edge-Slots (nu wirds RETRO!)? Soweit bin ich aber noch nicht...

    BTW, was willst du denn mit dem I2C Busmaster machen?

    Man kann I2C auch mit einfacheren Bausteinen und Software aufbauen

    Bitbanging geht auch, da ist aber so wenig Platine zum Üben dabei...


    Und zum Thema 245 ... frag keine Foren - LOL-

  • U.a. Und die Verwendung von IOR und IOW am 'LS85.

    Ich glaube es dämmert. Langsam.

    Bei dieser Schaltung kommt /CS Verzögert nach /IOR /IOW.

    Eigentlich sollte erst der /CS da sein und danach erst /IOR /IOW (20ns). In diesem Fall muss das sogar sein, sonst springt der PCF in den falschen Modus.

    Richtig wäre wohl IO/M von der CPU in den 85er und daraus das /CS machen. Dumm nur, der ist nicht auf dem Bus !


    Also /CS mit /IORW verbinden, so dass anschließend eine Verzögerung um 20ns zustande kommt...

    /(/IOR * /IOW) -> a=b -> /CS

    //(/CS + /IOR) -> /RD +2*15ns

    also NOR und nochmal Invertiert könnte gehen.


    15ns IORW

    25ns a=b

    15ns /CS

    30ns /RD /WR

    230ns /RD /WR minimum für den PCF

    = 315ns Signallaufzeit auf der Karte (bei 500ns Maschinenzyklus) könnte hinhauen.


    Bin ich da auf dem richtigen Weg? Gibts da nicht schon ein schönes Beispiel zum abmalen? Warum hab' ich den Mist vor 25 Jahren studiert? Man, beim MFA machen die die Adresscodierung ja auch dauernd so. Menno. Motz ;o)

  • Bei dieser Schaltung kommt /CS Verzögert nach /IOR /IOW.

    Eigentlich sollte erst der /CS da sein und danach erst /IOR /IOW (20ns). In diesem Fall muss das sogar sein, sonst springt der PCF in den falschen Modus.

    Vollkommen richtig.

    Da hast du viel gelesen und anscheinend verstanden, find ich gut.


    Schmeiss das IOWR weg und leg einfach den A=B Eingang auf VCC. Das reicht.

    /CS darf ja auch aktiv werden ohne ein /IOR oder /IOW.

    /CS sagt ja nur, das jetzt die richtige Adresse aktiv ist. Ob dann ein /IOR oder /IOW aktiv wird oder nicht, ist vollkommen egal.


    Oder nimm einen LS688, damit kannst du die Adresse besser ausdekodieren.


    Gibts da nicht schon ein schönes Beispiel zum abmalen? ... Man, beim MFA machen die die Adresscodierung ja auch dauernd so. Menno. Motz ;o)

    Abmalen heisst meistens Fehler uebernehmen. Selber denken hilft meist mehr.

    Hab ich ja gesagt, das die Dekodierung in den MFA-Schaltungen genauso falsch ist. Durch's abmalen wird's nicht richtiger.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Also soweit erstmal: MFA_I2C_0_2.pdf

    Schmeiss das IOWR weg und leg einfach den A=B Eingang auf VCC. Das reicht.

    /CS darf ja auch aktiv werden ohne ein /IOR oder /IOW.

    /CS sagt ja nur, das jetzt die richtige Adresse aktiv ist. Ob dann ein /IOR oder /IOW aktiv wird oder nicht, ist vollkommen egal.

    Wenn aber der 245er Treiber mit dem /CS dazukommt, feuert der auf den Bus. Ohne den würde das wohl gehen.

    Den /IACK musst du noch anschliessen, ist ein Eingang

    Was zum Geier macht der denn noch ;o) Ist wohl das ACK für seinen Interrupt. Ich wäre versucht den an /INTA anzuschließen, aber das les ich mir erst mal an. (ups da ist schon ein Fehler im Plan.. am Bus gibts nur INTA)

    Oder nimm einen LS688, damit kannst du die Adresse besser ausdekodieren

    Joa, wäre dann 8-bit adressierbar. A0 und B0 auf Masse gezogen und somit lediglich Basisadresse und Folgeadresse belegt. (Bei Reichelt gibts den 688 nicht mehr... )

    Edited once, last by Andechs ().

  • Wenn aber der 245er Treiber mit dem /CS dazukommt, feuert der auf den Bus. Ohne den würde das wohl gehen.

    Stimmt. Gut aufgepasst.

    Dann musst du besser das IOR+IOW nach dem /CS verknüpfen.


    Ist wohl das ACK für seinen Interrupt. Ich wäre versucht den an /INTA anzuschließen

    Du hast den INT-Ausgang über Jumper an die Restarts (RSTx.5) gelegt. M.W. erzeugen die kein INTA, weil die nicht vektorisiert sind.

    Bei den Interrupts am 8085 kenn ich mich nicht so genau aus.


    A0 und B0 auf Masse gezogen

    Ist egal wie du die Ax und Bx belegst. Es geht nur um Gleichheit.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Die "Gute-Nacht-Lektüre": Es war einmal ein einsamer Prozessor, der auf die göttliche Unterbrechung wartete...


    <elevator music on>

    Mit dem INT-Signal gibts ein variables Interrupt. Der 8085 liest nach INT über INTA (quasi ein IOR) ein Byte ein und springt dann an die damit definierte Stelle im ROM-Interrupt-Vektor. Dort steht dann ein JMP auf den RAM-Vector (damit wir damit spielen können) oder auf die MAT85 Interrupt-Routine.

    Der gewünschte Interrupt wird im PCF abgelegt. Bei INTA spuckt er die codierte Adresse auf den Datenbus.

    <elevator music off>


    • Also muss die Adresscodierung und der Treiber noch mit INTA funktionieren...
    • Dann muss ich mal schauen, was da im Ram-Vektor bei mir so steht. (welche sind denn noch frei?)
    • Welche RST Signale werden von den Originalkarten belegt? (z.B. RST6.5 für MAT85-Terminal)
    • Kennt einer eine Karte die den INT verwendet?
    • Ich glaube ich habe damals für die Berufsschule so eine INT-Vektorkarte gebastelt, ob ich die Unterlagen noch finde?

    Soviel zum Thema mal ein kleines Projekt nebenbei...

  • Hi,

    meines Wissens nach nutzen folgende Karten Interruptleitungen:


    • CPU-Karte MFA 2.1 (TRAP per Taster auslösbar)
    • Zähler/Zeitgeber-Karte MFA 4.6 (per Lotbrücke einstellbarer Interrupt RST 5.5/6.5/7.5)
    • Floppy-Interface MFA 7.1 (default auf RST 5.5, Änderung macht Code-Anpassung im MINI-DOS erforderlich)
    • Auf der programmierbare Parallel und Seriellschnittstelle MFA 4.3/4.4 bzw. 4.10 sind die RST 5.5 - 7-5 zwar als Anschluss ausgeführt aber standardmäßig nicht genutzt
    • Videokarte MFA 8.4, hier aber nur RST 6.5 per Lötbrücke einstellbar (Tastatur erzeugt ein "Any-Key-Down"-Signal)

    Das Wissen ist das einzige Gut, das sich vermehrt, wenn man es teilt. (Marie von Ebner-Eschenbach)

    Edited 2 times, last by Thilo ().

  • Der "i soi färdisch"-Status für heute:

    Also mit dem ganzen Gatterkleinvieh wurde es mir zu bunt auf der Platine. Habe mir jetzt einen GAL gebastelt und da alles reingepackt.

    Das hat den Vorteil, dass man das jetzt schon testen kann: Einen 8Bit Vergleicher haben wir ja auf den I/O Platinen. Von denen das ADR- Signal geklaut, der Rest ist von der Backplane.



    • Man staune, ich brauch mindestens zwei Durchläufe der Makrozellen, um auf die 20ns Verzug zu kommen. Die haben 10ns Gatterlaufzeit. Gar nicht so übel für die Zeit.
    • Die 240ns Datenbereitstellungszeit ist locker zu schaffen.
    • Die 2 LS85 mit dem Inverter sind wahnsinnig schnell (LS688?)
    • Ich mag mein Oszi immer noch
    • Ein 16V8A langt für den ganzen Kleinkram.

    Hier mal der Entwurf für den GAL:

  • So ein GAL hilft oft bei soviel Gatterlogik.


    Man staune, ich brauch mindestens zwei Durchläufe der Makrozellen, um auf die 20ns Verzug zu kommen. Die haben 10ns Gatterlaufzeit. Gar nicht so übel für die Zeit.

    Wofür brauchst du eine Verzögerung?


    Und, wenn man sich auf Durchlaufzeiten verlässt, ist man (irgendwann) verlassen.

    Wenn auf dem GAL -10 für 10ns Durchlaufzeit draufsteht, ist das der Maximalwert. Es können aber auch nur 5ns sein.


    Was machst du mit WR und RD ?

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • :thumbup::thumbup::thumbup::thumbup:


    Super Sache das... ich hatte über ein MFA I2C Interface auch mal nachgedacht... also ob soetwas sinnvoll wäre oder nicht.

    Wollte mich damit irgendwann mal beschäftigen... aber wenn da jetzt jemand dran ist, Daumen hoch.


    :thumbup::thumbup::thumbup::thumbup:

    Gruß Torsten

    BFZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, MSX VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, TP755cx, T20, T41, T61, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e, Sharp PC1401 & PC1403H, TI59 m. PC-100c, HP48SX & HP48GX


    An die Person, die meine Schuhe versteckt hat, während ich auf der Hüpfburg war: Werd' erwachsen! :motz:


    ::matrix::

  • ADR ist der 8bit Compare

    INTA, IOR, IOW vom Bus

    CS1, DIR an den Bustreiber

    CS2, WR, RD, IACK gehen an den PCF


    RD,WR >20ns nach CS, sonst startet der PCF im 68000er Modus.

    Auf dem GAL stand sogar 25ns drauf. Daher dachte ich erst eine Gatterlaufzeit würde langen.

    So der große Wurf war der Test noch nicht. Da der Adressvergleicher hier immer noch nach IORW kommt und nicht nach ALE. Wenn man den permanent mitlaufen lässt, kommt das CS früher.


    Bein INTR und IACK muss ich auch noch bei:

    • INTR kann mehrfach verwendet werden. Wird auf der CPU-Karte mit Pulldown (TTL ?!) runtergezogen. Also Tristate nötig.
    • INTA darf nur gegeben werden, wenn der PCF selber den Interrupt ausgelöst hat.

  • RD,WR >20ns nach CS, sonst startet der PCF im 68000er Modus.

    Schau dir das CPU Timing an!

    I.a. kommt die Adresse deutlich frueher als RD und WR

    Wenn du aus der Adresse das CS machst reicht das.


    Abgesehen davon, du hast das CS2 um 20ns verzoegert, nicht RD und WR.

    Ok, ohne geaenderten Schaltplan bzw eine Erklaerung, wie du was verdrahten willst, ist das nicht aussagekraeftig.

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Druckfrisch mit fast keinen erkennbaren Fehlern ;o)


    MFA_I2C_0_3.pdf


    • Den 688 bekommt man beim Reichelt nur als HCT-Variante.
    • Der PCF kommt dann mit Break-Out Bord (DIP ist out).
    • Irgendwelche Vorschläge für die Kondensatoren? Welche nimmt man da? Für die Chips würde ich ja Sockel mit Kondensator nehmen. Kann man aber trotzdem mal vorsehen.

    Danke übrigens, für die Nachwuchsarbeit funkenzupfer! Macht mal wieder richtig Spaß.


    Abgesehen davon, du hast das CS2 um 20ns verzoegert, nicht RD und WR.

    (!ADR & (!IOR... Matrix -> !CS1 Makro -> !CS1&!IOR Matrix -> !RD Makro (der Feedback kommt aus dem Ausgangsmakro, der lange Weg...)

    Edited once, last by Andechs: ... vergessen zu Antworten ().

  • Druckfrisch mit fast keinen erkennbaren Fehlern ;o)

    Jetzt wirst du uebermuetig! ;)



    Vorschläge für die Kondensatoren?

    100nF X7R



    Danke übrigens, für die Nachwuchsarbeit

    Gerne doch.


    Dann werden wir die mal vertiefen. ;)


    INTR.oe find ichh gut. Warum nicht auch bei RST?


    INT -> RSTx.5:

    Erzeugt der 8085 ein INTA bei den RSTs?

    Sonst musst du ein IACK fuer den PCF anderweitig erzeugen oder kann man den INT ueber Register bestaetigen?


    INTA & !INT find ich keine gute Idee.

    Im Timing Diagramm des PCF wird INT zurueck nach dem IACK genommen. Dann waere der Term unwahr. Fuer den PCF wahrscheinlich nicht schlimm, aber dein Datenbustreiber geht zu und der Prozessor hat den IntVector evtl. noch nicht gelesen.


    Mein Vorschlag fuer die Gleichungen: (alles active high)


    CS245 = ADR # INTA

    !DIR245 = IOR # INTA (Leserichtung)


    CS_PCF = ADR

    IACK_PCF = !INTA


    INT = 1

    INT.oe = !INT_PCF



    IOW und IOR gehen direkt an den PCF


    beim Reichelt nur als HCT-Variante.

    Schau mal bei kessler-electronic. Die sind bei sowas deutlich besser sortiert.


    Viel Erfolg

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

    • INTR.oe: ist drin
    • Beim ADR ohne IORW grummelts noch, gibt halt CS Fehlzündungen.
    • Habe mir die Zyklen vom 8085 und PCF wegen dem INTA angeschaut. Hast recht, ist mist. Doof ist nur das er nun auf einen INTA reagiert, obwohl er gar nicht gemeint war (bei Doppelbelegung). Dann müsste man sich schon wieder Flipflops einbauen... (eventuell das .d im Gal verwenden?)
    • Jepp, der INTA-Zyklus ist optional, geht auch mit normalen RST's


    Eine E/A-Karte hab' ich nun schon :O) Nun fehlen aber noch ein paar Teile. Dann können wir sehen, was die Praxis gegen die Theorie hat.
    Guten Morgen, übrigends...

  • Beim ADR ohne IORW grummelts noch, gibt halt CS Fehlzündungen.

    Beim PCF funxt's. Aber der 245er macht dann Bloedsinn. Stimmt.


    CS245 = (ADR & (IOR # IOW)) # INTA


    Doof ist nur das er nun auf einen INTA reagiert, obwohl er gar nicht gemeint war (bei Doppelbelegung).

    Das Problem hast du beim 8080/8085 immer wenn du mehrere INT Quellen hast.

    Ganz ehrlich, ich wuerde das INT zum 8085 weglassen. Macht nur Aerger und Arbeit.


    der INTA-Zyklus ist optional, geht auch mit normalen RST's

    Und wie wird dann der INT im PCF bestaetigt?

    ;------------------------------------
    ;----- ENABLE NMI INTERRUPTS
    (aus: IBM BIOS Source Listing)

  • Und wie wird dann der INT im PCF bestaetigt?

    Per Registerzugriff kann man den Interrupt zurücknehmen.


    Sooo, ich bin ein Stück weiter. Ich habe mir den Signalverlauf mal angesehen und festgestellt, dass die vereinfachte Version von dir definitiv funktioniert. Zwar gibt es am PCF CS-Signale die Blödsinn sind, aber er bekommt weder IORD noch IOWR (sind ja Seicher-zugriffe). Und wenn alle Stricke reißen, feuert er gegen den LS245 der im Tristate schlummert.


    Signalverlauf IORD


    Signalverlauf IOWR und ein INTR


    :/

    Code
    CS2  = !( (!ADR#INTA) & ((!IOR#INTA) # !IOW ))
    DIR2 =    (!ADR#INTA) &  (!IOR#INTA)              ... Chip umdrehen und schon ists ein NAND
    CS   = !( (!ADR#INTA)

    3x OR, 3x NAND ... oder ists doch zu früh am Morgen?

  • SMD? Im Ernst? Soviel zu classic-computing... Gibt dann ne Lochrasterplatine mit Randbebauung.

  • Kleiner Zwischenstand um mal zu schauen, wie es werden kann.

    MFA_I2C_0_4.pdf


    EEPROM/FRAM: 24LC64 FM24C64B o.ä.

    RTC: DS1307

    Da fehlen noch die 2 kleinen 100nF Würfel. Kommen noch ein paar größere irgendwohin?

    Mit der Batterie bin ich noch nicht so glücklich. Hab mich auch noch nicht richtig mit befasst.

    Die kleinen Rn's (3er, 4er) fliegen wieder raus und werden Einzelwiederstände. Ist einfacher anzupassen und zu beschaffen.

    Die Stecker werden wohl alle 5pin JST-PH. Da kann man sich aussuchen ob 4pin 2mm, 5pin 2mm oder Grove/Seed connector. Der andere ist ein klassischer Flachbandslot (Kennt noch einer die C-Control I Erweiterungsmodule?).

    Ein Lochrasterfeld kann doch nicht so schwierig sein... grml.

    Sperrflächen für die Fronplattenmontage fehlen..


    Noch andere Ideen, was noch fehlt, oder so nicht geht?

  • Mal ein kleines Update:

    Schaltplan: MFA_I2C_1_9.pdf


    Die Bauteile sind mittlerweile angekommen. Am Wochenende kommt die "Countryard" Prüfung. Wenn Euch sonst nichts auffällt, geht der Prototyp in die Fertigung (Aisler: 11€ pro Platine, leider immer nur im 3er Pack).


    OffTopic:
    Hat ein wenig länger gedauert, ich hatte noch ein wenig Spaß mit dem "Konvolut", brauchte noch einen Serviceadapter für meine Hameg8000er, ein Breakoutboard für mein MSO und einen SubD9 Joystickadapter für den RetroPi400. Wenn's da auch interesse gibt (Platinen sind noch da) einfach PN.


    Schönes WE an alle Bastler!