МС6205: различия между версиями

Материал из DekatronPC
Строка 27: Строка 27:


Индикатор исправен и будет использоваться в эмуляторе лампового компьютера на ПЛИС
Индикатор исправен и будет использоваться в эмуляторе лампового компьютера на ПЛИС
<syntaxhighlight lang="c">
#define WR (11)
#define RST (10)
#define ADR (12)
void setup() {
  Serial.begin(38400);
  // put your setup code here, to run once:
  for (uint8_t i = 2; i <= 20; ++i )
  {
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  digitalWrite(WR, HIGH);
  digitalWrite(ADR, HIGH);
  digitalWrite(RST, HIGH);
  strobeRst(20);
}
void strobeWr()
{
  PORTB &= ~(1 << PB3);
  delayMicroseconds(2);
  PORTB |= (1 << PB3);
}
void strobeAddr()
{
  PORTB &= ~(1 << PB4);
  delayMicroseconds(2);
  PORTB |= (1 << PB4);
}
void strobeRst(uint8_t row)
{
  uint8_t startPos = row < 10 ? row * 16 : 0;
  uint8_t endPos = row < 10 ? row * 16 + 16 : 160;
 
  for (uint8_t i = startPos; i < endPos; ++i)
  {
    sendAddr(i);
    sendData(0x5F);
  }
  sendAddr(0);
}
void sendPort(uint8_t data)
{
  PORTC &= ~0x3F;
  PORTC |= data & 0x3F;
  PORTB &= ~0x03;
  PORTB |= (data >> 6) & 0x03;
}
void sendAddr(uint8_t addr)
{  sendPort(addr);  strobeAddr();}
void sendData(uint8_t data)
{  sendPort(data);  strobeWr();}
uint8_t pos = 0;
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1;          // interval at which to blink (milliseconds)
uint8_t convertChar(uint8_t data)
{
  uint8_t high = 0x70 - (data & 0xf0);
  uint8_t low = (0x0f - (data & 0x0f)) & 0x0f;
  return high | low;
}
void loop() {
  while (1)
  { // put your main code here, to run repeatedly:
    if (Serial.available() > 0)
    {
      uint8_t symbol =  Serial.read();
      if (symbol == 0xff)
        pos = 1;
      else
      {
        if ((symbol & 0xf0)  == 0xf0)
        {
          strobeRst(symbol & 0x0f);
          pos = 0;
        }
        switch (pos)
        {
          case 1:
            sendAddr(symbol);
            pos = 2;
            break;
          case 2:
            sendData(symbol);
            pos = 0;
            break;
        }
      }
    }
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= 1) {
      // save the last time you blinked the LED
      previousMillis = currentMillis;
      Serial.write(0xfd);
    }
  }
}
</syntaxhighlight>


== Видео ==
== Видео ==

Версия 20:31, 29 июня 2020

Mc6205 view.jpg

Описание

Индикаторная панель МС6205 на основе индикатора ГИП10000

  • Рабочая область экрана 119*119мм
  • Разрешение 100*100 точек
  • Конфигурация - 10 строк по 16 символов с подчеркиванием

ГИП10000 по умолчанию - графический индикатор. Однако контроллер дисплея конфигурирует его как текстовый, с постоянно горящими символами подчеркивания. Кодовая таблица - "чережопный" КОИ-7 - зашита непосредственно в ПЗУ индикаторной панели. "Черезжопный" потому что октеты символов инвертированы.

Индикаторная панель требует два типа питания - +5В и +12В. Все остальные напряжения необходимые для работы - вырабатываются самой панелью.

Интерфейс - параллельный. 8 линий адреса, 7 линий данных. Можно мультиплексировать шину адреса и шину данных, указывая на отдельном пине что сейчас подается.

Происхождение

схема распайки кабеля

Конкретно моя панель стояла на советском счетчике банкнот "Банкнота-1"

Mc6205 banknota.jpg

Подарил Андрей М. За что ему спасибо. У панели родной шлейф, который был прозвонен, к нему были подпаяны две колодки и индикатор был подключен к плате ардуино.

Mc6205 cable.jpg

Индикатор исправен и будет использоваться в эмуляторе лампового компьютера на ПЛИС

#define WR (11)
#define RST (10)
#define ADR (12)

void setup() {
  Serial.begin(38400);
  // put your setup code here, to run once:
  for (uint8_t i = 2; i <= 20; ++i )
  {
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
  digitalWrite(WR, HIGH);
  digitalWrite(ADR, HIGH);
  digitalWrite(RST, HIGH);

  strobeRst(20);
}

void strobeWr()
{
  PORTB &= ~(1 << PB3);
  delayMicroseconds(2);
  PORTB |= (1 << PB3);
}

void strobeAddr()
{
  PORTB &= ~(1 << PB4);
  delayMicroseconds(2);
  PORTB |= (1 << PB4);
}

void strobeRst(uint8_t row)
{
  uint8_t startPos = row < 10 ? row * 16 : 0;
  uint8_t endPos = row < 10 ? row * 16 + 16 : 160;
  
  for (uint8_t i = startPos; i < endPos; ++i)
  {
    sendAddr(i);
    sendData(0x5F);
  }
  sendAddr(0);
}

void sendPort(uint8_t data)
{
  PORTC &= ~0x3F;
  PORTC |= data & 0x3F;
  PORTB &= ~0x03;
  PORTB |= (data >> 6) & 0x03;
}

void sendAddr(uint8_t addr)
{  sendPort(addr);  strobeAddr();}

void sendData(uint8_t data)
{  sendPort(data);  strobeWr();}

uint8_t pos = 0;
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 1;           // interval at which to blink (milliseconds)
uint8_t convertChar(uint8_t data)
{
  uint8_t high = 0x70 - (data & 0xf0);
  uint8_t low = (0x0f - (data & 0x0f)) & 0x0f;
  return high | low;
}

void loop() {

  while (1)
  { // put your main code here, to run repeatedly:
    if (Serial.available() > 0)
    {
      uint8_t symbol =  Serial.read();

      if (symbol == 0xff)
        pos = 1;
      else
      {
        if ((symbol & 0xf0)  == 0xf0)
        {
          strobeRst(symbol & 0x0f);
          pos = 0;
        }
        switch (pos)
        {
          case 1:
            sendAddr(symbol);
            pos = 2;
            break;
          case 2:
            sendData(symbol);
            pos = 0;
            break;
        }
      }
    }
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= 1) {
      // save the last time you blinked the LED
      previousMillis = currentMillis;
      Serial.write(0xfd);
    }
  }

}

Видео

Ссылки