Piotrne
Guest
Sat Jun 21, 2008 1:05 am
Witam,
mam problem z prawidłową obsługą rejestratora dźwięku ISD2560,
podłączonego do mikrokontrolera (Atmel Mega 32). Nagrałem tam
kilkanaście komunikatów, da się je po kolei odtworzyć np.
w trybie push button. Potrzebna jest mi jednak możliwość
odtworzenia konkretnego komunikatu.
Układ ISD2560 działa z A4(M4)=A8=A9=1, A0(M0) sterowane przez
mikrokontroler (ozn. Isd_m0), pozostałe Ax=0. Mikrokontroler
steruje wejściami P/!R (ozn. Isd_pr), PD (ozn. Isd_pd), !CE
(ozn. Isd_ce).
Według dokumentacji, ogólna idea odtworzenia n-tego komunikatu
jest następująca:
- "przewijamy" pamięć na początek (impuls dodatni na PD)
- włączamy "przyspieszone odtwarzanie" (M0=1) przy !CE=1
- impulsujemy !CE (1->0->1) n-1 razy
- włączamy normalne odtwarzanie (M0=0)
- impulsujemy !CE jeden raz.
Niestety, efekty są przypadkowe... Odtwarzany (pseudo)losowy
komunikat (tzn. nie ten, którego potrzebuję) albo w ogóle nic.
Wstawiałem między instrukcje zmieniające stan linii różne
opóźnienia i wpływało to (również "losowo") na wyniki.
Jak to należy prawidłowo zrobić? Poniżej kod w Bascomie,
z pominiętymi opóźnieniami (waitms 1 albo więcej po każdym
przypisaniu) (oczywiście kod niedziałający).
Isd_pr = 1
Isd_pd = 0
Isd_pd = 1
Isd_pd = 0
For i = 2 To n
Isd_m0 = 1
Isd_ce = 0
Isd_ce = 1
Next i
Isd_m0 = 0
Isd_ce = 0
Isd_ce = 1
Pozdrawiam
P.
Mariusz Łacina
Guest
Sun Jun 22, 2008 10:48 am
Piotrne pisze:
Quote:
Witam,
mam problem z prawidłową obsługą rejestratora dźwięku ISD2560,
podłączonego do mikrokontrolera (Atmel Mega 32). Nagrałem tam
kilkanaście komunikatów, da się je po kolei odtworzyć np.
w trybie push button. Potrzebna jest mi jednak możliwość
odtworzenia konkretnego komunikatu.
Układ ISD2560 działa z A4(M4)=A8=A9=1, A0(M0) sterowane przez
mikrokontroler (ozn. Isd_m0), pozostałe Ax=0. Mikrokontroler
steruje wejściami P/!R (ozn. Isd_pr), PD (ozn. Isd_pd), !CE
(ozn. Isd_ce).
Według dokumentacji, ogólna idea odtworzenia n-tego komunikatu
jest następująca:
- "przewijamy" pamięć na początek (impuls dodatni na PD)
- włączamy "przyspieszone odtwarzanie" (M0=1) przy !CE=1
- impulsujemy !CE (1->0->1) n-1 razy
- włączamy normalne odtwarzanie (M0=0)
- impulsujemy !CE jeden raz.
Niestety, efekty są przypadkowe... Odtwarzany (pseudo)losowy
komunikat (tzn. nie ten, którego potrzebuję) albo w ogóle nic.
Wstawiałem między instrukcje zmieniające stan linii różne
opóźnienia i wpływało to (również "losowo") na wyniki.
Jak to należy prawidłowo zrobić? Poniżej kod w Bascomie,
z pominiętymi opóźnieniami (waitms 1 albo więcej po każdym
przypisaniu) (oczywiście kod niedziałający).
Isd_pr = 1
Isd_pd = 0
Isd_pd = 1
Isd_pd = 0
For i = 2 To n
Isd_m0 = 1
Isd_ce = 0
Isd_ce = 1
Next i
Isd_m0 = 0
Isd_ce = 0
Isd_ce = 1
Pozdrawiam
P.
Witam,
prawdopodobnie przyśpieszone odtwarzanie, to nie jest natychmiastowy
skok do końca komunikatu.
Sprawdź, czy nie jest wymagane czekanie na EOM\ po każdym cyklu CE\,
podczas adresowania.
Pozdrawiam,
Mariusz Łacina
Piotrne
Guest
Sun Jun 22, 2008 12:45 pm
Mariusz Łacina pisze:
Quote:
prawdopodobnie przyśpieszone odtwarzanie, to nie jest natychmiastowy
skok do końca komunikatu.
Sprawdź, czy nie jest wymagane czekanie na EOM\ po każdym cyklu CE\,
podczas adresowania.
To też sprawdzałem (czekanie na End Of Message) i nie wyszło dobrze
(EOM miał stan niezgodny z moim oczekiwaniem...). Sprawdzę to jeszcze
raz.
Doszukałem się informacji, że przyspieszenie jest 800-krotne. Jeśli
jeden komunikat trwa ok. pół sekundy, to 1-milisekundowa pauza
po impulsie CE powinna wystarczyć. Zresztą zwiększałem ją do 10 ms
i więcej, efekt zawsze zły. Tzn. błędy są inne, chociaż przy danych
opóźnieniach zawsze takie same.
Przypuszczam, że problemy biorą się z trochę dziwnego protokołu
obsługi odtwarzania w trybie "przyciskowym". Pojedynczy impuls CE
zaczyna odtwarzanie komunikatu aż do jego końca. Chyba, że podczas
trwania komunikatu wyśle się jeszcze jeden impuls - wtedy robi się
pauza. Jeśli nie ma kontroli nad odtwarzaniem (a w trybie
"przyspieszonym" nie za bardzo ta kontrola działa), to nie wiadomo,
czy kolejne impulsy CE inicjują kolejne komunikaty, czy też
robią start - pauzę - start... Sądziłem, że odczekanie kilku milisekund
po impulsie CE (w trybie przyspieszonym) rozwiąże problem,
ale niestety nie. Zresztą gdyby konieczne były aż tak duże opóźnienia,
rzędu kilkudziesięciu milisekund, to "przewinięcie" do wybranego
komunikatu trwałoby trochę za długo (kilka sekund?) Sprawdzę
jeszcze raz zachowanie wyjścia EOM.
Dziękuję i pozdrawiam
Piotr
Piotrne
Guest
Sun Jun 22, 2008 6:42 pm
Mariusz Łacina pisze:
Quote:
czekanie na EOM\ po każdym cyklu CE\
Sprawdziłem to jeszcze raz - zaczęło działać! Rzeczywiście,
przed kolejnym impulsem na CE\ trzeba poczekać na EOM\ = 0.
To też jest tylko krótki impuls, o długości 12.5 milisekundy.
Mam podłączone EOM\ do zwykłego wejścia (nie wyzwalającego
przerwań) i muszę stan EOM\ odpytywać w pętli. Ale program
nadąża i działa dobrze. Sprawdzę jeszcze, dlaczego
nie wystarczało odczekanie po impulsie CE\ "wystarczająco
długiego czasu", np. 50 ms (bez badania EOM\).
Po odtworzeniu komunikatu z normalną prędkością też należy
odczekać na EOM\=0. Próba wcześniejszego odtworzenia
innego komunikatu kończy się czasem ciszą.
Pozdrawiam
Piotr