logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATAPI] ATAPI: Nie działa komenda PLAY AUDIO 0x45 w odtwarzaczu CD - analiza kodu

thenkles 16 Maj 2006 23:46 3477 29
REKLAMA
  • #1 2633289
    thenkles
    Poziom 11  
    Posty: 76
    Ocena: 1
    Witam, buduję odtwarzacz CD na napędzie ATAPI, jednak napotkałem na problem. Nie działa mi komenda PLAY AUDIO - 0x45 (jak i inne do odtwarzania audio, oczywiście z odpowiednimi parametrami), oto kod:

    	char Packet={0x45, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0};
    
    	ATAPI_Packet(Packet);


    Być może problem jest też w funkcji ATAPI_Packet, choć inne komendy działają dobrze

    void ATAPI_Packet(char Packet[12]){
    
    	/*ATAPI_Write(REG_FEATURES, 0, 0);*/
    	ATAPI_Write(REG_HICOUNT, 0, 0);
    	ATAPI_Write(REG_LOCOUNT, 0, 0);
    	ATAPI_Write(REG_COMMAND, CMD_PACKET, 0);
    	_delay_ms(10);
    	//ATAPI_BusyWait();
    	//ATAPI_DataWait();
    	char i;
    	for(i=0; i<12; i+=2){
    	        ATAPI_Write(REG_DATA, Packet[i], Packet[i+1]);
    	        //_delay_us(40);
     	}
     	//while(ATAPI_ReadByte(REG_STATUS)&8==8)
     	        //ATAPI_ReadByte(REG_DATA);
            //ATAPI_BusyWait();
    }


    Zakomentowane części kodu niby powinny się tam znaleźć i znajdują się w większości implementacji, ale u mnie z nimi w ogóle nic nie działało ;). Po wykonaniu PLAY AUDIO odczytuję rejestr błędów i dostaję 0x04, czyli komenda anulowana, ale sense key jest 0, czyli brak błędu. Tak samo kody ASC i ASCQ po wykonaniu komendy REQUEST SENSE, choć ona też może mieć błędy ;).

    Co tutaj może być nie tak?
  • REKLAMA
  • #2 2633500
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    O widze kolegę?
    Tez kiedyś zrealizowałem samemu odtwarzacz aduio urzywajac cdromu.
    Pisze z głowy ale na szybko:

    Są dwie komendy play aduio:
    PLAY_AUDIO_10
    PLAY_AUDIO_12

    Pierwsza jest stara i obsługuje długość utworu jako word (14,5 minuty odtwarzania). Potem dodano komendę play audio 12 która potrafi odtworzyć cała płytę z jednego odpalenia (double word).

    Jakoś do tej pory nie miałem nigdy takiego błedu jak podajesz, zawsze albo naped nie gotowy albo w trakcie operacji do bycia gotowym.
    Gdzies tu w tym dziale wklejiłem ostatnio przykłądowy plik (co prawda bascom) ale tam było wszystko co potrzeba fachowcowi do ustalenia.
    W temacie chyba było teac cd224e.

    Może twój napęd nie ma odtwarzania audio?

    -----------------------

    Ok znalazłem.
    
    Atapi_play_audio_msf:                                         'A5h PLAY AUDIO(10)
       'rozpocznij odtwarzanie od do
       For Apc_byte = 1 To 12
          Apc(apc_byte) = 0
       Next Apc_byte
       Apc(1) = &H47                                              'PLAY AUDIO MSF
       'odtwarzanie od:
       Apc(4) = Cdrom_play_start_msf(3)                           'start Minutes
       Apc(5) = Cdrom_play_start_msf(2)                           'start Seconds
       Apc(6) = Cdrom_play_start_msf(1)                           'start Frames
       'odtwarzanie ile:
       Apc(7) = Cdrom_play_stop_msf(3)                            'stop Minutes
       Apc(8) = Cdrom_play_stop_msf(2)                            'stop Seconds
       Apc(9) = Cdrom_play_stop_msf(1)                            'stop Frames
       Send_apc                                                   'wyslij pakiet danych
       Waitms 1
       Bsy_wait                                                   'czeka na gotowosc urzadzenia
    Return
  • #3 2634098
    thenkles
    Poziom 11  
    Posty: 76
    Ocena: 1
    Niestety próbowałem już czegoś takiego i efekt ten sam ;). Kombinowałem z PLAY AUDIO (10), PLAY AUDIO (12), jak i PLAY AUDIO MSF :). Zawsze wychodzi na to, że komenda została anulowana, ale nic mi nie chce powiedzieć dlaczego :P. Podejrzewam, że błąd mam gdzieś indziej (ATAPI_Packet()?), a może czegoś ważnego nie zrobiłem wcześniej... choć jak patrzę na inne projekty tego typu, to raczej niczego nie pominąłem ;). A napęd obsługuje audio, też już byłem skłonny przypuszczać, że nie, ale sprawdzałem ;).
  • REKLAMA
  • #4 2634166
    avatar
    Poziom 36  
    Posty: 4150
    Pomógł: 159
    Ocena: 415
    nie chce sie wtracac.,., bo nigdy czegos takiego nie pisalem od podstaw ale przegladajac wypowiedzi z forum i pszeszukjac google kiedys w tym temacie .,.,. odkrylem ze nikomu sie nie udalo zmuisc dowolnego cd romu od odtwarzania audio .,.,. zawsze sa z tym jakies problemy ,., ba AVT nawet kilka kitow wyposcilo wraz z kdoem zrudolym i opisami i tez sobie zeby na tym polamali .,.,
  • #5 2634198
    thenkles
    Poziom 11  
    Posty: 76
    Ocena: 1
    Wiem, że ludzie mieli problemy, ale jakoś musi się dać :). W końcu PC działa z każdym napędem. Pewnie problem jest w zgodności ze specyfikacją ATAPI, więc trzeba się do niej jak najbardziej zbliżyć :).
  • #6 2634798
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    avatar - co się nie da - u mnie działa.
    Problemy wynikają z tego że małe uC mają mało pamięci i nie można przewidzieć wszystkich przypadków i ich oprogramować - czasami trzeba robić obejścia i właśnie potem okazuje się że z innym cd nie działa.

    Ale powiem tak: różne cdrom'y różnie reagują na podawane komendy i czasami trzeba komendy podawać odwrotnie. Miałem tylko jednego starego cdroma który zawsze wymagał 16 bajtów w APC a reszta nie.
    Najlepiej mi działa LG GCR-8522B ale on odtwarza audio z podwyższoną prędkościa obrotową co strasznie hałasuje. Teac z kolei ma inny problem o którym kiedys pisałem, ale ma bardzo duży bufor (512k) co powoduje, że jest najbardziej odporny na uderzenia podczas grania.

    Wybierasz na początku napęd (master/slave) i robisz mu atapi reset?

    Napisz też coś więcej o tych błedach - normalnie request sense powinien zwracać dwa bajty (sc i scq).

    A może za wcześnie wysyłasz mu komendę startu: troche czasu zajmuje inicjalizacja wewnetrzna i w tym momencie będzie, że command aborted albo drive not ready.

    Wrzuć jakaś petlę z wyświetlaniem błedów cały czas (odczyt powoduje skasowanie błędów z cd) i po naciśnieciu guzika wyśle play audio.
    Załączniki:
    • Kopia cdrom_test_v38.BAS.txt (35 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #7 2634854
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Co do schematu to nie robiłem żadnego. Jak wiecie cdrom nie wymaga takowego. On ma linie danych DD0..7 DD8..15, CS0, CS1, DA0..2 i wystarczy to podłaczyć do dowolnych pinów uC i będzie działało. W poprzednim poscie w załączniku są komentarze i tam jest napisane który pin steruje jakim sygnae. Jest tam też zrobiony jeden myk - zamienione linie MSB z LSB ale to dlatego ze oryginał miał oryginalne gniazdko IDE i nie mogłem inaczej poprowadzić scieżek - dlatego odwróciłem kolejność.

    Sam programik starałem napisać jak najprosciej i zrozumiale - dlatego sa te kreski poziome do oddzielania komend lub fragmentów programu.

    Ten teścik jest sterowany po rs i wysyła całkiem zrozumiałą ramkę danych - odrazu w terminalu widać jak cd reaguje. Szczegóły (prędkosć, ramka) w pliku.
    Przepraszam że w bascomie ale ja używam tego na codzień - jakoś nie chce mi się już przesiadać na C.
  • #8 2634951
    thenkles
    Poziom 11  
    Posty: 76
    Ocena: 1
    Wielkie dzięki za ten programik, nic nie szkodzi, że w bascomie, poradzę sobie z odszyfrowaniem ;). Chociaż byłbym wdzięczny za opis, w jakiej kolejności odpalasz te komendy :). A co do atapi reset, nie używam go. Nie chciało działać (choć zanim się przesiadłem na procka AVR, to działało ;) ), więc robię reset sprzętowy.
  • REKLAMA
  • #9 2635101
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Co do kolejnosci - to popatrz w plik - tam jest czarno na białym co po czym.
    W skrócie:

    - dwa opóźnienia 255ms
    - potem resetowanie zmiennych rs i odswierzanie pierwszej ramki (tak aby było gotowe przed pierwszą pętla)
    - wybór urządzenia slave (jest i procedura na master - patrz nizej)
    - atapi reset (dotyczy ostatnio wybranego urządzenia: tu slave)

    i zaczyna sie pierwsza pętla

    - atapi mode sense do ustalenia czy naped jest gotowy do odegrania audio (jak przejdzie testy to pokaże: no current audio status to return)
    - error chcheck sprawdzeni błędów czy komenda siewykonała i czy naped jest gotowy.

    - ustawienie zmiennych do rs i aktualizacja ramki wysyłanej

    - sprawdzenie czy wlożona płyta jest audio, czy tacka jest zamknieta i odpowiednie skoki do petli
    - opóźnienie powtarzania pętli

    następna pętla gdy tacka jest wysunieta.
    - jak widac podobna do poprzedniej tylko inne warunki skoków

    petla gdy tacka się zamyka

    petla po zamknieciu tacki - cdrom rozpedza płytę i bedzie próbowął przeczytać z niej TOC

    petla że audio cd rozpoznane (narazie 120mm ale mnozna dodać i te 3,5") - uwaga nie wszystkie napedy zwracaja różne wartosci gdy jest CD-R, CD-RW - czasami to jest poporostu kod 02 jak dla tłoczonej płyty (dziwne ale większość moich tak ma - nie sprawdzałem zadnej nagrywarki)

    petla czytania TOC gdzi eczytamy gdzi ejest obszar końca płyty - równa się ostatni fragment ściezki audio

    petla czytania TOC pod wzgledem startu pierwszej ścieżki (dlatego ze cd moze byc RW z poprzednio wykasowanymi sesjami/ścieżkami)

    petla pokazująca w terminalu długość ścieżki audio (przez jakiś czas)

    petla ustalanie aktualnej pozycji optyki - nie umiałem sobie poradzić z niektórymi błedami (niektóre napedy wymagaja aby najpierw zrobić im track search i dlatego bedzie pare koemend zwiazanych z tym faktem)

    petla oczekiwanie aż optyka znajdzie odpowiedni fragment płyty (powtarzane kilka razy - mozna rzec aż do skutku)

    petla uruchamianie grania czyli oczekiwanie aż status bedzie play audio in progress

    petla odtwarzanie - czytanie aktualnej pozycji w formacie czasu i pokazywanie go w terminalu. Jezlei ktoś otworzy tackę, lub cd zatrzyma sie z jakiegos powodu to program skoczy w odpowiednie miejsce. Uwaga tu też różne cdromy pokazuja różne statusy gdy sie im otworzy tacke w czasie grania

    petla pauza - gdy w terminalu wciśniemy pauze (odpowiednia literka)

    ------------------------

    Poniżej sa procedury użyte w programie głównym. Nie wszystkie są uzywane - jak powiedziałem to jest program testowy i wpisałem wiecej z pdf zeby sprawdzać w kolejnych wersjach programu jak reaguje cdrom na nie w różnych momentach. Nieużywane mozna usunać.

    Może napisze jeszcze jak działa jakas APC:
    np. Atapi_mode_sense

    cd_type = 255 ;cdjak odczyta zmieni to na inną wartość, jak nie to bezie wiadomo że cos nie zadziałalo
    bsy_wait - oczekiwanie aż cd bedzie gotowy do wysłania danych (szczerz emówiac to u mnie cd jest szybszy niz uC i nigdy mi nie czekało na napęd)

    powtórzenie 12 razy - wyzerowanie 12 bajtów zmiennych APC
    apc(1) - ustawienie odpowiednich wartosci w poszczególnych bajtach (tak jak w dokumentacji są opisane komendy)

    send_apc - wysyła apc do cdromu (cłą a procedurka niżej)
    bsy_wait - znów oczekiwanie na gotowosć cd
    data_wait - wysłaliśmy komendę która nam cos zwróci dlatego bedziemy czekać az cdrom bedzie gotowy do nadawania

    adres=0: gosub RD - rd to procedura odczytu dwóch bajtów (word) z rejestru o adresie 0 (tu jest rejestr danych - data register)

    i tak powtórzenie dwa razy - jedna taka linijka czyta dwa bajty (bo word)

    cd-type=dane_lo przepisanie odczytanego bajtu (odpowiedniego) do zmiennej cd_type

    odczytanie jeszcze czterech bajtów

    W sumie odczytane było 8 bajtów i to jest parametrem (apc(9)=8) inaczej cd krzyknie że coś nie tak (lg nie krzyczy)

    Tak wygladaja komendy atapi packet commands (apc) w moim wykonaniu.

    Troche długi opis ale wyjasni wiele (patrzyłem cały czas na załaczony plik)[/b]
  • #10 2636791
    thenkles
    Poziom 11  
    Posty: 76
    Ocena: 1
    Najśmieszniejsze jest to, że teraz po drobnych zmianach funkcji wysyłającej pakiety oraz przerobieniu funkcji wykonującej REQUEST SENSE, jak daję PLAY AUDIO (10) lub PLAY AUDIO MSF, rejestr statusu wskazuje brak błędu, rejestr błędów wskazuje 0, tak samo Asc Ascq. Niestety napęd nic nie odtwarza, nawet nie miga LEDem odczytu :). Sprawdzanie błędów jednak działa, bo gdy dam PLAY AUDIO (12), to kody błedów przyjmują sensowne wartości (mówią, że komenda jest błędna, więc pewnie napęd nie obsługuje).
  • #11 2636831
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    I na to jest metoda.

    Najpierw napisz co to za napęd - producent, typ, model. Napisz też czy po podłaczeniu do komputera odtwarza muzykę (przez złacze analogowe - nie przez cyfrową transmisje dźwięku).

    Jest też komenda do sprawdzania własciwości napedu (ilosć bufora, obsługiwane formaty) jak odespie po nocy to napisze dokładnie co to było i jakie parametry odczytujemy.

    Jezeli w komputerze audio działa to stawiałbym jednak na błąd w formacie koemndy - ale od tego też jest odpowiedni błąd. Sprawdź też czy cd zareaguje na komendę search - podobna parametrami do paly - powinno być słychać jak optyka wykona ruch - najlepiej podac pocżatek końca płytki. Jezeli zareaguje to jeszcze raz sprawdź play - powinno tak samo najpierw dojechać do początku miejsca odtwarzania. Zrób tez tak że jeżeli sc=0 to żeby ignorował scq - czasami tam wtedy wrzuca głupoty i moze procedura sprawdza że jest blad i przerywa odtwarzanie - tak było u mnie.
  • #13 2637551
    thenkles
    Poziom 11  
    Posty: 76
    Ocena: 1
    No to tak:
    -Napęd to LG GCE8400B
    -audio na komputerze działa bez zastrzeżeń - analogowo, bo przez słuchawki podłączone bezpośrednio do napędu :P

    Potem sprawdzę tą komendę search i napiszę, jak wyszło :)
  • #14 2637965
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    To miało być seek (nie search - mój błąd).
    
    Atapi_mode_sense:                                             '5Ah MODE SENSE(10)
       'sprawdzanie typu plyty
       Cd_type = 255
       Adres = 1 : Gosub Rd : Bsy_wait
       For Apc_byte = 1 To 12
          Apc(apc_byte) = 0
       Next Apc_byte
       Apc(1) = &H5A                                              'MODE SENSE COMMAND
       Apc(3) = &H2A                                              'PC, Page Code
       Apc(9) = 26                                                'ilosc bajtow do odebrania
       Send_apc                                                   'wyslij pakiet danych
       Bsy_wait                                                   'czeka na gotowosc urzadzenia
       Data_wait                                                  'czeka na gotowosc danych
       '----header
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG
       Cd_type = Dane_lo                                          'rodzaj plyty
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG
       '----selected page info
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG bytes:0,1
       Rs_bajt_1 = Dane_lo
       Rs_bajt_2 = Dane_hi
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG bytes:2,3
       Rs_bajt_3 = Dane_lo
       Rs_bajt_4 = Dane_hi
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG bytes:4,5
       Rs_bajt_5 = Dane_lo
       Rs_bajt_6 = Dane_hi
    
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG bytes:6,7
       Rs_bajt_1 = Dane_lo
       Rs_bajt_2 = Dane_hi
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG bytes:8,9
       Rs_bajt_3 = Dane_lo
       Rs_bajt_4 = Dane_hi
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG bytes:10,11
       Rs_bajt_5 = Dane_lo
       Rs_bajt_6 = Dane_hi
    
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG bytes:12,13
       Rs_bajt_1 = Dane_lo
       Rs_bajt_2 = Dane_hi
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG bytes:14,15
       Rs_bajt_3 = Dane_lo
       Rs_bajt_4 = Dane_hi
       Adres = 0 : Gosub Rd                                       ' odczytaj DATA REG bytes:16,17
       Rs_bajt_5 = Dane_lo
       Rs_bajt_6 = Dane_hi
    Return

    To co powyżej odczytuje dane z cdromu (wielkosć bufora i parametry) - miedzy innymi audio support.
    np bajt 4 (u mnie wartość 71h) mówi ze : audio play=1, M2F1=1, M2F2=1, Multi SES=1.
    bajt 5 (u mnie 73h) mówi że: CD-DA=1, DAAcc, C2=1, ISRC=1, UPC=1.

    Bajt 12 i 13 (u mnie 02h,00h) to 512KB bufor

    W dokumentacji ten tryb też jestomówiony. Troche zakręcili sposób wyjasnienia jak sie wybiera odpowiednia stronę (PC) i odkąd tak naprawdę zaczynaja siedane ale mozna dojść
  • #15 2640197
    thenkles
    Poziom 11  
    Posty: 76
    Ocena: 1
    Hehe, ale ze mnie cioł... 8=O
    Już sam znalazłem błąd, był banalny :P. Zamiast:

    char Packet[12]={...};

    dałem:

    char Packet={};

    i przez kilka dni męczyłem się z tą komendą :P. W tej chwili udało mi się odtworzyć płytę, wprawdzie tylko komendą PLAY AUDIO (10), ale z MSF chyba problemu nie będzie ;). Dzięki za pomoc i wybaczcie za zawracanie głowy takim banałem :P.

    Na koniec mam jeszcze jedno pytanko: skąd wziąć długość ścieżki do odtworzenia? Pobrać następną w kolejności ścieżkę przez READ TOC (lub Lead Out jeśli ścieżka jest ostatnia), a potem odejmować adresy?
  • REKLAMA
  • #16 2642286
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Jak przyjmiesz MSF w swojej aplikacji to łatwiej jest wyświetlać czas. Ponieważ cdrom tez może podawać pozycje aktualną w formacie MSF (podaje numer ścieżki i pozycję w ścieżce badź na całej płycie) Nie potrzba przeliczać z LBA co pochłania niestety sporo czasu uC. Mozna też zrobic taki numer.
    Jeżeli bedziesz odgrywał płytę od pierwszego utworu to przyjmij jako koniec start ścieżki AAh - wtedy przejście do nowego utworu wystarczy zmieniać adres początkowy kolejnej ścieżki - jest prostsze bo nie potrzeba ani buforować toc ani wyliczać długości z wartosci dwu kolejnych ścieżek. A cdromowi wszystko jedno czy ma zagrać godzinę w jednym czy 6 x 10 minut.

    Ciesze się że wkońcu udało ci sie odpalić - witaj w klubie.

    NAstepnym etapem jest DATA CD - które też nie jest trudne - żeby nie powiedzieć proste.
  • #17 4048020
    manekinen
    Poziom 29  
    Posty: 1629
    Pomógł: 76
    Ocena: 2361
    Witam... to moze ja odgrzeje troche kotleta :)

    Wybrałem program kolegi Szymtro bo jest on przejrzysty i szybko mogłem dość o co chodzi. Mam problem z komunikacją z napędem. Jeśli odczytuje bity w podprogramie "RD" z portów C i A, to otrzymuje same jedynki. Dodałem sobie wyświetlanie wszystkich bitów z dwóch portów na LCD, i ciągle pokazuje jedynki.
    Zapewne także i zapis danych nie funkcjonuje jak trzeba, próbowałem wysyłać chociażby komendy do wysuniecia tacki - i żadnej reakcji.

    Mało tego - sprawdzanie gotowości napędu kończy się pomyślnie:
    Sub Bsy_wait
       'czekaj az flaga Bsy zwolni sie
       Tajmerek = 100 : Err = 0
       Do
          Adres = 7 : Gosub Rd
          Waitms 1
          If Tajmerek > 0 Then
             Decr Tajmerek
          Else
             Err = 1 : Exit Do
          End If
       Loop Until Dane_lo.7 = 0 And Dane_lo.6 = 1               
    End Sub

    W tym miejscu wyświetliłem sobie dane które odebrał z portów A i C, oczywiście 1111111111111111
    Ale mimo tego program wychodzi z pętli i wykonuje się dalej :!:

    Po wyborze slave/master program trafia na procedure resetu napędu, a w nim na sprawdzenie czy nie wystąpił błąd - i z tej pętli już nie wychodzi. Także nie wiem... drugi dzień nad tym siedze i nie mogę sobie poradzić :| uC to ATMega16 (zmieniłem jedynie porty), cdrom to LG52 (z tego co wyczytałem to nie sprawia on problemów z takimi kontrolerami).

    Pozdrawiam
  • #18 4053759
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    To jak użyłeś mojego to pewnie wiesz ze był on napisany na '51 a ona ma inne porty i dlatego tam było najpierw ustawianie porty na 255 a potem odczyt. Żeby sie nie okazało ze zrobiłeś tak samo i cdrom tego nie przeżył albo porty w uC szlak trafił.
    Pokaz dokładnie procedury rd i wr.
    Mnie za pierwszym razem zajęło około 4h żeby cdrom mi odpowiedział (po przeczytaniu ata_atapi i sdc poprzedniego wieczoru).

    Zobacz też w PC czy twój cd jeszcze żyje bo jak dostał silną jedynkę i próbował ją ściągnąć do masy to mogło mu coś nawalić.
    W takich urządzeniach zalecana jest obsługa linii danych pull up resistor/open colector) co też da się zrobić w avr sterując tylko jednym rejestrem (ddrx).
    Co do czasów i opóźnień to raczej bym sie nie martwił - cdrom jeszcze 52x to szybkie urządzenie i raczej nie grozi ci przekroczenie timngów na liniach danych.
  • #19 4054138
    manekinen
    Poziom 29  
    Posty: 1629
    Pomógł: 76
    Ocena: 2361
    Dzięki za odpowiedź :)

    linie danych mam podpięte w następujący sposób:
    D0...D7
    PortA.0...PortA.7

    D8...D15
    PortC.0...PortC.7

    /RD - portd.7
    /WR - portd.6

    A0 - portb.5
    A1 - portb.6
    A2 - portb.7

    CS0 i CS1 na stałe do masy i plusa (w jednym z kitów avt jest w ten sposób zrobione, na stałe jest ustawiony "rejestr komend i danych")

    szymtro napisał:
    To jak użyłeś mojego to pewnie wiesz ze był on napisany na '51 a ona ma inne porty i dlatego tam było najpierw ustawianie porty na 255 a potem odczyt. Żeby sie nie okazało ze zrobiłeś tak samo i cdrom tego nie przeżył albo porty w uC szlak trafił.

    Właśnie celowo to dopisałem, ustawiam na nich 1 żeby skasować poprzednie dane z komendy zapisu, następnie ustawiam je jako wejścia, i wysyłam impuls RD. (Bez dołączonego cdromu po ściągnięciu w tym miejscu któregoś z pinów do masy - wyświetlacz pokazuje zero tam gdzie trzeba, więc porty uC sprawne.)
    A jak to powinno wyglądać, skoro tak jest źle? Równie dobrze może coś się uszkodzić jeśli zostawie na nich 0?

    Obecnie jestem na takim najprostrszym programie, żadnych zmiennych, zwykłe wystawianie bitów na porty. Próbuje odczytać bity zajętości, i nawet to nie wychodzi - więc nie ma chyba sensu próbować z całym programem.
    $regfile = "m16def.dat"
    $crystal = 1000000
    $large
    
    '---------------------------------------
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portd.5 , Rs = Portb.0
    
    Config Portd = Output
    Config Portb = Output
    
    Dim Bsy As Bit
    Dim Drdy As Bit
    
    Cls
    Cursor Off
    Waitms 500
    Enable Interrupts
    
    
    
    
    'WYBIERAM SLAVE
    
    'kasuje WR, RD
    Portd.7 = 1                                                 'RD
    Portd.6 = 1                                                 'WR
    
    'wystawiam adres na piny - 07h
    Portb.5 = 1                                                 'AD0
    Portb.6 = 1                                                 'AD1
    Portb.7 = 1                                                 'AD2
    
    'wystawiam dane na piny - 10110000            'czyli wybór slave
    Config Porta = Output
    Config Portc = Output
    Porta.7 = 1
    Porta.6 = 0
    Porta.5 = 1
    Porta.4 = 1
    Porta.3 = 0
    Porta.2 = 0
    Porta.1 = 0
    Porta.0 = 0
    
    Portc.7 = 0
    Portc.6 = 0
    Portc.5 = 0
    Portc.4 = 0
    Portc.3 = 0
    Portc.2 = 0
    Portc.1 = 0
    Portc.0 = 0
    
    'wysyłam impuls WRITE /WR, zbocze opadające
    Portd.6 = 0
    
    'czekam
    Delay
    
    'kończe impuls
    Portd.6 = 1
    
    
    Config Porta = Input
    Config Portc = Input
    
    
    'wyświetlam zawartość portów, tak żeby sprawdzić co faktycznie na nich było
    Locate 1 , 1
    Lcd "wyslano SLAVE   "
    Locate 2 , 1
    Lcd Pina.7 ; Pina.6 ; Pina.5 ; Pina.4 ; Pina.3 ; Pina.2 ; Pina.1 ; Pina.0 ; Pinc.7 ; Pinc.6 ; Pinc.5 ; Pinc.4 ; Pinc.3 ; Pinc.2 ; Pinc.1 ; Pinc.0
    
    'Wait 1
    
    '---------------------------------------
    'SPRAWDZAM FLAGĘ BSY
    
    'pętla
    Do
    
    'wystawiam adres na piny - 07h
    Portb.5 = 1                                                 'AD0
    Portb.6 = 1                                                 'AD1
    Portb.7 = 1                                                 'AD2
    
    'Czyszcze Porty Przed Przyjęciem Danych
    Config Porta = Output
    Config Portc = Output
    Porta = 255
    Portc = 255
    
    'wysyłam impuls READ /RD
    Config Porta = Input
    Config Portc = Input
    'zbocze opadające na /RD
    Portd.7 = 0
    Portd.6 = 1
    
    'czekam
    Delay
    
    'wyświetlam zawartość portów
    Locate 2 , 1
    Lcd Pina.7 ; Pina.6 ; Pina.5 ; Pina.4 ; Pina.3 ; Pina.2 ; Pina.1 ; Pina.0 ; Pinc.7 ; Pinc.6 ; Pinc.5 ; Pinc.4 ; Pinc.3 ; Pinc.2 ; Pinc.1 ; Pinc.0
    
    'bity gotowości przepisuje do zmiennych i wyświetlam
    Bsy = Pina.7
    Drdy = Pina.6
    Locate 1 , 1
    Lcd "bsy:" ; Bsy ; " drdy:" ; Drdy ; "    "
    
    'kończe impuls READ /RD
    Portd.7 = 1
    Portd.6 = 1
    
    'powtarzaj do momentu aż napęd będzie gotowy
    Loop Until Pina.7 = 0 And Pina.6 = 1
    
    'jeśli napęd gotowy to ma być:
    'Porta.7 = 0
    'Porta.6 = 1
    'jeśli dane gotowe to ma być:
    'Porta.3 = 1
    
    Locate 1 , 1
    Lcd "KONIEC          "
    
    End




    DODANO



    AHA - napęd w komputerze działa bez problemu, po tych wszystkich kombinacjach które przeszedł przez te trzy dni to sam się dziwie że jeszcze działa.

    I mam jeszcze jedną wątpliwość co do CS0 i CS1

    W specyfikacji ATA jest taka tabela... wyjaśnione zostało jak należy korzystać wyboru rejestru i adresu...
    [A] oznacza pin podciągnięty do + , a [N] do - ?
    Bo jeśli tak to nie zgadza się to ze wszystkimi informacjami które do tej pory znalazłem...
    Załączniki:
    • [ATAPI] ATAPI: Nie działa komenda PLAY AUDIO 0x45 w odtwarzaczu CD - analiza kodu ATAPI.GIF (39.49 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #20 4057961
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    Aserted to stan +5v na samym pinie złącza. Negated to w tym miejscu 0v.
    Wiem że to jest dziwne bo napisali by wprost 0 i 1 ale widocznie opracowywał to inny dział.
    Cytat:
    RD:
    -ustawienie stanów na /CS0=0 i /CS1=1
    -ustawienie A0..2
    -wejścia DATA0..15 jako wejścia
    -krótki impuls ujemny pinem /RD
    -przeczytanie zmiennych z wejść

    Cytat:
    WR:
    -ustawienie stanów na /CS0=0 i /CS1=1
    -ustawienie A0..2
    -wyjścia DATA0..15 jako wyjścia
    -wystawienie danych na DATA0..15
    -krótki impuls ujemny pinem /WR
    - przełączenie wyjść DATA na wejścia (najlepiej HI-Z)

    Ponieważ jest to atapi to /cs0 i /cs1 można było by tak naprawdę ustawić na stałe sprzętowo - zmienia się tylko adres ale sam zestaw rejestrów używamy jeden.
    Dopóki używasz komend niskiego poziomu (zapis do rejestrów) to podstawa to tylko 8 najmłodszych bitów (starsza część nie ma znaczenia). Dopiero packet data juz ma dwa bajty naraz.
    CDROM masz mieć ustawiony na master.
    Odpalasz zasilanie, uC czeka chwilkę, wysyłasz napęd master:
    Cytat:
    A0..2=0x06, DATA0..7=0xA0, call WR, busy_wait

    po tym dla pewności wstawiasz pust6ą komendę ata:
    Cytat:
    A0..2=0x07, DATA0..7=0x00, call WR, busy_wait

    bysy_wait generalnie polega na czytaniu A0..2=0x07 DATA0..8 w bicie 7=0 i bicie 6=1.
  • #21 4060360
    manekinen
    Poziom 29  
    Posty: 1629
    Pomógł: 76
    Ocena: 2361
    I dokładnie tak robie. I cdrom w ogóle nie odpowiada, wszędzie stan wysoki.

    A z tym ASSERTED i NEGATED - chodzi mi o to że specyfikacja ata opisuje zupełnie odwrotnie działanie CS0 i CS1, gdzie we wszystkich znalezionych projektach/kitach jest napisane że...
    aby wybrać rejestr komend i danych, należy ustawić CS0=0 i CS1=1
    a w tabeli którą załączyłem wcześniej twierdzą że to CS0=1 a CS1=0
    I to mnie właśnie zastanawia, skoro asserted to [+] a negated to [-]

    Druga rzecz, znalazłem troche kolejnych informacji o komunikacji IDE...
    Załączony obrazek mówi że NAJPIERW ma się zacząć sygnał DIOW, a dopiero później dane mają znaleźć się na pinach...

    Same sprzeczności, więc jak niby ludzie mają to uruchomić? :/




    DODANO



    Udało mi się odczytać stan napędu. Na pewno komunikacja działa, bo tylko z adresem 7 i DIOR pokazuje takie bity. Gdy trzymam pin resetu napędu na masie, to BSY wynosi 1. gdy puszcze, i napęd zacznie się uruchamiać, BSY wynosi 0, czyli prawidłowo.

    ALE gdy dopiero nacisne PLAY na panelu, to bity DRDY (bit6) i DSC (bit4) wynoszą 1, czyli napęd gotowy, i że głowica jest na właściwym miejscu (nie wiem po co mi daje bit 4, bo to się tyczy dysków twadych, w cdromie ten bit nic nie oznacza!).

    Czemu od razu po uruchomieniu nie zgłasza gotowości, tylko muszę nacisnąć PLAY?
    Załączniki:
    • [ATAPI] ATAPI: Nie działa komenda PLAY AUDIO 0x45 w odtwarzaczu CD - analiza kodu Image7.gif (12.78 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #22 5164784
    Menuet
    Poziom 19  
    Posty: 162
    Pomógł: 39
    Ocena: 122
    Witam!
    Nie wiem czy takie pytanie pasuje do tego tematu ale je zadam :)
    Czy takie CD-ROM z laptopa typu "Slimline" da się tak samo sterować do odtwarzania audio? Bo chciałbym na takim zrobić playerka, tylko nie wiem czy jest sens inwestować?

    Pozdrawiam, Menuet
  • #24 5165197
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    A czy przypadkiem po włożeniu do napędu płyty nie startuje automatycznie odtwarzanie muzyki?
  • #25 5166345
    manekinen
    Poziom 29  
    Posty: 1629
    Pomógł: 76
    Ocena: 2361
    Jeśli chcesz użyć gotowego programu do obsługi napędu, to nie oczekuj że będzie poprawnie działał. Nawet podobne napędy troche inaczej trzeba obsługiwać (komendy w innej kolejności, inne kody błędów w różnych sytuacjach), a taki napęd typu slim to już na pewno będzie sprawiał problemy... no, chyba że pokusisz się o napisanie własnego programu do jego obsługi :) Sam przez to przechodziłem, i mogę powiedzieć że sporo nerwów i czasu to pochłonie. No, ale nie jest to też zasada jakaś, może też działać idealnie :) Może najpierw wykonaj sobie sterownik, sprawdź go na zwykłym napędzie, a przed kupnem tego slim najpierw go podłącz pod ten sterownik i sprawdź.
  • #26 5180958
    Menuet
    Poziom 19  
    Posty: 162
    Pomógł: 39
    Ocena: 122
    Witam!
    Sorki, że się wcześniej nie odezwałem, ale byłem w górach :)

    Dokładnie mówiąc to chce użyć gotowego programu, ale na pewną będą w nim zmiany i myśle, że nawet jak poświęce dwie, trzy noce przy komunikacji z napędem to i tak będzie to ciekawe doświadczenie :)

    O wynikach prac poinformuje :)

    Pozdrawiam, Menuet.
  • #27 5182602
    szymtro
    Poziom 30  
    Posty: 1421
    Pomógł: 101
    Ocena: 59
    "Dwie trzy noce" - to jesteś sporym optymistą.
    Napisz co ci wyszło i jak twój model cd romu reaguje na komendy oraz jak pokazuje swoje stany bo to jest dość ważne.
  • #28 5217357
    Menuet
    Poziom 19  
    Posty: 162
    Pomógł: 39
    Ocena: 122
    Witam!

    Po kilku, kilkunastu próbach przeróbki gotowego programu, udało mi się skomunikować z napędem typu SLIM bliżej nie znanej firmy Quanta, kupionego na znanym serwisie aukcyjnym :)

    Wielkim problemem okazało się wysyłanie komendy "STOP",CD-ROM nie zwracał blędu, ale też nic nie robił. Okazało się, że podwójne wysłanie tej komendy w odstępie około 200ms rozwiązało problem :) Może nie jest to idealne, ale mnie satysfakcjonuje :)
    Teraz pozostają mi dalsze przeróbki programu do docelowego urządzenia, ale to w dalszym czasie...

    Pozdrawiam, Menuet.
  • #29 5578353
    manekinen
    Poziom 29  
    Posty: 1629
    Pomógł: 76
    Ocena: 2361
    Kolego mówisz o komendzie do zatrzymania płytki w miejscu, czy do zwyczajnego zatrzymania odtwarzania?

    Ja miałem problem z zatrzymywaniem płyty (np. przed wyłączeniem urządzenia żeby ta płyta jeszcze nie wirowała w nieskończoność). Do tej pory nie wiem o co chodziło, po prostu 2 z 5 napędów przyjmowało komendę bez zwracania błędu, ale nie wykonywało jej.

    BTW jeśli wydaje Ci się że program będzie działał bezbłędnie, podłącz jakiś inny napęd, lub dwa. Będziesz sobie włosy z głowy wyrywał czemu napęd zwraca nagle jakieś błędy a twój program głupieje.

    Obecnie stworzyłem sterownik napędu, razem z wyświetlaczem, menu opcji, i RC5. Jak tylko uporam się z kolejnym znalezionym błędem to zamieszczę wszystko. Po prostu podłączyłem kolejny model napędu, i po odczytaniu rodzaju nośnika, przy próbie odczytania TOC, zwraca błąd że mechanika nie jest gotowa. W żadnym wcześniejszym napędzie tego nie miałem, każdy ustawiał flagę żeby oczekiwać na gotowość danych, a ja cierpliwie czekałem odczytując ją cały czas. A ten wywali błąd i trzeba wracać do początku odczytu TOC - a jeśli cały program zbudowany jest na podprogramach, to nie tak prosto wyrwać go z jednego ciągu i wysłać na początek, nie pozostawiając śmieci na stosie. Pozdrawiam.
  • #30 10149327
    komar54
    Poziom 11  
    Posty: 29
    Witam. Wiem, że jest to stary temat ale nie chciałem zakładać nowego. Korzystając z dużej ilości wolnego czasu spowodowanego opatrunkiem gipsowym :) postanowiłem zająć się zrobieniem odtwarzacza z cd-romu. Poczytałem dostępne tematy na forum, artykuły z EP i EdW i stwierdziłem, że jest to idealny "czaso-pochłaniacz". Oczywiście z racji problemów z uruchomieniem tego układu. Do działania przystąpiłem analizując Program ze strony EP 8/06 (kit AVT–941) oraz z kitu AVT-2660 ale były uwagi forumowiczów, że są w nim błędy, z którymi miałem nadzieję sobie poradzić. Przerobiłem trochę układ, bo nie miałem przerzutników i podpiąłem DA0..Da2, CS0,CS1 do portu D atmegi32. Obsługę klawiatury i Rc5 pominąłem i zamiast tego mam jeden przycisk do którego przypisuję funkcję którą chce sprawdzić. I teraz pojawia się problem, którego nie potrafię rozwiązać. Nie mogę (przynajmniej tak mi się wydaję) odczytać TOC. Program główny ograniczyłem do:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Niestety zmienna Track i Track_odtw jest równa 1.I nie mogę sobie z tym poradzić. Dodam, że inicjacja i identyfikacja przebiega poprawnie. Później dodałem przycisk, który obsługuje procedurę Stop_track. Mam jeden napęd posiadający przycisk play na obudowie, więc włączam, napęd odtwarza (słuchawki podłączone do napędu), naciskam przycisk i napęd przerywa odtwarzanie.
    Zamieszczę jeszcze procedury odczytu TOC ale jak ktoś się tym zajmował pewnie poznaje:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    [ATAPI] ATAPI: Nie działa komenda PLAY AUDIO 0x45 w odtwarzaczu CD - analiza kodu
    Czy dobrze myślę, że odczytuje ten bajt(AD1 i zaznaczenie w tabeli)?

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z implementacją komendy PLAY AUDIO (0x45) w odtwarzaczu CD opartym na napędzie ATAPI. Użytkownik zgłaszał, że komenda nie działa, a napęd nie odtwarza audio mimo poprawnego wysyłania pakietów i braku błędów w statusie. Wskazywano na różne wersje komend PLAY AUDIO (10, 12, MSF) oraz na konieczność prawidłowego formatu pakietu i zgodności ze specyfikacją ATAPI. Problemy z odtwarzaniem audio są powszechne, a różne napędy różnie reagują na komendy, co wymaga indywidualnego podejścia i testów. Wskazano na znaczenie resetu napędu, odpowiedniego czasu oczekiwania na gotowość oraz poprawnej obsługi błędów (REQUEST SENSE). Jeden z użytkowników potwierdził, że błąd wynikał z nieprawidłowej deklaracji tablicy pakietu w kodzie (char Packet zamiast char Packet[12]). Po poprawce udało się uruchomić odtwarzanie komendą PLAY AUDIO (10). Poruszono także kwestie odczytu długości ścieżki do odtworzenia za pomocą READ TOC i formatu MSF, co ułatwia zarządzanie czasem odtwarzania. W dyskusji pojawiły się także problemy z komunikacją niskopoziomową z napędem, konfiguracją linii danych i sygnałów kontrolnych, a także różnice w implementacji między napędami, w tym napędami typu slimline. Użytkownicy podkreślali, że sterowanie napędem CD wymaga dokładnego dostosowania do konkretnego modelu i często wymaga obejść specyficznych dla danego urządzenia.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA