Express-Spezialist

    Erinnerst du dich an deinen ersten Computer? Ich erinnere mich. Es war ein ZX-kompatibles PC-Spektrum. Das war '89. Ich weiß nicht genau, ob sein Vater es gekauft oder gegen etwas anderes eingetauscht hat, aber ein PC erschien im Haus und alles begann. Darauf habe ich meine ersten Programme geschrieben und BASIC gemastert. Als ich in den Klassen 7 bis 9 war, gab es auch PK-01 Lviv und Vector 06C.

    In der 11. Klasse wurde versucht, Orion-128 zusammenzubauen. Nach der Schule ging ich nach Tomsk, um zu studieren, und alles, was ich damals schaffte, war, Löcher zu bohren und Pfade mit Farbe zu malen. Das hat die Platinenätzung nicht erreicht. Bereits an der Universität hatte ich PC-kompatible PCs und alte Computer wurden in der Regel überflüssig. Doch die Idee, einen eigenen PC zu bauen, ging fast 14 Jahre lang in die Luft. Die Idee wurde dann durch einen Streit mit Orions Vater angeheizt. Anscheinend, um mich zum Bauen zu motivieren, sagte er, dass ich es nicht zusammenbauen könnte.

    Während ich im Herbst 2014 eine weitere Konstruktion auf dem Arduino zusammenbaute, fragte ich mich, ob es möglich sein würde, denselben Orion-128 oder, einfacher gesagt, Radio 86RK zusammenzubauen. Als er über diese Idee nachdachte, beschloss er, seinen Traum von der alten Schule zu verwirklichen - einen PC, der selbst zusammengebaut wurde. Gesagt, getan. Alexei Morozovs Videos über die Reparatur alter Computer und Artikel in verschiedenen Retro-PC-Foren vertrauten darauf. In diesen Foren gab es Leute, die ständig Retro-PCs sammelten.

    Und ich fing an, nach einer geeigneten Schaltung ohne knappe Details zu suchen - im Idealfall nur eine kleine Logik, einen Prozessor und einen Eingangs- / Ausgangsport. Zuerst schaute ich auf PC Leningrad, konnte aber die Z80 in der Stadt nicht finden, aber es war eine lange Wartezeit, um zu bestellen. Infolgedessen blieb ich bei der Specialist Express-PC-Schaltung stehen. Das Schema ist meiner Meinung nach ideal für Anfänger, da es nur ein Minimum an Teilen enthält und einfach zu montieren und in Betrieb zu nehmen ist.

    Auf der Website www.spetsialist-mx.ru wurde ein sehr hochwertiges Diagramm gefunden , das von einem Mann mit dem Spitznamen Fifan neu gezeichnet wurde, wofür er sich sehr bedankt.

    Die nächste Frage ist, ob Sie eine Leiterplatte mithilfe der LUT-Technologie herstellen oder in die Vergangenheit eintauchen und sie wie die meisten Fans in den 80er Jahren mit MGTF-Kabeln an der Wand montieren möchten. Da die Hauptidee war, das Gerät zusammenzubauen, anstatt es aufgrund der geringen Produktivität für eine großartige praktische Anwendung zu halten, entschied ich mich für die zweite Option.

    Alle Teile für die Montage kosten ca. 4000 Tenge (ca. 1000 Rubel). Ich beschloss, alle Mikrochips in die Steckdosen zu stecken.



    Am ersten Tag baute ich einen Taktgenerator und Zähler zusammen. Das Löten mit MGTF erwies sich als sehr einfach. Jemand schreibt im Internet, dass Sie die Enden reinigen müssen. Ich habe den Draht einfach mit einem Drahtschneider abgebissen. Danach habe ich eine kleine Menge Kolophonium auf die Spitze aufgetragen und sie mit einem Lötkolben mit einem Tropfen Zinn erhitzt. Gleichzeitig rutschte das Geflecht um etwa 0,5 mm, was gerade ausreicht, um es zu löten.

    Hände zerkratzt, um Strom zu geben, und stellen Sie sicher, dass der Generator und die Zähler funktionieren. Da jedoch weder ein Frequenzmesser noch ein Oszilloskop zur Verfügung standen, wurde beschlossen, die Installation abzuschließen und erst dann ein Debugging durchzuführen.

    Die zweite Sitzung fand nur eine Woche später am Wochenende statt. Für zwei freie Tage habe ich einen Synchrongenerator hinzugefügt, Register für die Bilderzeugung, Multiplexer und RAM.



    Nach einer weiteren Arbeitswoche setzte er sich wieder zum Löten. Am Wochenende habe ich fast das gesamte Programm synchronisiert. Lediglich die Tastatur- und Kassettenrekorderanschlüsse wurden nicht verlötet. Es gab auch ein Problem beim Anschließen des Prozessors an die Stromversorgung. Das Diagramm enthält widersprüchliche Informationen.

    Zu dieser Zeit traf ich Alexei Morozov (VINXRU) und Andrey Anishcheko. Aleksey half, mit den Schlussfolgerungen des Verarbeiters umzugehen. Mit Blick auf die Zukunft werde ich sagen, dass die Jungs beim Erstellen und Debuggen des PCs sehr geholfen haben. Vielen Dank dafür!

    Zu diesem Zeitpunkt war der Computer fast fertig.



    Hände zerkratzt lieber einschalten. Sobald die Stabilisatoren angelötet sind, prüfen Sie daher die Bildung von -5 Volt. Dazu habe ich einen Taktgenerator, Zähler und einen Wechselrichter am 155LA3 in die Buchsen eingebaut. Er schaltete den Strom ein und hier sind sie, ehrlich gesagt, -5,6 Volt auf dem Mikroprozessor-Bein! Freude an diesem Tag kannte keine Grenzen.



    Nur ein Moment ließ mich wundern - der Stabilisator 7805 (sogar der am Kühler angebrachte) wurde aufgewärmt, so dass er nicht berührt werden konnte. Und das sind nur 4 Mikrochips im Stromkreis.

    Die zweite Stabilisierungsoption war nicht original. Ich habe gerade 2 7805 Kisten parallel auf einen größeren Kühler gepflanzt. Sie fingen an, sich weniger zu aalen, aber es war immer noch unmöglich, sie nach 10 Minuten Arbeit zu berühren. Dieser Umstand erzwang den Kauf eines externen Netzteils für + 5V (4A) und + 12V (1A). Danach gab es keine Probleme mehr mit der Stromversorgung, außerdem konnte der 7812-Stabilisator aufgrund der anliegenden 12-V-Spannung aufgegeben werden, und

    nach dem Zusammenbau der gesamten Schaltung mussten der Lader und der Monitor in das ROM geschrieben werden. Es war nicht so einfach wie es vorher schien.

    Ich hatte keinen Programmierer. Ich fing an, einen Handprogrammierer zusammenzubauen, aber nachdem ich mir noch einmal den Code des Bootloaders und des Monitors angesehen hatte, beschloss ich, dieses unglückliche Unterfangen zu verlassen, obwohl in den 80ern viele diesen Weg gingen. Es war nicht möglich, den Programmierer eines solchen alten ROM in Almaty zu finden, aber ich wollte keinen Monat bestellen und verlieren. Deshalb begann er mit Arduino zu experimentieren. Zuerst wurde die Abschirmung verlötet und lernte den Inhalt des ROM zu lesen. Beide Chips waren nicht leer. Und dem Code nach zu urteilen, handelte es sich höchstwahrscheinlich um Firmware von Anrufer-IDs. Ein weiteres Problem ergab sich - sie müssen gelöscht werden. Im schulpflichtigen Alter sagte mir mein Vater ständig, dass es unmöglich ist, dass Licht auf den ROM-Kristall gelangt. Ich habe beide ROMs für ein paar Tage in die Sonne gelegt. Am Wochenende habe ich den Inhalt noch einmal überprüft - es wurden keine Informationen gelöscht.

    Nachrichten in den Foren sowie Alexey Morozov sprachen über zwei Arten des Löschens - dies ist die innere Glühlampe der DRL-Lampe mit einer Drossel, die eine große Menge schädlichen Ozons abgibt, und eine bakterizide medizinische UV-Lampe. Das Löschen des DRL-Coy dauert mit einer UV-Lampe ungefähr 3 Stunden und dauert ungefähr 15 Minuten. Ohne nachzudenken, kaufte ich OUFK-09-1, zumal die Häuser kalt waren und das Quarzen des Raumes willkommen wäre. Beide Chips wurden in 10 Minuten gereinigt. Jetzt musst du dem Schild irgendwie beibringen, in ROM zu schreiben. Es dauerte etwas länger. Ursprünglich plante ich, einen Programmierer in Visual Basic mit dem Senden von Daten an Arduinka über einen COM-Port zu beauftragen. Nach ein oder zwei Tagen entschied ich mich jedoch, das Schema zu vereinfachen, nämlich eine SD-Karte an Arduinka anzuschließen, die die erforderliche Firmware enthält, jedoch auf dem Schild Es würde 2 Knöpfe geben - Lesen und Schreiben.

    Das Ergebnis war so ein Schild: Ich habe



    den Bootloader und den Monitor im ROM heruntergeladen, die auch auf der Fifan-a-Website zu finden waren. Das Gerät wurde eingeschaltet und der Computer funktionierte nicht. Nun, das war zu erwarten. Zu diesem Zeitpunkt war bereits ein Frequenzmesser gefunden worden, und es wurde schnell klar, dass das RAS-Signal nicht richtig gebildet wurde, seine Frequenz sollte etwa 2 MHz oder vielleicht 6 oder 4 betragen haben. Dieses Problem dauerte ungefähr eine Woche. Aber es gab immer noch kein Bild.

    Auf Andrei's Rat hin forderte ich ein Testprogramm im ROM an und die Geräusche kamen vom Lautsprecher. Dies bedeutete, dass der Prozessor, die Puffer, das ROM und der E / A-Port ordnungsgemäß funktionierten.

    Nach einem kurzen Versuch stellte sich heraus, dass der Ausgangstransistor den Signalpegel liefert, den der Fernseher nicht arbeiten musste. Nachdem kleine Änderungen an der Schaltung dieses Knotens vorgenommen wurden, erschien endlich das Bild! Der Bildschirm war jedoch in 6 Abschnitte unterteilt, und das Bild wurde nur in 3 von ihnen angezeigt.



    Der Verdacht fiel auf die Multiplexer. Aber egal wie ich sie neu arrangierte, das Bild änderte sich nicht. Der Tester hat das Board nicht angerufen - alle Verbindungen waren hergestellt. Nachdem ich noch ein paar Tage mit diesem Problem verbracht und ein paar Optionen (Auswahl der Kondensatoren in den Teilerkreisen und SYNC des Prozessors) herausgesucht hatte, fand ich den Grund - trotzdem gab es ein Nichtlöten eines Kontakts im Multiplexer. Das Bild ging, aber mit Störungen in Form von vertikalen Linien, zusätzlich 2 RAM als defekt hervor.



    Eine Umlagerung der Mikrokreise an Stellen ergab kein Ergebnis, was wiederum ein Nichttrinken bedeutet. Und so stellte sich heraus. Es gab kein Essen auf ihnen. Anscheinend schmolz das Lot, als es Glättungskondensatoren verlötete.

    Danach wurde das Bild so, wie es hätte sein sollen. Das Testprogramm hat gezeigt, dass alles normal ist - das Bild wird erstellt, der Arbeitsspeicher ist normal.



    Der nächste Schritt ist die Tastatur. Am einfachsten ist es, eine Tastatur mit PS / 2-Schnittstelle über einen AVR-Controller anzuschließen. Nachdem ich mich jedoch bis zum Ende der Arbeitswoche mit dieser Idee beschäftigt hatte, beschloss ich, die Tastatur nach dem ursprünglichen Schema zusammenzubauen. Das endgültige Erscheinungsbild des PCs sah dann so aus:



    Und der Blick von der Installationsseite:



    Es bleibt, es in ein menschliches Gehäuse zu stecken und den Tastaturanschluss neu zu erstellen (die Idee eines 25-Fuß-Anschlusses war umständlich, daher nicht sehr erfolgreich), und ich gehe davon aus, dass die Montage abgeschlossen ist. Der Computer nimmt neben dem alten ZX-Spectrum, PK01-Lviv, Vector-06C und Mikrosha, die mir kürzlich vorgestellt wurden und die eine kleine Reparatur erfordern, Platz ein.

    Einerseits ist es traurig, dass ein alter Traum weniger geworden ist, andererseits sind sie erforderlich, um wahr zu werden. Es ist auch traurig, dass mein Vater den Moment, in dem er die Auseinandersetzung verlor, nicht überstanden hat.

    Das Fazit? Juckreiz oder wenn deine Hände juckten - mach mit, es lohnt sich!

    Anhang 1. Programmierer
    Das Programmiererdiagramm ist in der Abbildung dargestellt.


    Ich habe nicht versucht, einen Universal-Programmierer für verschiedene ROM-Typen zu erstellen (obwohl dies einfach zu bewerkstelligen ist), ich habe auch nicht versucht, den Firmware-Code optimal zu gestalten. Die Aufgabe dieses Schildes ist es, das ROM zu lesen und aufzuschreiben, und er wird damit fertig.
    Als 25-V-Netzteil habe ich ein universelles Laptop-Netzteil verwendet. Es liefert Spannungen von 12 bis 24 Volt mit einer Eingangsspannung von 12V oder 110-220V. 24 V für die Aufnahme waren genug.
    Arduino Mega verbindet sich über USB mit einem Computer. Als Teil der Arduino-Entwicklungsumgebung gibt es ein Dienstprogramm - Port Monitor. Es wird der gesamte Prozess des Programmiergeräts angezeigt.
    Der Programmcode zum Schreiben in das ROM muss im Stammverzeichnis der SD-Karte unter dem Namen code.hex gespeichert sein.
    Nach dem Einschalten bietet der Programmierer die Eingabe des Befehls - Lesen oder Schreiben an.
    Beispiel für das Lesen von Daten aus dem ROM (Monitor aufgezeichnet)


    Der Datensatz sieht ähnlich aus. Nachdem Sie auf die Schaltfläche Aufzeichnen geklickt haben, werden die Adresse und die aufgezeichneten Daten im Port-Monitor angezeigt.

    Programmquelle
    #include 
    int nMode = 0; //0-ожидание команды, 1-чтение, 2-запись
    void WriteByte(int adr, int data){  
      int i;
      String sAdr, sData;
      // чтение
      digitalWrite(42, LOW);
      pinMode(24, OUTPUT);
      pinMode(25, OUTPUT);
      pinMode(26, OUTPUT);
      pinMode(27, OUTPUT);
      pinMode(28, OUTPUT);
      pinMode(29, OUTPUT);
      pinMode(30, OUTPUT);
      pinMode(31, OUTPUT);
      // сформируем строку адреса и данных
      sAdr = "";
      sData = "";
      for (i = sizeof(adr) * 8 - 1; i >= 0; --i)
      {
         sAdr = sAdr + (String)((adr >> i) & 1);
      }  
      for (i = sizeof(data) * 8 - 1; i >= 0; --i)
      {
         sData = sData + (String)((data >> i) & 1);
      }  
      // выберем адрес
      if (sAdr.substring(15) == "1")
        digitalWrite(39, HIGH);
      else 
        digitalWrite(39, LOW);
      if (sAdr.substring(14, 15) == "1")
        digitalWrite(38, HIGH);
      else 
        digitalWrite(38, LOW);    
      if (sAdr.substring(13, 14) == "1")
        digitalWrite(37, HIGH);
      else 
        digitalWrite(37, LOW);    
      if (sAdr.substring(12, 13) == "1")
        digitalWrite(36, HIGH);
      else 
        digitalWrite(36, LOW);    
      if (sAdr.substring(11, 12) == "1")
        digitalWrite(35, HIGH);
      else 
        digitalWrite(35, LOW);    
      if (sAdr.substring(10, 11) == "1")
        digitalWrite(34, HIGH);
      else 
        digitalWrite(34, LOW);    
      if (sAdr.substring(9, 10) == "1")
        digitalWrite(33, HIGH);
      else 
        digitalWrite(33, LOW);    
      if (sAdr.substring(8, 9) == "1")
        digitalWrite(32, HIGH);
      else 
        digitalWrite(32, LOW);    
      if (sAdr.substring(7, 8) == "1")
        digitalWrite(43, HIGH);
      else 
        digitalWrite(43, LOW);    
      if (sAdr.substring(6, 7) == "1")
        digitalWrite(41, HIGH);
      else 
        digitalWrite(41, LOW);    
      if (sAdr.substring(5, 6) == "1")
        digitalWrite(40, HIGH);
      else 
        digitalWrite(40, LOW);    
      // установим значение байта
      if (sData.substring(15) == "1")
        digitalWrite(24, HIGH);
      else 
        digitalWrite(24, LOW);
      if (sData.substring(14, 15) == "1")
        digitalWrite(25, HIGH);
      else 
        digitalWrite(25, LOW);    
      if (sData.substring(13, 14) == "1")
        digitalWrite(26, HIGH);
      else 
        digitalWrite(26, LOW);    
      if (sData.substring(12, 13) == "1")
        digitalWrite(27, HIGH);
      else 
        digitalWrite(27, LOW);    
      if (sData.substring(11, 12) == "1")
        digitalWrite(28, HIGH);
      else 
        digitalWrite(28, LOW);    
      if (sData.substring(10, 11) == "1")
        digitalWrite(29, HIGH);
      else 
        digitalWrite(29, LOW);    
      if (sData.substring(9, 10) == "1")
        digitalWrite(30, HIGH);
      else 
        digitalWrite(30, LOW);    
      if (sData.substring(8, 9) == "1")
        digitalWrite(31, HIGH);
      else 
        digitalWrite(31, LOW);    
      // подождем 10мс для выбора адреса
      delay(10);
      //запись
      digitalWrite(42, HIGH);
      digitalWrite(44, HIGH);
      delay(60); // задерживаем высокий уровень на 60мс для записи данных
      digitalWrite(44, LOW);
      digitalWrite(42, LOW);
    }
    void writeChip() {
      nMode = 0;
      int adr, dat;
      adr = 0;
      // открываем файл только для чтения
      File myFile = SD.open("code.hex");
      if (myFile) {
        // читаем файл посимвольно до конца:
        while (adr < 2048 && myFile.available()) {
            dat = myFile.read();
            Serial.print((String)adr+" - "+(String)dat+" - ");
            Serial.println(dat, HEX);
            WriteByte(adr, dat);
            adr++;
        }
        // закрываем файл:
        myFile.close();
      } else {
        // если файл не открылся, сообщает об ошибке:
        Serial.println("No file code.hex found!!!");
      }
    }
    void readChip() {
    int r, i, adr = 0;
    String sAdr, sData;
    // чтение
      digitalWrite(42, LOW);
      pinMode(24, INPUT);
      pinMode(25, INPUT);
      pinMode(26, INPUT);
      pinMode(27, INPUT);
      pinMode(28, INPUT);
      pinMode(29, INPUT);
      pinMode(30, INPUT);
      pinMode(31, INPUT);
      adr = 0;
      while (adr < 2048) {
        // сформируем строку адреса
        sAdr = "";
        sData = "";
        for (i = sizeof(adr) * 8 - 1; i >= 0; --i)
        {
           sAdr = sAdr + (String)((adr >> i) & 1);
        }  
        // выберем адрес
        if (sAdr.substring(15) == "1")
          digitalWrite(39, HIGH);
        else 
          digitalWrite(39, LOW);
        if (sAdr.substring(14, 15) == "1")
          digitalWrite(38, HIGH);
        else 
          digitalWrite(38, LOW);    
        if (sAdr.substring(13, 14) == "1")
          digitalWrite(37, HIGH);
        else 
          digitalWrite(37, LOW);    
        if (sAdr.substring(12, 13) == "1")
          digitalWrite(36, HIGH);
        else 
          digitalWrite(36, LOW);    
        if (sAdr.substring(11, 12) == "1")
          digitalWrite(35, HIGH);
        else 
          digitalWrite(35, LOW);    
        if (sAdr.substring(10, 11) == "1")
          digitalWrite(34, HIGH);
        else 
          digitalWrite(34, LOW);    
        if (sAdr.substring(9, 10) == "1")
          digitalWrite(33, HIGH);
        else 
          digitalWrite(33, LOW);    
        if (sAdr.substring(8, 9) == "1")
          digitalWrite(32, HIGH);
        else 
          digitalWrite(32, LOW);    
        if (sAdr.substring(7, 8) == "1")
          digitalWrite(43, HIGH);
        else 
          digitalWrite(43, LOW);    
        if (sAdr.substring(6, 7) == "1")
          digitalWrite(41, HIGH);
        else 
          digitalWrite(41, LOW);    
        if (sAdr.substring(5, 6) == "1")
          digitalWrite(40, HIGH);
        else 
          digitalWrite(40, LOW);    
        // подождем 10мс для выбора адреса и прочтем данные
        delay(10);
        r = 0;
        if (digitalRead(24) == HIGH){
          sData = "1" + sData;
          r = r + pow(2, 0); } 
        else
          sData = "0" + sData; 
        if (digitalRead(25) == HIGH){
          sData = "1" + sData;
          r = r + pow(2, 1); } 
        else
          sData = "0" + sData; 
        if (digitalRead(26) == HIGH){
          sData = "1" + sData;
          r = r + pow(2, 2); } 
        else
          sData = "0" + sData;
        if (digitalRead(27) == HIGH){
          sData = "1" + sData;
          r = r + pow(2, 3); } 
        else
          sData = "0" + sData; 
        if (digitalRead(28) == HIGH){
          sData = "1" + sData;
          r = r + pow(2, 4); } 
        else
          sData = "0" + sData; 
        if (digitalRead(29) == HIGH){
          sData = "1" + sData;
          r = r + pow(2, 5); } 
        else
          sData = "0" + sData; 
        if (digitalRead(30) == HIGH){
          sData = "1" + sData;
          r = r + pow(2, 6); } 
        else
          sData = "0" + sData; 
        if (digitalRead(31) == HIGH){
          sData = "1" + sData;
          r = r + pow(2, 7); } 
        else
          sData = "0" + sData; 
        Serial.print(sAdr+" - "); 
        Serial.print(sData+" - ");
        Serial.println(r, HEX);
        adr++; 
      }
      nMode = 0;
    }
    void setup() {
      nMode = 0;
      Serial.begin(9600);
      pinMode(4, INPUT);
      pinMode(5, INPUT);
      pinMode(53, OUTPUT);
      if (!SD.begin(53)) {
        Serial.println("Card failed, or not present");
        return;
      }
      Serial.println("start...");
      pinMode(44, OUTPUT);
      digitalWrite(44, LOW);
      pinMode(42, OUTPUT);
      digitalWrite(42, LOW);  
      pinMode(39, OUTPUT);
      pinMode(38, OUTPUT);
      pinMode(37, OUTPUT);
      pinMode(36, OUTPUT);
      pinMode(35, OUTPUT);
      pinMode(34, OUTPUT);
      pinMode(33, OUTPUT);
      pinMode(32, OUTPUT);
      pinMode(43, OUTPUT);
      pinMode(41, OUTPUT);
      pinMode(40, OUTPUT);
      Serial.println("Init...done!");
      Serial.println("Waiting command...");
    }
    void loop() {
      if (digitalRead(4) == LOW && nMode == 0){
        delay(20); // защита от дребезга контактов
        if (digitalRead(4) == LOW && nMode == 0){
          Serial.println("Start writing chip...");
          nMode = 2;  
          writeChip();
          Serial.println("Writing complete!!!");
          delay(5000);
        }
      }
      if (digitalRead(5) == LOW && nMode == 0){
        delay(20); // защита от дребезга контактов
        if (digitalRead(5) == LOW && nMode == 0){
          Serial.println("Start reading chip...");
          nMode = 1;
          readChip();
          Serial.println("Reading complete!!!");
          delay(5000);
        }
      }  
      delay(100);
    }
    



    Jetzt auch beliebt: