[CA80] Obsługa magnetofonu.

Kącik dla elektroniki retro - układy, urządzenia, podzespoły, literatura itp.
Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

[CA80] Obsługa magnetofonu.

Postautor: Zegar » piątek 01 lis 2019, 13:35

Dzień dobry.

Od jakiegoś czasu myślę o obsłudze magnetofonu w CA80. Prawie pół kilobajta zapomnianego, nikomu niepotrzebnego kodu i trzy a nawet cztery polecenia systemowe do wykorzystania. Jednak szkoda trochę pracy pana Gardynika, bo włożył w to kawałek swego życia. Może warto się jeszcze raz zastanowić...?
Poczytałem, przemyślałem i podjąłem decyzję: kod pozostaje bez zmian ale zacznie być potrzebny wręcz niezbędny do dalszej pracy.
Co można zrobić? Najprościej będzie wyrzucić zbędny układ wzmacniacza sygnału z magnetofonu i modulator sygnału zapisu na magnetofon czyli prawie nic, bo po prostu układy te nie były zmontowane. :-) UCY74123 jest, bo generuje sygnał brzęczyka, więc odcinamy tylko go od PA7, które połączymy bezpośrednio z ZA4 a PC4 połączymy z ZA3. W ten sposób na złączu mamy sygnały cyfrowe, które łatwo można wykorzystać.
Jak widać na powyższym obrazku, sygnał jest niesymetryczny - zero znacznie dłuższe od jedynki (nie mówię o dwóch bitach stopu, ale o połówce normalnego bitu). Zgodnie z opisem w MIK05 jedynka tworzona jest przez czas siedemnastu z dwudziestu próbek przypadających na pół bitu. Dlatego następne zero trwa dwadzieścia trzy próbki. "Doświadczalnie stwierdzono..." często możemy przeczytać w serii MIK. Pozostałe trzy próbki są uzupełniane w czasie odczytu przez 74123, który właśnie został wyrzucony. Nie jest to żaden problem, po prostu sygnał który podamy na wejście będzie symetryczny i już. Nawet łatwiej taki wygenerować.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » piątek 01 lis 2019, 13:40

Wystarczy użyć cokolwiek, co ma jakiś timer generujący przerwania. Pod ręką było Arduino, więc szybki programik i już działa. Najtrudniej było z sumą kontrolną, bo CA80 wyrzucał "Err". Ale analiza sygnału od końca dała rozwiązanie. Szybciej bym je znalazł, gdybym poczytał o rozkazie CPL...

Mam już generator rekordu EOF, pozostało dopisać kilka procedur do tworzenia rekordu danych i gotowe. Program do wklepywania plików HEX już dawno napisałem. Trzeba tylko połączyć go z nowym i stworzyć jakiś system plików.
Planuję dopisać program odczytu danych z CA80, który sam okteśli stałą czasową dla timera. Sterowanie całym urządzeniem można zrobić za pomocą zapisu rekordu EOF. CA wysyła ten rekord, Arduino najpierw określa szybkość transmisji, potem odczytuje nazwę pliku np. "AA", a następnie odczytuje plik z SD i wysyła go na złącze magnetofonowe. Można jeszcze utworzyć dodatkowy plik tekstowy z długością danych i adresem wejścia do programu. Wtedy moglibyśmy utworzyć rekord EOF i nie musielibyśmy tworzyć rekordów danych szesnastobajtowych, ale dłuższe (do 255 bajtów) co znacznie skróciłoby czas transmisji (każdy rekord ma 32 bajty startowe przy standardowej szybkości ok. 2 sekundy).

Zostało jeszcze trochę do zrobienia, ale już dziś się chwalę, bo nie wiadomo kiedy dokończę całość. Ale obiecuję, że się postaram. Chyba że ktoś ma lepszy pomysł...
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » piątek 01 lis 2019, 13:49

"Doświadczalnie stwierdzono..." trzeba wykuć na blachę! Zmieniłem w programie ilość zer synchronizacji na 8 i nadal działa! Dwa też wystarczą!! Prawdopodobnie tyle było potrzebne do ustawiania taśmy w magnetofonie... I pomyśleć, że tyle swego młodzieńczego czasu człowiek tracił oczekując na wczytanie programu...
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
tasza
Expert
Expert
Posty: 988
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [CA80] Obsługa magnetofonu.

Postautor: tasza » piątek 01 lis 2019, 14:12

No proszę, pomysł zacny, tym bardziej że nie będzie wymagał modyfikacji systemowego ROM i skorzysta z gotowych zleceń, oby.
W sumie to mógłby powstać taki `cyfrowy magnetofonik` z kartą SD i małym wyświetlaczem choćby na SSD1306, myślę że nawet w Nano to dałoby radę jakoś upchnąć.

ps
Dla zaciekawionych tematem - skany MIK05 (i reszty kniżek) krążą w sieci, na Elce też są, warto przeglądnąć.
Opis współpracy z magnetofonem to rozdział 1.9, od strony 56.
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » piątek 01 lis 2019, 14:22

Obsługę RS232 ktoś już zrobił ;-) , więc musiałem wymyślić coś innego. Mam nadzieję, że teraz szybko pójdzie. Wieczory coraz dłuższe...
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
tasza
Expert
Expert
Posty: 988
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [CA80] Obsługa magnetofonu.

Postautor: tasza » piątek 01 lis 2019, 14:44

Nie śmiem się tu wcinać między wódkę i zakąskę, ale czy nie byłoby fajniej (bardziej zgodnie z oryginałem) aby jednak w CA80 pozostawić firmowe rozwiązanie toru analogowego, ten kluczowany brzęczyk do nagrywania i LM741 (ewentualnie podmieniony na coś, co można zasilać unipolarnie) z przerzutnikiem na odczycie? A dorobić komplementarny układ przy Adru czy cokolwiek tam będzie udawać magnetofon? Narzut niewielki, ograniczeń to nie wprowadza a tak mamy CA80 gotowe do pracy z prawdziwym kaseciakiem jak i ... udawanym po nowemu. Ale to tylko sugestia drobna...
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
ZbeeGin
User
User
Posty: 344
Rejestracja: sobota 08 lip 2017, 17:16
Lokalizacja: GOP
Kontaktowanie:

Re: [CA80] Obsługa magnetofonu.

Postautor: ZbeeGin » piątek 01 lis 2019, 15:39

tasza pisze:W sumie to mógłby powstać taki `cyfrowy magnetofonik` z kartą SD i małym wyświetlaczem choćby na SSD1306, myślę że nawet w Nano to dałoby radę jakoś upchnąć.

Życzenie Pani stało się rozkazem... :D
https://allegro.pl/oferta/tzx-duino-wre ... 8019853734

Sam format TZX jest dość elastyczny i podobno - nie sprawdzałem tego - potrafi wiernie zapisać "obraz" taśmy. Można by spróbować go wykorzystać.

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » piątek 01 lis 2019, 15:53

tasza pisze:Nie śmiem się tu wcinać między wódkę i zakąskę, ale czy nie byłoby fajniej (bardziej zgodnie z oryginałem) aby jednak w CA80 pozostawić firmowe rozwiązanie toru analogowego, ten kluczowany brzęczyk do nagrywania i LM741 (ewentualnie podmieniony na coś, co można zasilać unipolarnie) z przerzutnikiem na odczycie? A dorobić komplementarny układ przy Adru czy cokolwiek tam będzie udawać magnetofon? Narzut niewielki, ograniczeń to nie wprowadza a tak mamy CA80 gotowe do pracy z prawdziwym kaseciakiem jak i ... udawanym po nowemu. Ale to tylko sugestia drobna...

Ależ bardzo proszę. Można np. timer2 ustawić na 3,5 kHz i potem zmiksować wyjścia i gotowe. W drugą stronę nie wiem. Myślałem o przetestowaniu większych szybkości transmisji, a wtedy 74123 psułby sygnał. Jest tam ustawione ok. 0.3 ms... Co do kształtu ostatecznego rozwiązania - wszystko przed nami. Może być wyświetlacz. Myślałem początkowo o zautomatyzowaniu procesu wczytywania. CA wysyła rekord EOF, Ardu wklepuje zlecenie *6 zdalną klawiaturą i wysyła dane. Wtedy "magnetofonik" nie potrzebuje nawet żadnej lampki. Zobaczymy co przyniesie czas. :-)
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » sobota 02 lis 2019, 00:37

Nie byłbym sobą, gdybym nowej zabawki nie użył do ustawienia czasu w CA80!
Trochę mi to zajęło, ale działa.
Magnetofonik.jpg

CA80_magnetofon_czas_ino.txt

CA80_mag_ESP_czas_ino.txt

https://filmy.elektroda.pl/86_1572651188.mp4
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony wtorek 12 lis 2019, 19:48 przez Zegar, łącznie zmieniany 1 raz.
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
tasza
Expert
Expert
Posty: 988
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [CA80] Obsługa magnetofonu.

Postautor: tasza » sobota 02 lis 2019, 07:34

Pozwolę sobie uzupełnić media o drobny komentarz...
Ładowanie danych zleceniem *6 przypomina w sumie odbieranie ramki w IntelHex - pobierany jest adres startowy, długość bloku danych no i oczywiście same dane. Ustawiając adres startowy bloku na 0xFFC6 (milisekundy) trafiamy w obszar zegara czasu rzeczywistego, zapisując tam osiem kolejnych bajtów - faktycznie ustawiamy zegarek. Potem płytka wysyła co CA80 rekord EOF, który (powiedzmy że podobnie jak w IntelHex) ustawia automatyczny punkt wejścia do programu użytkownika. W tym wypadku jest to adres 0x02C9 czyli... zlecenie M0 programu monitora, dostępne jako *0 z poziomu pętli głównej MIK-a. To poresztą widać na filmiku, po załadowaniu rekordu przeglądane są rejestry zleceniem *F, w tym zleceniu po wciśnięciu klawisza [G] prezentowany jest rejestr PC użytkownika i ma wzmiankowaną wartość 02c9. Mając tak załadowane dane, z pętli głównej MIK-a można wykonać [G][=] jak i [0] - oba przejdą do prezentacji bieżącego czasu. I znowu się rozgadałam....
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » sobota 02 lis 2019, 09:45

tasza pisze:Pozwolę sobie uzupełnić media o drobny komentarz...
Ładowanie danych zleceniem *6 przypomina w sumie odbieranie ramki w IntelHex....

Słuszne spostrzeżenie, jednak nie jest tak prosto. Mamy dwie sumy kontrolne (brrr...) i trzeba je jakoś policzyć. Z początku myślałem, że pójdzie z HEX jeden do jednego. Ale bez tego byłoby zbyt łatwo. :-)
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
tasza
Expert
Expert
Posty: 988
Rejestracja: czwartek 12 sty 2017, 10:24
Kontaktowanie:

Re: [CA80] Obsługa magnetofonu.

Postautor: tasza » sobota 02 lis 2019, 22:45

Aż swój nowszy CA80 wyciągnęłam z pudełka, w nim mam wyregulowany układ do magnetofonu, no i proszę:

Audacity nagrywa do mp3 programik testowy od 0xC000, to zlecenie *4, potem nagrywa EOF, zlecenie *5

https://youtu.be/xWMbpoV7SRg

zlecenie *6, odtwarzanie mp3 via VLC, widać jak ładuje się program, po wczytaniu EOF zgłasza się monitor

https://youtu.be/PsntElDiOn4

ponownie zlecenie *6, odtwarzanie via Audacity ale z fałszywą nazwą, widać adresy rekordów, ale nie następuje wczytywanie, dalej na zoom można pooglądać preambułę (rozbiegówkę) zapisu na taśmę oraz kolejne paczki bziaknięć - czyli zakodowane Manchesterem bity danych, nośna ma 3kHz

https://youtu.be/sLItpue-9uc

W sumie to wydaje się realne napisanie programu, który by plik w IntelHex wypiskał przez PulseAudio czy ALSA na słuchawki....
______________________________________________ ____ ___ __ _ _ _ _
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » wtorek 12 lis 2019, 14:28

Mimo że temat magnetofonu został brawurowo zdobyty przez Taszę, postanowiłem kontynuować dłubanie.
Pan Gardynik przewidział możliwość zmiany szybkości zapisu i odczytu z magnetofonu. Prawdopodobnie do generowania sygnału nie użył przerwań, ponieważ zakładał, że nie wszyscy od razu będą mieli CTC - takie były realia. Opóźnienia to pętle dekrementujące stałą MAGSP ustawianą zleceniem *7(dwie pierwsze cyfry, pozostałe to długość rekordu). Domyślna wartość to 25H dająca około 140 bitów na sekundę. Dopisałem procedury określające długość transmisji jednego bitu i przetestowałem na obiekcie. Niestety mój algorytm generuje jedynki i zera o tej samej długości, co przy standardowej szybkości wystarcza, jednak zarówno przy wolniejszym, jak i szybszym zapisie nie zawsze. Program działa w zakresie od 1dH do 30H, a według MIK05 powinien od 15H (240 b/s) do 35H (100 b/s). Nie mam przy sobie najstarszego egzemplarza, więc nie mogę go przetestować (clk = 2,5 MHz), więc popracuję nad uzyskaniem sygnału bardziej zbliżonego do oryginału. Inicjowanie transmisji przez CA80 wysłaniem rekordu EOF (zlecenie *5) umożliwia ustawienie szybkości transmisji zgodnej z aktualnym parametrem MAGSP.
https://youtu.be/xVXWUTK6n3o
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » środa 13 lis 2019, 13:48

Trochę się wczoraj zagalopowałem...
Okazało się, że testowałem odporność kodu Pana Gardynika na nierówną pracę napędu magnetofonu... Mój program działał ciągle tak samo, a mimo różnych ustawień MAGSP, dane nadal się wczytywały. ;-) Tylko przy dużej różnicy ustawionej szybkości, transmisja nie działała. Zastanawiające było, że zarówno przy dużej jak i małej wartości MAGSP. No i znalazłem błąd, a nawet błędy. Wszystkie były w jednej funkcji na samym końcu programu. Aż wstyd się przyznać...

Kod: Zaznacz cały

void ustawSzybkoscZapisu()
{
  int timeBitMin = 30000; //tutaj byl blad
  for (int x = 0; x < 8; x++)
  {
    while (!magOdczyt) {} //czekaj na pomiar
    if (t < timeBitMin) timeBitMin = t;
    magOdczyt = false;  // tego brakowalo
  }
  deactivateInterrupt0();
  periodMagBit = timeBitMin / 2; //tutaj byl blad 
}

Teraz działa zgodnie z założeniami. Przetestowałem w zakresie MAGSP = 0CH do 45H. Przy 0CH jest naprawdę szybko!
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » czwartek 14 lis 2019, 00:02

Niestety dzień się kończy, a pracy ciągle zbyt dużo...
Uruchomiłem częściowo program przesyłania plików HEX drogą magnetofonową. Niestety znowu coś pomieszałem, bo działa tylko z prędkością standardową (MAGSP = 25). :-( Jutro praca, więc poszukam błędów w sobotę. https://youtu.be/muQpkiJmlIQ
CA80_magnetofon_klawiatura_INO.txt

Kod: Zaznacz cały

/*************************************************************************
             Tworzenie sygnalu magnetofonowego z pliku HEX na SD
*************************************************************************/

void send_SD_HEX()
{
  Wkey = 0;
  nazwa = 0xaa;
  czaruj();
  myFile = SD.open("CA80.HEX");
  if (myFile)
  {
    digitalWrite(fileOpenLED, 1);
    send32nul();  // 32 zera synchronizacji
    // read from the file until there's nothing else in it:
    while (myFile.available())
    {
      byte c = (myFile.read());
      if (c  == 0x3a)
      {
        sendRecord();
      }
      else
      {
        digitalWrite(errorLED, 1);
        //Serial.println("error: wrong format CA80.HEX");
      }
    }
    // close the file:
    myFile.close();
    digitalWrite(fileOpenLED, 0);
  }
  else
  {
    digitalWrite(errorLED, 1);
    // if the file didn't open, print an error:
    //Serial.println("error opening CA80.HEX");
  }
}

void sendRecord()
{
  sendByte(zprL); // znacznik początku rekordu
  sendByte(zprH);
  if (myFile.available())
  {
    byte i = getByteFromFile();
    byte adrh = getByteFromFile();
    byte adrl = getByteFromFile();
    byte typ = getByteFromFile();
    sumN = 0;
    sendByte(nazwa);    // nazwa
    sendByte(i);  // dlugosc bloku danych
    sendByte(adrl);  // adres
    sendByte(adrh);
    sendByte(0x100 - sumN); // "zanegowana" suma kontrolna
    sumN = 0;   //suma kontrolna bloku danych
    if (typ == 0)
    {
      for (int x = 0; x < i; x++)
      {
        byte b = getByteFromFile();
        sendByte (b);
      }
      sendByte(0x100 - sumN); // "zanegowana" suma kontrolna bloku danych
    }
    else
    {
      //Serial.println("Koniec pliku CA80.HEX");
      while (myFile.available())
        byte c = (myFile.read());
      sendEOF(nazwa);
      enableKbd();
      return;
    }
    byte suma = getByteFromFile(); // zakladam, ze plik jest poprawny i nie sprawdzam sumy
    // ale trzeba ja przeczytac!!!
    myFile.read();   // tak jak znaki CR
    myFile.read();   // i LF na koncu rekordu :-)
  }
}


byte getByteFromFile()
{
  byte h, l;
  if (myFile.available())
  {
    h = myFile.read();
    h = h - 0x30;
    if (h > 0x09)
    {
      h = h - 0x07;
    }
  }
  if (myFile.available())
  {
    l = myFile.read();
    l = l - 0x30;
    if (l > 0x09)
    {
      l = l - 0x07;
    }
  }
  return ((16 * h) + l);
}

To jest najważniejszy fragment kodu... Muszę nauczyć się dzielić program na części, bo zaczynam się gubić. A może już się zgubiłem?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » sobota 16 lis 2019, 13:19

Dzień dobry!

Nie rzucam słów na wiatr. :-)
Przemyślałem program i poprawiłem. Nie chciało mi się mierzyć czasów potrzebnych do wykonania poszczególnych fragmentów, ale prawdopodobnie odczytanie kolejnych bajtów danych trwało zbyt długo i zakłócało pracę generatora sygnału. Początkowo myślałem o przeczytaniu całego pliku i przetwarzanie w RAM, ale ograniczałoby to długość przesyłanego pliku. (ATMEGA328 ma tylko 2 kB RAM). Można zmienić mikrokontroler, ale po co. Pan Gardynik napisał, że Manchester jest samosynchronizujący, więc wierząc na słowo, wykorzystałem tę właściwość. Odczytuję pojedyncze rekordy, a potem wysyłam osiem bajtów synchronizacji (doświadczalnie stwierdzono, że wystarczą dwa ;-)). Przetestowałem transmisję dla różnych wartości MAGSP i efekt jest lepszy niż się spodziewałem. Dopiero MAGSP = 5 powoduje brak transmisji. Na filmiku (przepraszam za poruszanie telefonem, ale nie mam do niego uchwytu) widać różnicę w szybkości przesyłania danych. Jeszcze jej nie zmierzyłem. Może jutro?

Kod: Zaznacz cały

/*************************************************************************
             Tworzenie sygnalu magnetofonowego z pliku HEX na SD
*************************************************************************/

void send_SD_HEX()
{
  Wkey = 0;
  nazwa = 0xaa;
  czaruj();
  myFile = SD.open("CA80.HEX"); //Na razie stala nazwa pliku :-( do zrobienia!!!
  if (myFile)
  {
    digitalWrite(fileOpenLED, 1);
    while (myFile.available())
    {
      byte c = (myFile.read());
      if (c  == 0x3a)
      {
        sendRecord();
      }
      else
      {
        digitalWrite(errorLED, 1);
        //Serial.println("error: wrong format CA80.HEX");
      }
    }
    myFile.close();
    digitalWrite(fileOpenLED, 0);
  }
  else
  {
    digitalWrite(errorLED, 1);
    //Serial.println("error opening CA80.HEX");
  }
}

void sendRecord()
{
  if (myFile.available())
  {
    byte i = getByteFromFile();
    byte adrh = getByteFromFile();
    byte adrl = getByteFromFile();
    byte typ = getByteFromFile();
    byte d[i];
    if (typ == 0)
    {
      for (int x = 0; x < i; x++)
      {
        d[i] = getByteFromFile();
      }
    }
    else
    {
      //Serial.println("Koniec pliku CA80.HEX");
      while (myFile.available())  //odczytujemy zbedna reszte pliku
        byte c = (myFile.read());
      adrWL = 0x00; // bedzie wpisane do PC uzytkownika
      adrWH = 0xc0;  // zlecenie *G [=]
      sendEOF(nazwa);
      enableKbd();
      return;
    }
    send32nul();  // 32 zera synchronizacji
    sendByte(zprL); // znacznik początku rekordu
    sendByte(zprH);
    sumN = 0;
    sendByte(nazwa);    // nazwa
    sendByte(i);  // dlugosc bloku danych
    sendByte(adrl);  // adres
    sendByte(adrh);
    sendByte(0x100 - sumN); // "zanegowana" suma kontrolna naglowka
    sumN = 0;   //suma kontrolna bloku danych
    for (int x = 0; x < i; x++)   
      sendByte (d[i]);   
    sendByte(0x100 - sumN); // "zanegowana" suma kontrolna bloku danych
    byte suma = getByteFromFile(); // zakladam, ze plik jest poprawny i nie sprawdzam sumy
    // ale trzeba ja przeczytac!!!
    myFile.read();   // tak jak znaki CR
    myFile.read();   // i LF na koncu rekordu :-)
  }
}


https://youtu.be/rvMsY51isgE

CA80_HEX_fromSD_viaMag_INO.txt
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein

Awatar użytkownika
Zegar
Posty: 29
Rejestracja: wtorek 02 lip 2019, 14:42

Re: [CA80] Obsługa magnetofonu.

Postautor: Zegar » niedziela 17 lis 2019, 08:51

ZbeeGin pisze:https://allegro.pl/oferta/tzx-duino-wresja-oled-8019853734

Sam format TZX jest dość elastyczny i podobno - nie sprawdzałem tego - potrafi wiernie zapisać "obraz" taśmy. Można by spróbować go wykorzystać.

Jest jednak mała różnica... TZX odtwarza, a magnetofonik_CA80 tworzy sygnał magnetofonowy. :-)
"If A = success, then the formula is A = X + Y + Z.
X is work. Y is play. Z is keep your mouth shut."
A. Einstein


Wróć do „Retro”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 3 gości