Author Topic: Challenge: Learn something new from something really OLD  (Read 4525 times)

0 Members and 1 Guest are viewing this topic.

Offline maurohTopic starter

  • Frequent Contributor
  • **
  • Posts: 292
  • Country: it
    • Mauro Pintus
Challenge: Learn something new from something really OLD
« on: November 21, 2014, 12:01:52 pm »
Hi, I own an Olivetti M10 (99% the same electronics of the Tandy (TRS-80) Model 100) that suddenly stopped working and I would like to take this opportunity to know something new from something really OLD  :-+.

I was hoping that one of you can suggest me some measurement to perform to track the fail or some other expert around the world to ask to.
The unit is in quite good conditions and was working perfectly until i touched the backup battery switch while the unit was powered.
Actually the backup battery was removed long time ago because was dead but everything was fine without it.

From the schematic i can't really understand why moving that switch can cause any issue and may be was just a coincidence.

Now if i power the unit (with 4 AA battery or with the power adapter) i can hear a tic on the beeper, the LCD turns on but no characters appear (i can adjust the contrast but i can get only dark pixels).

I found online the ROM dump and with a programmer i compared the content that was OK.
I also built a small circuit to test the LCD and it works.

Any suggestions?

Mauro



Offline maurohTopic starter

  • Frequent Contributor
  • **
  • Posts: 292
  • Country: it
    • Mauro Pintus
Re: Challenge: Learn something new from something really OLD
« Reply #1 on: December 20, 2018, 12:48:48 pm »
Long story short:

SUCCESS!!!!!! After so many YEARS my Olivetti M10 is working fine again.

Little explanation of the repair process:

Removed M3, M4 (decoders), M7, M8, M9 (all my RAM Modules).
Tested M3 and M4 with a TL866 -> good
Installed IC machined sockets.
Installed M3 and M4 back in place
Installed only one RAM module in M9 position 
PC tested -> FAIL
Replaced RAM Module
PC tested -> FAIL
Replaced RAM Module with the last one available
SUCCESS!!!!!!

As you can see from the pictures, I've used the world worst/cheapest desoldering tool (paid 6 euros) to remove the ICs and I have to say that it worked great.
Most probably it will fail within the next usage but did the job better then expected.

Regarding the Olivetti M10 I'm so happy to play with it again and I'm trying restore the broken RAM module with modern/available alternative components.

Mauro



 
The following users thanked this post: lordium, tsman

Offline Bashstreet

  • Frequent Contributor
  • **
  • Posts: 298
  • Country: gb
Re: Challenge: Learn something new from something really OLD
« Reply #2 on: December 21, 2018, 01:12:47 pm »
Olivetti is a Italian company ? was any of the components manufactured in Italy ?
 

Offline maurohTopic starter

  • Frequent Contributor
  • **
  • Posts: 292
  • Country: it
    • Mauro Pintus
Re: Challenge: Learn something new from something really OLD
« Reply #3 on: December 27, 2018, 08:31:32 am »
Yes, Olivetti is a well known Italian company that manufactured several PC printers and typewriters. They are still active but not in the PC market
The electronic design of the Olivetti M10 ia actually a customization of a Kyocera PC that was adapted also by NEC with the PC-8201A and Tandy with the famous TRS-80 Model 100.
Surely the design of the case with the nice tilted display was a touch by Olivetti but not other specific component were built by Olivetti.

In this days I'm trying to recover at least one of the 2 broken memory modules (made with 4 IC on a ceramic substrate) testing and combining the single IC hoping I have at least 4 good ones.

I tried to use my TL866 programmer to test the single IC and made e small adapter but so far no luck  :scared:

Mauro


Offline Kleinstein

  • Super Contributor
  • ***
  • Posts: 14507
  • Country: de
Re: Challenge: Learn something new from something really OLD
« Reply #4 on: December 27, 2018, 09:01:04 am »
The RAM module seems to be 8 Kbytes in an 28 pin case, just like the old 6264 Static rams.  If you are very lucky even  the pin-out could match or at least a simple converter socked like shown (only the other way around)  could work.
 

Offline maurohTopic starter

  • Frequent Contributor
  • **
  • Posts: 292
  • Country: it
    • Mauro Pintus
Re: Challenge: Learn something new from something really OLD
« Reply #5 on: December 27, 2018, 10:37:36 am »
The ceramic module is made with 4 TC5518BF,almost pin to pin compatible with the 6116 SRAM.
All pins of the 4 IC are in parallel, only the 4 CS are separated.

My adapter should accomodate the difference and with the jumper I shoul be able to select a single IC in the module. So far the TL866 is failing addr test, data, unit...  :-//

Since the 2 modules I removed from the M10 are failing in the PC I think at least one IC on each module is bad so I removed all IC but one from the ceramic module and I'm trying to test one IC at a time.

Mauro

Online Mechatrommer

  • Super Contributor
  • ***
  • Posts: 11698
  • Country: my
  • reassessing directives...
Re: Challenge: Learn something new from something really OLD
« Reply #6 on: December 27, 2018, 11:14:22 am »
Long story short:
SUCCESS!!!!!! After so many YEARS my Olivetti M10 is working fine again.
i dont want to congratulate you on your repair success, which is a norm with enough perseverance and patient. but i want to congratulate you for coming back after 4 years and conclude this thread. its a heartbreaking when we search in the net for repair report or success someone with the same device and we have the same fault, but finding the page is a no answer dead end.
Nature: Evolution and the Illusion of Randomness (Stephen L. Talbott): Its now indisputable that... organisms “expertise” contextualizes its genome, and its nonsense to say that these powers are under the control of the genome being contextualized - Barbara McClintock
 
The following users thanked this post: tooki

Offline maurohTopic starter

  • Frequent Contributor
  • **
  • Posts: 292
  • Country: it
    • Mauro Pintus
Re: Challenge: Learn something new from something really OLD
« Reply #7 on: December 27, 2018, 12:02:54 pm »
Ha ha  :-+ Thank you!!!
This is exactly the reason why I posted this.
I have to thank all the guys of the M100 Club www.club100.org that gave me support several times and specially to an Italian one (don't know if he want to be mentioned here...) that explained me a possible cause of the death that turns out to be correct!!!
He has also a youtube channel related to retrocomputing repair  :-+ https://www.youtube.com/user/iz8dwf/videos

The story is actually much longer and started two weeks after I received this Olivetti M10 from a university colleague in the 1995!!!!!
Yes I killed it in 2 weeks and I took 23 years to bring it back to life.
Since then I tried to acquire the tools and knowledge to repair it and taking it from the basement every once in a while to try some new tests.

Mauro

« Last Edit: December 27, 2018, 12:31:42 pm by mauroh »
 
The following users thanked this post: Mechatrommer

Offline maurohTopic starter

  • Frequent Contributor
  • **
  • Posts: 292
  • Country: it
    • Mauro Pintus
Re: Challenge: Learn something new from something really OLD
« Reply #8 on: December 28, 2018, 12:52:18 am »
This morning I built a new adapter to test the single SRAM ICs of the ceramic modules, with an Arduino Mega, will see how it goes  :)

Mauro

Offline maurohTopic starter

  • Frequent Contributor
  • **
  • Posts: 292
  • Country: it
    • Mauro Pintus
Re: Challenge: Learn something new from something really OLD
« Reply #9 on: January 03, 2019, 01:35:26 pm »
This is my SRAM Tester made with an ArduinoMega 2560  :-+
Attached you will find the instruction to build it yourself and the Arduino Code.

I succesfully identified the IC that were failing on my modules, removed it from the ceramic substrate and restored one module out of 2!!!!
Now my Olivetti M10 is working fine with 2 SRAM modules.

Please let me know if you will find this usefull or if you have a better simpler method to identify the bad IC in a module (I tried using a TL866 programmer with no luck).
This tester is so flexible and it can be adapted to test several kind of IC

Hoping it will help someone, I made a separete thread:
https://www.eevblog.com/forum/repair/sram-tester-with-arduino-mega-for-retrocomputers/


Mauro

Arduino Mega SRAM Tester for TRS-80 Model 100 , Olivetti M10 , Kyotronic KC-85 , NEC PC-8201A ...
Code:

Code: [Select]
//*******************************************************************************
// ArduinoMega SRAM Tester for
// TRS-80 Model 100 / Olivetti M10 / ...
// Author: Mauro Pintus
// Date  : 2018 12 21
// Ver   : 1.7
//*******************************************************************************

//   ___________SRAM PINs___________
//  |                               |
//  |          _MEGA GPIO_          |          TOP View           Bottom View
//  |         |           |         |         _____U______       _____U______ 
// A07 [01] (D22)       (+5V) [28] VCC       |   __u___   |    .|   ______   |.
// A06 [02] (D24)       (D25) [27] A08       |  |      |  |    .|  |      |  |.
// A05 [03] (D26)       (D27) [26] A09       |  |      |  |    .|  |      |  |.
// A04 [04] (D28)       (D29) [25] _WE       |  | IC1  |  |    .|  | IC4  |  |.
// A03 [05] (D30)       (D31) [24] CE4       |  |      |  |    .|  |      |  |.
// A02 [06] (D32)       (D33) [23] A10       |  |______|  |    .|  |__n___|  |.
// A01 [07] (D34)       (D35) [22] CEX       |            |    .|            |.
// A00 [08] (D36)       (D37) [21] IO7       |   __u___   |    .|   ______   |.
// IO0 [09] (D38)       (D39) [20] IO6       |  |      |  |    .|  |      |  |.
// IO1 [10] (D40)       (D41) [19] IO5       |  |      |  |    .|  |      |  |.
// IO2 [11] (D42)       (D43) [18] IO4       |  | IC2  |  |    .|  | IC3  |  |.
// GND [12] (---)       (D45) [17] IO3       |  |      |  |    .|  |      |  |.
// CE1 [13] (D46)       (---) [16] GND       |  |______|  |    .|  |__n___|  |.
// CE2 [14] (D48)       (D49) [15] CE3       |____________|    .|____________|.
//


//If the test will FAIL some pin could be shorted to GND or to VCC
//so all pins will be set as input to prevent damage to the Arduino
//A small resistor (150 Ohm) between each Arduino GPIO and memory pin
//should prevent any damage to the Arduino.

#define pinCE1 46
#define pinCE2 48
#define pinCE3 49
#define pinCE4 31
#define pinCEX 35
#define pin_WE 29

#define pinA00 36
#define pinA01 34
#define pinA02 32
#define pinA03 30
#define pinA04 28
#define pinA05 26
#define pinA06 24
#define pinA07 22
#define pinA08 25
#define pinA09 27
#define pinA10 33

#define pinIO0 38
#define pinIO1 40
#define pinIO2 42
#define pinIO3 45
#define pinIO4 43
#define pinIO5 41
#define pinIO6 39
#define pinIO7 37

#define max_addr 0x7ff

// Configuration variables
// Fill = 0 the tester will read the memory without writing on it
// Fill = 1 the tester will test each cell of the memory
int Fill = 1;

// Verb = 0 the tester will print only the test results
// Verb = 1 the tester will print on the serial port all the memory content
int Verb = 1;


uint8_t ctrl_pins[]  = { pinCE1, pinCE2, pinCE3, pinCE4, pinCEX, pin_WE };

uint8_t addr_pins[]  = { pinA00, pinA01, pinA02, pinA03, pinA04, pinA05,
                         pinA06, pinA07, pinA08, pinA09, pinA10 };
                       
uint8_t inout_pins[] = { pinIO0, pinIO1, pinIO2, pinIO3,
                         pinIO4, pinIO5, pinIO6, pinIO7 };

int  failed    = 0;
int  PassFail[]= {0,0,0,0};



void setup()
{
  Serial.begin(115200);

  Serial.println(F("\n*****************************************"));
  Serial.println(F("ArduinoMega SRAM Tester for"));
  Serial.println(F("TRS-80 Model 100 / Olivetti M10 / ..."));
  Serial.println(F("Author: Mauro Pintus"));
  Serial.println(F("Date  : 2018 12 21"));
  Serial.println(F("Ver   : 1.7"));
  Serial.println(F("*****************************************\n"));

  Serial.println(F("  ___________SRAM PINs___________ "));
  Serial.println(F(" |                               |"));
  Serial.println(F(" |          _MEGA GPIO_          |          TOP View           Bottom View  "));
  Serial.println(F(" |         |           |         |         _____U______       _____U______  "));
  Serial.println(F("A07 [01] (D22)       (+5V) [28] VCC       |   __u___   |    .|   ______   |."));
  Serial.println(F("A06 [02] (D24)       (D25) [27] A08       |  |      |  |    .|  |      |  |."));
  Serial.println(F("A05 [03] (D26)       (D27) [26] A09       |  |      |  |    .|  |      |  |."));
  Serial.println(F("A04 [04] (D28)       (D29) [25] _WE       |  | IC1  |  |    .|  | IC3  |  |."));
  Serial.println(F("A03 [05] (D30)       (D31) [24] CE4       |  |      |  |    .|  |      |  |."));
  Serial.println(F("A02 [06] (D32)       (D33) [23] A10       |  |______|  |    .|  |__n___|  |."));
  Serial.println(F("A01 [07] (D34)       (D35) [22] CEX       |            |    .|            |."));
  Serial.println(F("A00 [08] (D36)       (D37) [21] IO7       |   __u___   |    .|   ______   |."));
  Serial.println(F("IO0 [09] (D38)       (D39) [20] IO6       |  |      |  |    .|  |      |  |."));
  Serial.println(F("IO1 [10] (D40)       (D41) [19] IO5       |  |      |  |    .|  |      |  |."));
  Serial.println(F("IO2 [11] (D42)       (D43) [18] IO4       |  | IC2  |  |    .|  | IC4  |  |."));
  Serial.println(F("GND [12] (---)       (D45) [17] IO3       |  |      |  |    .|  |      |  |."));
  Serial.println(F("CE1 [13] (D46)       (---) [16] GND       |  |______|  |    .|  |__n___|  |."));
  Serial.println(F("CE2 [14] (D48)       (D49) [15] CE3       |____________|    .|____________|."));
  Serial.println();
   
}


void checkPins()
{
  int     readback,index,i;
  String  text;
 
  for (index = 0; index <= 1; index++)
  {
    if (index == 0) text="HIGH "; else text="LOW  ";
   
    for (i = 0; i < sizeof(ctrl_pins); i++)
    {
      if (index == 0) pinMode(ctrl_pins[i], INPUT_PULLUP);
      else          { pinMode(ctrl_pins[i], OUTPUT);
                      digitalWrite(ctrl_pins[i], LOW);
      }               
      readback = digitalRead(ctrl_pins[i]);
      if (readback != index) {
        if (Verb==1) Serial.println("Check: Ctrl pin  " + String(i, DEC) + " " + text +"PASS");
        pinMode(ctrl_pins[i], OUTPUT);
        digitalWrite(ctrl_pins[i], HIGH);
      } else {
        if (Verb==1) Serial.println("Check: Ctrl pin  " + String(i, DEC) + " " + text +"FAIL");
        pinMode(ctrl_pins[i], INPUT);
        failed++;
      }
    }
    if (Verb==1) Serial.println();
 
    //set address pins as output
    for (i = 0; i < sizeof(addr_pins); i++)
    {
      if (index == 0) pinMode(addr_pins[i], INPUT_PULLUP);
      else          { pinMode(addr_pins[i], OUTPUT);
                      digitalWrite(addr_pins[i], LOW);
      } 
      if (readback != index) {
        if (Verb==1){
          if (i<10)Serial.println("Check: Addr pin  " + String(i, DEC) + " " + text +"PASS");
          else     Serial.println("Check: Addr pin "  + String(i, DEC) + " " + text +"PASS");
        }
      } else {
        if (Verb==1){
          if (i<10)Serial.println("Check: Addr pin  " + String(i, DEC) + " " + text +"FAIL");
          else     Serial.println("Check: Addr pin "  + String(i, DEC) + " " + text +"FAIL");
        }   
        pinMode(addr_pins[i], INPUT);
        failed++;
      }
    }
    if (Verb==1) Serial.println();
   
    //set I/O pins as input
    for (i = 0; i < sizeof(inout_pins); i++)
    {
      if (index == 0) pinMode(inout_pins[i], INPUT_PULLUP);
      else          { pinMode(inout_pins[i], OUTPUT);
                      digitalWrite(inout_pins[i], LOW);
      } 
      if (readback != index) {
        if (Verb==1)Serial.println("Check: I/O  pin  " + String(i, DEC) + " " + text +"PASS");
        pinMode(inout_pins[i], INPUT_PULLUP);
      } else {
        if (Verb==1)Serial.println("Check: I/O  pin  " + String(i, DEC) + " " + text +"FAIL");
        pinMode(inout_pins[i], INPUT);
        failed++;
      }
    }
    if   (Verb==1) Serial.println();
  }
  if   (Verb==0)
  {
    if (failed == 0) Serial.println(F("Check pins PASS\n"));
    else             Serial.println(F("Check pins FAIL\n"));
  }
}



void setAddress(int address)
{       
  for (int i = 0; i < sizeof(addr_pins); i++)
  {
    digitalWrite(addr_pins[i], ((address >> i) & 1));
  }

}



void writeData(uint8_t data, int IC)
{

  int pinCEn;

  switch (IC) {
    case 1:
      pinCEn=pinCE1;
      break;
    case 2:
      pinCEn=pinCE2;
      break;
    case 3:
      pinCEn=pinCE3;
      break;
    case 4:
      pinCEn=pinCE4;
      break;
  }

  digitalWrite(pin_WE, LOW);
  digitalWrite(pinCEn, LOW);
  digitalWrite(pinCEX, LOW);
 
  for (int i = 0; i < sizeof(inout_pins); i++)
  {
    pinMode(inout_pins[i], OUTPUT);
    digitalWrite(inout_pins[i], ((data >> i) & 1));
  }

  digitalWrite(pin_WE, HIGH);
  digitalWrite(pinCEn, HIGH);
  digitalWrite(pinCEX, HIGH);
   
}



int readData(int IC)
{
  int pinCEn;

  switch (IC) {
    case 1:
      pinCEn=pinCE1;
      break;
    case 2:
      pinCEn=pinCE2;
      break;
    case 3:
      pinCEn=pinCE3;
      break;
    case 4:
      pinCEn=pinCE4;
      break;
  }

  digitalWrite(pin_WE, HIGH);
  digitalWrite(pinCEn, LOW);
  digitalWrite(pinCEX, LOW);
  delayMicroseconds(1);
  uint8_t readback=0;
 
  for (int i = 0; i < sizeof(inout_pins); i++)
  {
    pinMode(inout_pins[i], INPUT_PULLUP);
    readback = readback | ((digitalRead(inout_pins[i]) << i));
  }
 
  digitalWrite(pinCEn, HIGH);
  digitalWrite(pinCEX, HIGH);
  return readback;
}



void test(int Fill, int Verb)
{
  if (Fill==0) Serial.println(F("Dump Entire Memory without writing on it"));
  else         Serial.println(F("Test Entire Memory"));
 
  int     Addr,index;
  uint8_t Data[]={0x55,0xAA};   //Data Fill 01010101,10101010
  uint8_t readback;
  int     tab=0;
  int     IC;
 
  PassFail[0] = 1;
  PassFail[1] = 1;
  PassFail[2] = 1;
  PassFail[3] = 1;

  for (IC=1; IC <= 4; IC++){
    for (index=0; index <= 1; index++){
      if ((Fill==0)&&(index==1)) break;
      Serial.print("IC"+String(IC)+" Content");
      if  (Fill==1) Serial.println(" after filling it with 0x" + String(Data[index],HEX));
      else          Serial.println();
      for (Addr=0; Addr <= max_addr; Addr++)
      {
        if((tab==0)&&(Verb==1)){
          if(Addr<=0xF) Serial.print("00");
          else if(Addr<=0xFF) Serial.print("0");
          Serial.print(Addr,HEX);
          Serial.print(" ");
        }
        setAddress(Addr);
        if (Fill==1) writeData(Data[index],IC);
        readback = readData(IC);

        if ((Fill==1)&&(Verb==1)){
          if (readback == Data[index]) Serial.print(" ");
          else
          {
            Serial.print("x");
            failed++;
            PassFail[IC-1]=0;
          }
        }
        else if ((Fill==1)&&(Verb==0)){
          if (readback != Data[index])
          {
            failed++;
            PassFail[IC-1]=0;
          }
        } 
        else if ((Fill==0)&&(Verb==1)) Serial.print(" ");
       
        if (Verb==1){
          if(readback<=0xF) Serial.print("0");
          Serial.print(readback,HEX);
          tab++;
          if(tab==32){
            tab=0;
            Serial.println();
          }
        }

       
      }
      if (Verb==1) Serial.println();
    }
  }
  if (Verb==0) Serial.println();
}




void loop()
{
  checkPins();
   
  if (failed == 0)
  {
    digitalWrite(LED_BUILTIN, HIGH);
    unsigned long duration = millis();
    test(Fill,Verb); 
    duration = millis() - duration;
    Serial.println("Duration: " + String(duration/1000, DEC)+"S");
  }

  for (int IC=1; IC <= 4; IC++){
    if (PassFail[IC-1]) Serial.println("IC"+String(IC)+" PASS");
    else                Serial.println("IC"+String(IC)+" FAIL");
  }
 
  if (failed > 0)
  {
    Serial.println("Result: FAIL (" + String(failed, DEC) + ")");
    digitalWrite(LED_BUILTIN, LOW);
  }
  else
  {
    Serial.println("Result: PASS");
  }

  while(1);
}
« Last Edit: January 03, 2019, 04:27:16 pm by mauroh »
 
The following users thanked this post: coromonadalix, tooki

Offline Patricklaf

  • Newbie
  • Posts: 3
  • Country: fr
Re: Challenge: Learn something new from something really OLD
« Reply #10 on: March 07, 2019, 02:24:14 pm »
Hi Mauro,
I just get a M10 with the same symptoms as yours.
I will follow your instruction in order to repair it but I wanted to know if you have found a way to replace the missing RAM modules?
Regards,
Patrick
 

Offline Tomorokoshi

  • Super Contributor
  • ***
  • Posts: 1212
  • Country: us
Re: Challenge: Learn something new from something really OLD
« Reply #11 on: March 07, 2019, 05:42:50 pm »
Here is an interesting option for RAM modules:
https://www.ebay.com/itm/TANDY-Radio-Shack-MODEL100-100-Computer-RAM-expansion-PCB/113662802362

Just order and solder in the extra parts.
 

Offline Patricklaf

  • Newbie
  • Posts: 3
  • Country: fr
Re: Challenge: Learn something new from something really OLD
« Reply #12 on: March 07, 2019, 07:11:04 pm »
@Tomorokoshi thanks for your answer.
That's funny, this afternoon I started to design a replacement and I use also a 6264 and a 74HC148. I think I am on the right way  :)
« Last Edit: March 08, 2019, 05:34:27 pm by Patricklaf »
 

Offline maurohTopic starter

  • Frequent Contributor
  • **
  • Posts: 292
  • Country: it
    • Mauro Pintus
Re: Challenge: Learn something new from something really OLD
« Reply #13 on: March 08, 2019, 02:38:16 pm »
Hi Patricklaf,
   have you managed to test the SRAM module to ensure this is the cause of you issue?

In my case 2 out of 3 modules were damaged, but the M10 works just fine with only one module.
With the ArduinoMega tester listed in the previous post I was able to identify the single broken IC in each module and swapping it with a working IC I was able to recover one module out of two.

At the moment I'm happy with it, but to have my machine running with 32k I had 3 options:

1) Build one of this smd modules (M100 RAM Module (Surface Mount Version))
https://oshpark.com/profiles/Stardust

2) Have one of my friends build the attached module for 20$ each

3) Wait for a good deal on ebay (sometime an M10/M100 will come for less than a SRAM module...)

Good luck and dont forget to post news on the repair  :-+
Mauro
« Last Edit: March 08, 2019, 02:41:06 pm by mauroh »
 

Offline Patricklaf

  • Newbie
  • Posts: 3
  • Country: fr
Re: Challenge: Learn something new from something really OLD
« Reply #14 on: March 12, 2019, 09:01:29 am »
Hello Mauro,
Thanks for your answer.
I didn't test the modules yet. I will surely do.
I will let you know.
 
The following users thanked this post: mauroh


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf