1 Ostatnio edytowany przez _tzok_ (2018-08-29 21:54:17)

Jakiś czas temu wpadłem na pomysł stworzenia zegara czasu rzeczywistego dla mojego STe.

Pierwotny pomysł zakładał inicjowanie RTC wbudowanego w kontroler klawiatury (IKBD) po każdym resecie z dołożonego modułu RTC, niestety firmware tego kontrolera nie przyjmuje lat "starszych" niż 1999. Był to "ficzer" umożliwiający np. tylko ustawienie daty bez zmieniani godziny (bajty godzin, minut, sekund >=0xA0).

Powstała więc opcja numer 2, czyli przechwytywanie żądania odczytu czasu z IKBD, a następnie maskowanie oryginalnej odpowiedzi IKBD i "wstrzykiwanie" własnej. Niewiadomą było jak TOS zareaguje na rok "0xB8"... ale okazuje się, że reaguje poprawnie. Rozwiązanie działa na TOS 1.04 - 1.62 (ale wymaga załadowania CONTROL.ACC) oraz na TOS 2.06 (tu nie trzeba robić nic, zegar z IKBD jest odczytywany przy każdym resecie). Nie działa to natomiast na TOSie 1.00 - 1.02, innych nie sprawdzałem.

Linia RX z ST do IKBD (pin 5) musi zostać przerwana, pin 5 złącza klawiatury podłączony do pinu RX0 w Arduino, pin 5 złącza ST podłączony do pinu TX1 Arduino, nasłuchiwanie poleceń wysyłanych z ST odbywa się z pinu 6 (ten pozostaje połączony z klawiaturą). Arduino retransmituje każdy bajt otrzymany z klawiatury do ST (niestety z opóźnieniem 1 bajtu ~ 1,3ms), aż do momentu gdy ST wyśle do IKBD bajt 0x1C. Wtedy Arduino przechodzi do "wstrzyknięcia" swojej daty - zamiast odbieranych z IKBD bajtów, wysyła swoje, odczytane z podtrzymywanego bateryjnie RTC.

Ustawiania dokładanego RTC jeszcze nie próbowałem, ale nie powinno być z tym problemu, bo ST prawidłowo wysyła rok np. 2003 jako 0xA3, czy 2018 jako 0xB8. Data i czas są zapisane w kodzie BCD, przy czym rok może być >0x99.

Polecenie ustawienia zegara to 0x1B, RR, MM, DD, hh, mm, ss (nie można pominąć żadnego bajtu, musi być przesłane żądanie + 6 bajtów, jeśli nie chce się zmieniać jakieś wartości, bajt należy ustawić na cokolwiek większego niż 0x99, np. 0xFF). Nie sprawdzałem ale maksymalny rok jaki można ustawić to chyba 2028.

Polecenie odczytu zegara to "0x1C", odpowiedź jest w takim samym formacie jak ustawianie (RR, MM, DD, hh, mm, ss) z nagłówkiem 0xFC.

Przykładowy kod dla Arduino (data i czas "z palca"):

#include <SoftwareSerial.h>

// software serial : RX = digital pin 10, TX = digital pin 11
SoftwareSerial Control(10, 11);
int inject = -1;
byte date[7] = {0x13, 0x42, 0x12, 0x27, 0x08, 0xB8, 0xFC};

void setup()
{

    // write your setup code here, to run once
    pinMode(LED_BUILTIN, OUTPUT);
    Serial.begin(7812);
    Control.begin(7812);
    Control.listen();

}

void loop()
{

    // write your main code here, to run repeatedly
    
    if (Control.available()) {
      if (Control.read() == 0x1C) {
        inject = 6;
        digitalWrite(LED_BUILTIN, HIGH);
      }
    }
        
    if (Serial.available()) {
                if (inject == -1)
                  Serial.write(Serial.read());
                else {
                  Serial.read();
                  Serial.write(date[inject--]);
                  if (inject== -1) digitalWrite(LED_BUILTIN, LOW);
                }
    }
}

---

Aktualizacja:
Rozwiązanie powinno działać na TOS >= 1.04.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

2 Ostatnio edytowany przez _tzok_ (2018-08-29 22:07:59)

Załączam działający kod:

/******************************************************************
 Created with PROGRAMINO IDE for Arduino - 06.08.2018 15:23:03
 Project     : Atari ST IKBD clock injector with DS3231 RTC
 Libraries   : SoftwareSerial, Wire
 Author      : tzok
 Description : ARD_RX0 from KB_5, ARD_TX1 to ST_5, ARD_D10 from/to KB/ST_6
******************************************************************/

#include <SoftwareSerial.h>
#include <Wire.h>

#define DS3231_ADDRESS (0x68)
#define DS3231_REG_TIME (0x00)

SoftwareSerial Control(10, 11);

byte cmd;
int inject = -1;
byte date[7] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC};
//                ss,   mm,   hh,   DD,   MM,   YY
byte ds3231[7];

void setup()
{
    Serial.begin(7812);
    Control.begin(7812);
    Control.listen();
    Wire.begin();
}

void loop()
{
  if (Control.available())
  {
    cmd = Control.read();
    if (cmd == 0x1C)
    {
      Wire.beginTransmission(DS3231_ADDRESS);
      Wire.write(DS3231_REG_TIME);
      Wire.endTransmission();
      Wire.requestFrom(DS3231_ADDRESS, 7);
      while(!Wire.available()) {};
      for (int i = 6; i >= 0; i--)
      {
        ds3231[i] = Wire.read();
      }
      date[5] = ds3231[0] + 0xA0; // YY
      date[4] = ds3231[1] & 0x1F; // MM
      date[3] = ds3231[2]; // DD
      date[2] = ds3231[4] & 0x1F; // hh
      date[1] = ds3231[5]; // mm
      date[0] = ds3231[6]; // ss
      inject = 6;
    }
    else if (cmd == 0x1B)
    {
      for (int i = 5; i >=0; i--)
      {
        while(!Control.available()) {};
        date[i] = Control.read();
      }
      ds3231[0] = date[5] - 0xA0; // YY
      ds3231[1] = date[4]; // MM
      ds3231[2] = date[3]; // DD
      ds3231[4] = date[2]; // hh
      ds3231[5] = date[1]; // mm
      ds3231[6] = date[0]; // ss
      Wire.beginTransmission(DS3231_ADDRESS);
      Wire.write(DS3231_REG_TIME);
      for (int i = 6; i >= 0; i--)
      {
        Wire.write(ds3231[i]);
      }
      Wire.write(DS3231_REG_TIME);
      Wire.endTransmission();
    }
  }
  if (Serial.available())
  {
    if (inject == -1)
      Serial.write(Serial.read());
    else
    {
      Serial.read();
      Serial.write(date[inject--]);
    }
  }
}

Kod działa i umożliwia zarówno "podstawianie" daty z dodatkowego, podtrzymywanego bateryjnie RTC, jak i jego ustawianie przy pomocy standardowego oprogramowania, np. CONTROL.ACC. Mankamentem rozwiązania jest wprowadzenie opóźnienie ok 1,5ms (czas transmisji 1 bajtu z prędkością 7812bps) oraz brak jakiejkolwiek obsługi błędów. Czas opóźnienia można skrócić do czasu transmisji 1 bitu, czyli ok 0,2ms. Opóźnienie dotyczy niestety nie tylko klawiatury ale również myszy i joysticków.

TOS przechowuje rok na 7 bitach, jako liczba lat po roku 1980. Zatem maksymalny rok jaki można obsłużyć to 2107. Zarówno DS3231 jak i IKBD używają formatu BCD, ale szczęśliwie TOS ma bardzo prostą formułę konwersji BCD do BIN, dzięki czemu akceptuje i poprawnie interpretuje wartości większe niż 0x99. Dla przykładu miesiąc grudzień powinien być zapisany jako 0x12, ale równie dobrze można wysłać 0x0C i też zadziała ;) Dzięki temu można przesłać np. rok 115-ty czyli 0xB5 co zostanie prawidłowo przeliczone jako rok 2015 (roku 2018 już tak nie zapiszemy, bo F to najwyższa wartość półbajtu). Na upartego ten sam rok można też zapisać jako 0xAF i też powinno zadziałać (ale nie sprawdzałem). Od tej wartości jest odejmowane 0x50 (80) i jest to przechowywane jako bajt roku w TOSie. Jak widać obliczenia nadal działają 115 - 80 = 35. Żeby odczytać rok TOS dodaje do wartości z rejestru datę początkową, tj 1980, mamy zatem 1980 + 35 = 2015.

Co jeszcze ciekawsze CONTROL.ACC domyślnie wysyła wartość 0xB8 po wpisaniu roku 18 (mimo, że oryginalny IKBD nie byłby w stanie tego obsłużyć).

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

3

Brzmi ciekawie. Pewnie będzie większy odzew jak będzie jakiś działający hardware dla userów.

What can be asserted without proof can be dismissed without proof.

4 Ostatnio edytowany przez _tzok_ (2018-08-29 22:48:18)

Raczej przewiduję to jako projekt DIY, dlatego oparłem go o Arduino. Być może zrobię kilka sztuk ale na pewno będą to "składaki" z płytki Arduino Pro Mini i modułu RTC z DS3231 i baterią -  powinny się mieścić między blaszanym ekranem, a klawiaturą. Koszt samych części to ok 35-40zł, więc żeby mi się chciało (polutować, zaprogramować, przetestować, zapakować, zanieść na pocztę) to gotowy moduł musiałby kosztować ok 80zł, a zdaję sobie sprawę, że to sporo.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

5

to hobby nie jest tanie, ja zapłaciłem za rtc od exxosa 23 funty + wysyłka, twoja cena i tak będzie niska.

Timex 2048, Atari 130XE, Atari STE, Amiga 600, SNES, Pegasus.....

6 Ostatnio edytowany przez Mq (2018-08-30 18:18:34)

Świetne rozwiązanie wymyśliłeś _tzok_
Bardzo mi się podoba.

Czy sprawdzałeś organoleptycznie jak to opóźnienie 1,5ms ma się w użytkowaniu? W przypadku joysticka jak i klawiatury pewnie nie ma problemu, bo 1,5ms to na tyle mało, że raczej nie będzie zauważalne. Natomiast przy myszy czy tam nie będzie się zapychał jakiś bufor? Pytanie czy np. przy adapterach myszy ps2, których bardzo dużo ludzi używa nie będzie jakichś jaj, trzeba by to sprawdzić, bo pamiętam, że jak się bawiłem różnymi adapterami z różnymi wersjami firmware, to ST czasem miało problem z przetworzeniem danych z adapterów, które w Amigach działały dobrze. Nie pamiętam w szczegółach, ale ST jakoś tam strasznie wolno tą mysz przetwarza.

Jak ukończysz działający już w 100% prototyp na arduino, to proponował bym Ci zastanowić się nad przełożeniem tego jednak na jakiś mały mikrokontroler. Takie przetwarzanie spokojnie da się zrobić jakimś małym Attiny, który będzie się też umiał skomunikować z zegarem. Miał byś tylko dwa małe scalaki, bateryjkę i całość na minimalnej wielkości płytce, co pewnie ładnie by się dało wkomponować do wnętrza Atari. Gdybyś potrzebował pomocy z mikrokontrolerami (dobór, programowanie, przeniesienie kodu z arduino itp.), albo z płytkami pcb (projektowanie, zamawianie itd.) to chętnie pomogę. Również gdybyś nie chciał tego robić, ale chciałbyś żeby coś takiego powstało, a projekt miał by pozostać jako otwarty diy, to mogę coś tam od siebie do projektu dołożyć bezinteresownie dla ludzi:-)

7 Ostatnio edytowany przez _tzok_ (2018-09-02 22:59:24)

Dziś odkryłem, że tym co odczytuje zegar na TOSie 1.x to nie jest CONTROL.ACC, tylko... STE_FIX.PRG i robi to pomimo tego, że mam TOS 1.62, do którego ten patch nie jest potrzebny, co komunikuje stosownym błędem.

Odświeżanie ekranu trwa 20ms, więc nie sądzę aby ktokolwiek był w stanie zauważyć te 1,5ms. Daje radę z myszką optyczną 600DPI, więc to też raczej nie jest problemem.

Prototyp jest na płytce stykowej i module Nano v3.

Docelowe Arduino Pro Mini powinno się spokojnie zmieścić w obudowie ST, ale jeśli chcesz zaprojektować płytkę to będę bardzo wdzięczny. ATMega 328P dużym scalakiem nie jest, jest mniejsza niż ATTiny85 w obudowie DIL8. Na upartego można to przenieść na Tiny88 albo Tiny2313, ale nie wiem czy miałoby to sens.

Tak wygląda działający prototyp:
https://obrazki.elektroda.pl/7355969600_1535919935_thumb.jpg

...a tak ostateczna wersja kodu:

/******************************************************************
 Created with PROGRAMINO IDE for Arduino - 06.08.2018 15:23:03
 Project     : Atari ST IKBD clock injector with DS3231 RTC
 Libraries   : SoftwareSerial, Wire
 Author      : TzOk
 Description : ARD_RX0 from KB_5, ARD_TX1 to ST_5, ARD_D10 from/to KB/ST_6
******************************************************************/

#include <SoftwareSerial.h>
#include <Wire.h>

#define DS3231_ADDRESS (0x68)
#define DS3231_REG_TIME (0x00)

SoftwareSerial Ctrl(10, 11);

byte cmd;
byte inj = 255;
byte dsDate[7];
byte stDate[7] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC};
//                ss,   mm,   hh,   DD,   MM,   YY

void setup()
{
    Serial.begin(7812);
    Ctrl.begin(7812);
    Ctrl.listen();
    Wire.begin();
}

void loop()
{
  while(true)
  {
    if (Ctrl.available())
    {
      cmd = Ctrl.read();
      if (cmd == 0x1C)
      {
        Wire.beginTransmission(DS3231_ADDRESS);
        Wire.write(DS3231_REG_TIME);
        Wire.endTransmission();
        Wire.requestFrom(DS3231_ADDRESS, 7);
        while(!Wire.available()) {};
        for (byte i = 6; i < 255; i--)
        {
          dsDate[i] = Wire.read();
        }
        stDate[5] = (dsDate[0] < 0x80)? dsDate[0] + 0xA0 : dsDate[0]; // YY
        stDate[4] = dsDate[1] & 0x1F; // MM
        stDate[3] = dsDate[2]; // DD
        stDate[2] = dsDate[4] & 0x3F; // hh
        stDate[1] = dsDate[5]; // mm
        stDate[0] = dsDate[6]; // ss
        inj = 6;
      }
      else if (cmd == 0x1B)
      {
        for (byte i = 5; i < 255; i--)
        {
          while(!Ctrl.available()) {};
          stDate[i] = Ctrl.read();
        }
        dsDate[0] = (stDate[5] < 0xA0 ) ? stDate[5] : stDate[5] - 0xA0; // YY
        dsDate[1] = stDate[4]; // MM
        dsDate[2] = stDate[3]; // DD
        dsDate[4] = stDate[2]; // hh
        dsDate[5] = stDate[1]; // mm
        dsDate[6] = stDate[0]; // ss
        Wire.beginTransmission(DS3231_ADDRESS);
        Wire.write(DS3231_REG_TIME);
        for (byte i = 6; i < 255; i--)
        {
          Wire.write(dsDate[i]);
        }
        Wire.endTransmission();
      }
    }
    if (Serial.available())
    {
      if (inj == 255)
        Serial.write(Serial.read());
      else
      {
        Serial.read();
        Serial.write(stDate[inj--]);
      }
    }
  }
}

Trik z pętlą while(true) wewnątrz arduinowego loop() eliminuje znakomitą część kodu "dorzucaną" przez Arduino po każdym przejściu pętli głównej programu. Kod ten (SerialEvent) jest odpowiedzialny za obsługę zdarzeń portu szeregowego, z których nie korzystam. Oczywiście ideałem byłoby to przepisać na "czyste" avr-gcc.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

8

Tak w sumie patrzę sobie teraz na ten kod i na tą płytkę mini arduino i w zasadzie jak to ma być w kilku sztukach robione jako diy, to może nawet i lepiej że to jest na arduino? Takie Arduino Pro Mini, to na aliexpress można kupić za dwa dolce, to u nas samego tiny czy tam mega za tyle nie kupisz. Tak samo ten RTC za dolca się dostanie. I masz wszystko już polutowane i złożone, w zasadzie musisz połączyć dwie płytki ze sobą i spiąć z Atari. Masz też rację, że to jest malutkie, z drugiej strony gdyby zrobić pod to płytkę, to wiele osób będzie miało problem z polutowaniem małego avr w smd. Przy rozwiązaniu z Arduino odpada też konieczność posiadania programatora. Ogólnie do takiego diy to chyba jednak skłaniam się przyznać Ci rację, że w tym przypadku to może być dobre rozwiązanie. W dzisiejszych czasach, to może i racja, żeby wybierać do takich rozwiązań gotowe płytki, bo przecież to upraszcza mocno sprawę i zdejmuje połowę roboty z głowy.
Moja propozycja jest taka, że jak masz to już tak działające, to ewentualnie skup się tylko na ustawieniu pinów tak, żeby w miarę możliwości dało się bez kabli samymi goldpinami spiąć dwie płytki razem, wypuść rysunek jak to spinać i ostateczny kod i kto będzie chciał to sobie zrobi. Projekt w takiej formie dobrze się nadaje do diy.
Sam chętnie zrobię dla siebie na tym Arduino Pro Mini w takiej formie, a jak będę miał tak działające u siebie już gotowe, to mogę kiedyś tam później zrobić pod to płytkę jeśli będzie to miało w ogóle jakiś sens...

9 Ostatnio edytowany przez _tzok_ (2018-09-03 11:19:19)

Przeanalizowałem kod Arduino i doszedłem do wniosku, że ten SerialEvent nie jest taki zły, różnica w czasie przejścia pętli programu względem wersji z while() i z prawidłowo użytym SerialEvent() wynosi 3 us... zatem kod "po Arduinowemu":

/******************************************************************
 Created with PROGRAMINO IDE for Arduino - 06.08.2018 15:23:03
 Project     : Atari ST IKBD clock injector with DS3231 RTC
 Libraries   : SoftwareSerial, Wire
 Author      : TzOk
 Description : ARD_RX0 from KB_5, ARD_TX1 to ST_5, ARD_D10 from/to KB/ST_6
******************************************************************/

#include <SoftwareSerial.h>
#include <Wire.h>

#define DS3231_ADDRESS (0x68)
#define DS3231_REG_TIME (0x00)

SoftwareSerial Ctrl(10, 11);

byte cmd;
byte inj = 255;
byte dsDate[7];
byte stDate[7] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC};
//                ss,   mm,   hh,   DD,   MM,   YY

void setup()
{
  Serial.begin(7812);
  Ctrl.begin(7812);
  Ctrl.listen();
  Wire.begin();
}

void loop()
{
  if (Ctrl.available())
  {
    cmd = Ctrl.read();
    if (cmd == 0x1C) // Read RTC
    {
      Wire.beginTransmission(DS3231_ADDRESS);
      Wire.write(DS3231_REG_TIME);
      Wire.endTransmission();
      Wire.requestFrom(DS3231_ADDRESS, 7);
      while(!Wire.available()) {};
      for (byte i = 6; i < 255; i--)
      {
        dsDate[i] = Wire.read();
      }
      stDate[5] = (dsDate[1] & 0x80) ? dsDate[0] + 0xA0 : dsDate[0]; // YY : if CENTURY bit is SET => stDate = dsDate + 100
      stDate[4] = dsDate[1] & 0x1F; // MM
      stDate[3] = dsDate[2]; // DD
      stDate[2] = dsDate[4] & 0x3F; // hh
      stDate[1] = dsDate[5]; // mm
      stDate[0] = dsDate[6]; // ss
      inj = 6;
    }
    else if (cmd == 0x1B) // Set RTC
    {
      for (byte i = 5; i < 255; i--)
      {
        while(!Ctrl.available()) {};
        stDate[i] = Ctrl.read();
      }
      dsDate[0] = (stDate[5] < 0xA0) ? stDate[5] : stDate[5] - 0xA0; // YY : if stDate > 99 => dsDate = stDate - 100
      dsDate[1] = (stDate[5] < 0xA0) ? stDate[4] : stDate[4] + 0x80; // MM : if stDate > 99 => set CENTURY bit
      dsDate[2] = stDate[3]; // DD
      dsDate[3] = 0x01; // Day of Week : don't care, any valid value 1-7 will be ok`
      dsDate[4] = stDate[2]; // hh
      dsDate[5] = stDate[1]; // mm
      dsDate[6] = stDate[0]; // ss
      Wire.beginTransmission(DS3231_ADDRESS);
      Wire.write(DS3231_REG_TIME);
      for (byte i = 6; i < 255; i--)
      {
        Wire.write(dsDate[i]);
      }
      Wire.endTransmission();
    }
  }
}

void serialEvent() {
  if (inj == 255)
    Serial.write(Serial.read());
  else
  {
    Serial.read();
    Serial.write(stDate[inj--]);
  }
}

Był jeszcze kod bez buforowania, ale nie trzyma timingów i traci synchronizację (nie wspominając o tym, że podczas komunikacji z DS przerywa transmisję IKBD -> ST). Jego zaletą było opóźnienie na poziomie 0,2ms w trakcie normalnej pracy (kiedy nie ma komunikacji na linii ST -> IKBD). Może kiedyś do niego wrócę, ale ten wydaje mi się być wystarczająco dobry.

Pinów niestety ustawić się specjalnie nie da, bo komunikacja z DS idzie po hardware'owym i2c, a ten ma przypisane konkretne piny. Przy poborze prądu na poziomie 300uA spokojnie można by zasilać cały moduł RTC z pinów GPIO, ale niestety piny A4/A5 (SDA/SCL są tak umiejscowione w Pro Mini, że nie obejdzie się bez kabelków).

Na razie czekam na przesyłkę małych płytek z DS3231 (niby dedykowanych do RPI1). Pierwsze 2 z PL, kolejna partia z ChRL.

Niestety w związku z tym, że STE_FIX działa tylko na STe, z TOSów 1.x działa to tylko z 1.06 i 1.62.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

10

Od prototypu:
https://obrazki.elektroda.pl/3922836500_1536065032_thumb.jpg

Do gotowego modułu:
https://obrazki.elektroda.pl/8165213200_1536065036_thumb.jpg https://obrazki.elektroda.pl/2757590500_1536065030_thumb.jpg

... zainstalowanego w komputerze (w tym miejscu się nie mieści, bo trafia pod procesor klawiatury, musi być bliżej złącza klawiatury na płycie, trzeba zawinąć kable):
https://obrazki.elektroda.pl/7399977500_1536065051_thumb.jpg

Ostatecznie użyłem modułu Nano V3, zamiast Mini Pro ze względu na łatwiejszy update firmware. Moduł DS3231 zasilam z pinu A3 (17), kolejny pin (A4) to SDA i A5 to SCL, tak więc prawie udało się dopasować DS3231 for PI do Nano V3, niestety pin A7 nie może pełnić funkcji masy i trzeba było dolutować kabelek. Przewody przeciąłem w złym miejscu, bo na środku, a teraz widzę, że część idąca do płyty powinna być krótsza, a do klawiatury dłuższa. To na szczęście nie jest wielki problem - na styk, bo na styk ale mieści się na ekranie pod klawiaturą. Pierwotnie chciałem go włożyć pod ekran albo pod stację dyskietek, ale okazało się, że nie ma takiej potrzeby. Niestety żeby sie zmieścił musiałem usunąć oryginalne gniazdo goldpin z modułu DS3231 for PI i zastąpić go goldpinami. Także jest to polutowane na stałe. Całość jest zabezpieczona przezroczystą termokurczką.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

11

Łeee, no klasa:-) Super to wyszło, gratuluję _tzok_ fajnego ukończonego projektu.

Czy w takiej formie jak to teraz opisałeś, to jest gotowiec ostateczny dla diy? Pytam w sensie, czy jak zamówię sobie Nano V3 i DS3231, to już wszystko czego potrzebuję, wrzucam ostatnią wersję kodu, który załączałeś powyżej i działa?

12 Ostatnio edytowany przez _tzok_ (2018-09-09 19:28:39)

Jeśli chcesz zasilać DS'a z pinu 17 (A3) to w funkcji setup trzeba na początku dodać:

pinMode(17, OUTPUT);
digitalWrite(17, HIGH);

No i jak pisałem, z oryginalnym złączem, które jest w płytkach "DS3231 for PI" w tym miejscu się nie zmieści (chyba, że ktoś nie ma blach ekranujących). Poza tym, większych przeróbek nie było. Dla wygody przeniosłem Rx i Tx programowego seriala (Ctrl) na piny 5 i 6, bo tak było wygodniej podłączyć, czyli:

SoftwareSerial Ctrl(5, 6);

zamiast

SoftwareSerial Ctrl(10, 11);
Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

13

świetny projekt _tzok_.
Przyłączam się do pytania Mq.

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

14

Na pytanie Mq chyba odpowiedziałem - tak to ostateczny kod, z ew. zmianami opisanymi powyżej.
Potrzebujesz: Arduino Nano V3, DS3231 For PI, 8-żyłową taśmę z końcówkami goldpin - z jednej strony wtyki (M), z drugiej gniazda (F) i kawałek termokurczki lub taśmy izolacyjnej.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

15 Ostatnio edytowany przez _tzok_ (2018-09-11 18:11:46)

Kolejny update:

Zegar działa w każdym STf(m) i STe, niezależnie od wersji TOSu:
* dla STf(m) z TOS 1.00 - 1.04 potrzebny jest ST Control Panel (CONTROL.ACC), Panel jest używany zarówno do synchronizacji Zegara ST z Zegarem IKBD podczas restartu oraz do regulacji zegara,
* dla STe z TOS 1.06/1.62 potrzebny jest STE_FIX.PRG oraz STE Control Panel (CONTROL.ACC), STE_FIX jest używany do synchronizacji Zegara ST z Zegarem IKBD podczas restartu, natomiast Panel jest używany do regulacji zegara,
* dla STe z TOS 2.06 potrzebny jest XControl (XCONTROL.ACC), synchronizacja Zegara ST z Zegarem IKBD podczas restartu jest wykonywana przez sam TOS, Panel jest używany tylko do regulacji zegara.

Są jacyś chętni?

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

16 Ostatnio edytowany przez micromax (2018-09-11 23:34:48)

cena?

Timex 2048, Atari 130XE, Atari STE, Amiga 600, SNES, Pegasus.....

Zależy od ceny, ale kilka sztuk bym pewnie wziął.

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

18

ja też bym się pisał

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

19

Też bym zanabył, zależnie od ceny :)

Atari Falcon 030 CT60e, Jaguar, Lynx II, MSTE + Nova + ET4000, STe + HDD, STFM, 65XE, 800XE, 800XL, Amiga 1200, 600, 500, CDTV

20

Jeśli cena będzie osiągalna, to mam zapotrzebowanie na 1-2 sztuki.

Pamięć studenta ma charakter kwantowy - student wie wszystko, ale jednocześnie nic nie pamięta.
- Kilka(naście?) pudełek z klawiszami i światełkami. I jeden Vectrex, żeby nimi wszystkimi rządzić.

21 Ostatnio edytowany przez _tzok_ (2018-09-12 21:19:32)

Jak pisałem projekt był przewidziany jako DIY. Mam bardzo ograniczone możliwości czasowe. Cena jaką proponuję za zmontowany moduł to 80zł + przesyłka, ale ze względu na ograniczone możliwości "produkcyjne" tylko 1 szt. na osobę. Na razie idą części z Chin na 5 sztuk. Za ok 1 m-ca powinienem je mieć u siebie. Jeśli komuś bardzo zależy na czasie to mogę zrobić na częściach z polskiej dystrybucji ale wtedy cena będzie 100zł + przesyłka i czas realizacji ok 2 tygodnie.

Petari (Peter Putnik) wkrótce powinien mieć spatchowany TOS 1.06 i 1.62 z obsługą zegara IKBD. W/g tego co mi napisał, obsługa tego zegara jest w tych TOSach ale z powodu błędu, nigdy go nie odczytują. Z jego poprawionym TOSem mój zegar powinien działać bez żadnego oprogramowania, podobnie jak na TOSie 2.06.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

No to ja wezmę 1 sztukę, a moje ego dodatkową 1 sztukę (poczekamy na chińskie części) :D

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

23

_tzok_ napisał/a:

* dla STe z TOS 1.06/1.62 potrzebny jest STE_FIX.PRG oraz STE Control Panel (CONTROL.ACC), STE_FIX jest używany do synchronizacji Zegara ST z Zegarem IKBD podczas restartu, natomiast Panel jest używany do regulacji zegara,

Mam pytanie o ten STE_FIX.PRG. Poczytałem trochę w necie i z tego co wyczytałem jest to fix bugów związanych z rozdzielczościami w TOS 1.06, natomiast fix ten jest już zaaplikowany ponoć w TOS-ie 1.62. A pytanie jest przede wszystkim o to, czy oprócz tych opisanych wszędzie poprawek związanych z rozdzielczościami, robi ten fix coś jeszcze, że ma związek z zegarem, bo nigdzie nie znalazłem takich informacji?

24

biorę sztukę

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

25 Ostatnio edytowany przez _tzok_ (2018-09-13 14:37:25)

Mq napisał/a:

Mam pytanie o ten STE_FIX.PRG. Poczytałem trochę w necie i z tego co wyczytałem jest to fix bugów związanych z rozdzielczościami w TOS 1.06, natomiast fix ten jest już zaaplikowany ponoć w TOS-ie 1.62. A pytanie jest przede wszystkim o to, czy oprócz tych opisanych wszędzie poprawek związanych z rozdzielczościami, robi ten fix coś jeszcze, że ma związek z zegarem, bo nigdzie nie znalazłem takich informacji?

Też nigdzie nie znalazłem tej informacji, ale doświadczalnie sprawdziłem, że na TOS 1.62 mimo wyświetlenia błędu mówiącego, że dla tej wersji TOS jest niepotrzebny powoduje on zsynchronizowanie zegara TOS z zegarem IKBD.

Jeszcze tylko potwierdzenie opóźnienia wprowadzanego przez układ (oczywiście w czasie odczytu z DS3231 opóźnienie będzie większe):
https://obrazki.elektroda.pl/2987837900_1536845832_thumb.jpg

Osoby chętne do zakupu gotowego modułu proszę o kontakt na PW z informacją czy czekają na dostawę części z Chin czy chcą szybciej ale drożej.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.