[CA80] Obsługa magnetofonu.
[CA80] Obsługa magnetofonu.
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ć.
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
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ł...
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
"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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
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.
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ć)
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)
Re: [CA80] Obsługa magnetofonu.
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
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ć)
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)
- ZbeeGin
- User
- Posty: 492
- Rejestracja: sobota 08 lip 2017, 17:16
- Lokalizacja: Śląsko-Zagłębiowska Metropolia
- Kontaktowanie:
Re: [CA80] Obsługa magnetofonu.
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...
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ć.
Re: [CA80] Obsługa magnetofonu.
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
Nie byłbym sobą, gdybym nowej zabawki nie użył do ustawienia czasu w CA80!
Trochę mi to zajęło, ale działa.
https://filmy.elektroda.pl/86_1572651188.mp4
Trochę mi to zajęło, ale działa.
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
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....
Ł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ć)
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)
Re: [CA80] Obsługa magnetofonu.
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
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....
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ć)
Kończysz tworzyć dopiero, gdy umierasz. (Marina Abramović)
Re: [CA80] Obsługa magnetofonu.
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
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
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ć...
Teraz działa zgodnie z założeniami. Przetestowałem w zakresie MAGSP = 0CH do 45H. Przy 0CH jest naprawdę szybko!
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
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
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?
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
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
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?
https://youtu.be/rvMsY51isgE
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
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
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
X is work. Y is play. Z is keep your mouth shut."A. Einstein
Re: [CA80] Obsługa magnetofonu.
Piękna robota!
Re: [CA80] Obsługa magnetofonu.
W moim magnetofonie paski do wymiany, a tu gotowe rozwiązanie!
Re: [CA80] Obsługa magnetofonu.
Jeszcze raz wielkie dzięki!
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości