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

LC72131 w głowicy, jak sterować z attiny13

Tomekkoko 06 Wrz 2011 18:51 10013 16
REKLAMA
  • #1 9901410
    Tomekkoko
    Poziom 15  
    Witam,
    W ramach ćwiczenia się w C i bascomie na uC AVR postanowiłem sterować głowicą YST982-B0E3.
    Znalazłem dla niej opis wyjść/wejść. Głowica ma sterowanie PLL na LC72131, do tego LA1844.
    LC72131 sterowanie jest protokołem Sanyo CCB. Gotowców jako takich nie ma, jednak przeszukując i czytając forum, postanowiłem że spróbuje sam opanować ten protokół szeregowy.

    LC72131 ma wejścia
    CL (zegar)
    CE (chip enable) zatrzask?
    DI (data input) dane
    Jeszcze jest wyjście DO, ale na razie chce się skupić na wysyłaniu, by móc coś usłyszeć.

    Jeśli dobrze odczytuje z pdf-u tego układu.
    W pierwszym trybie INT1,
    za pomocą DI wysyłam najpierw 8 bitów adresu (by ustawić rejestry?)
    Następnie 15 bitów danych, po czym jakieś 4 bity których nie rozumiem(SNS, DVS, CTE, XS) po czym znów kolejne 4 bity (R0, R1, R2, R3, - kolejne rejestry do ustawienia częstotliwości referencyjnej ?)

    Teraz jak to nadawać?
    CL to zegar, sygnał prostokątny którego stan niski oraz wysoki nie mogą być krótsze niż 0.75us. Każdy takt zegara, czyli stan niski i stan wysoki, to czas na wpisanie jednego bitu?
    Z jaką częstotliwością mam wysyłać ten przebieg? Jak to obliczyć na attiny13?

    CE - niby tyko wybór chipa, ale nie wiem dlaczego w niektórych momentach ma mieć stan niski a niektórych wysoki.
    Z przebiegów przykład; gdy zacznę stanem niskim na CL nadając bit A3, po czym 0.75us zmienię na stan wysoki, czekam znów 0.75us i normalnie zmienił bym znów stan na niski, lecz w tym momencie zmienia się stan CE z niskiego na wysoki.
    Także znów czekam 0.75us zatrzymując stan wysoki na CL oraz wpisując dalej bit A3?
    Podobnie dzieje się z zegarem w trakcie zapisuj P3, tyle że bez zmiany stanu CE.

    Jak to wykonać taką transmisję? CL podpiąć się do pwm i próbować wysterować prostokątem?

    Nie jestem urodzonym programistą, ale próbuje coś ogarniać. Jednak takie szybko zmienne rzeczy sprawiają mi jeszcze trudności.
    Wszelkie sugestie mile widziane. Jeśli mieli byście jakiś pomysł był bym rad gdybyście podzielili się swoimi przemyśleniami, kawałkiem kodu w C lub bascom.

    Dodaje wyprowadzenia głowicy, bo nie jestem pewien jak się podpiąć.
    LC72131 w głowicy, jak sterować z attiny13

    Naskrobałem coś takiego wysyłając bity na piechotę. Nie działa niestety i nie wiem czy ma prawo działać.
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 9909132
    maciej_333
    Poziom 38  
    Ta "głowica" to właściwie cały odbiornik radiowy. Podłączenie jest łatwe, ale nie wiem do czego mogą być piny 1 i 2 tej głowicy. Pin 2 (aktywne 0) to pewnie przełączanie mono/stereo.

    Nie trzeba tu stosować PWM. Piny głowicy 7...10 trzeba dołączyć do mikrokontrolera. Cały protokół zaś należy napisać samodzielnie. Najpierw należy wybrać tryb transmisji. Niech to będzie IN1. CE ma aktywne 1, ale przy ustawianiu adresu ma mieć ustawione 0 (zgodnie z pdf). Zatem przy ustawianiu trybu trzeba ustawić linię CE na 0, potem odczekać trochę dla ustabilizowania się stanu linii CE (ok. 1us). Kolejno wysyłamy bity B0...B3 i potem A0...A3. Cały wysyłany ciąg to 00010100. Zatem to wysyłanie polega na ustawieniu 0 na linii DI, potem odczekanie 1us na ustabilizowanie się DI. Następnie na narastające zbocze na CL stan linii DI zostanie zapisany gdzieś w rejestrze przesuwnym PLL. Potem analogicznie wysyłamy inne bity. Kiedy wyślemy te 8 bitów zgodnie z PDF powinniśmy ustawić CE na 1. Teraz niby już można powiedzieć, że "I/O mode determined" :D. Linia CL w momencie, gdy nie ma transmisji może mieć 0, lub 1 (wspominają o tym w PDF). Umówmy się, że będzie to 0.

    Ten ciąg 00010100 to adres dla IN1. Opisana powyżej sekwencja pozwala właśnie wybrać tryb transmisji. Trzeba go wysyłać zawsze przy komunikacji z PLL. Chodzi tu o to, że w IN1 i IN2 można zapisywać inne bity, po to właśnie są te adresy itd.

    W trybie IN1 trzeba ustawić dzielnik za pomocą P0(LSB) ... P15(MSB). Ustawimy bit DVS na 1, SNS może mieć dowolną wartość. Kolejno nastawiamy R3...R0. jest to częstotliwość odniesienia (krok PLL). Jeżeli np. na P0...P15 mamy wpisane 4000, na R3...R0 zaś 0010 (25KHz), to 4000*25KHz=100MHz. To będzie częstotliwością heterodyny. Odbiornik odbierze teraz na częstotliwości 100MHz-10,7MHz=89,3MHz. Oblicz sobie podobnie częstotliwość dla jakiejś stacji. XS to wybór rezonatora. Trzeba otworzyć puszkę głowicy i ustawić na tym bicie 0/1 zależnie od kwarcu. CTE jest do pomiaru częstotliwości p.cz. Jednak nas to teraz nie interesuje i ustawiamy go na 0.

    W trybie IN2 musimy ustawić UL0 i UL1. Są to bity, opisujące błąd komparatora fazy. Ustawmy UL1 na 0, a UL0 na 1. Kolejno trzeba ustawić jakąś "martwą strefę" komparatora fazy. Ja bym ustawił bity DZ1 i DZ0 na 0. DLC ustawiamy na 0. Reszta nas tu nie interesuje i można to wyzerować.

    Po takich wysyłkach odbiornik już powinien pracować. Można zmierzyć napięcie na wyjściu filtru dolnoprzepustowego w głowicy i przekonać się czy PLL "chwyciła". Ponadto można też sprawdzić to miernikiem częstotliwości, sprzęgając się indukcyjnie z cewką heterodyny.
  • REKLAMA
  • #3 9909397
    Tomekkoko
    Poziom 15  
    Napisze jak próbuje to robić u siebie:

    1.PORTB.0 do CL
    PORTB.4 - DI
    PORTB.5 - CE
    DO - na razie wisi, bo nie chcę nic odczytywać.


    Napisałem teraz coś takiego ale nie bangla:( Tz teraz nie mam już jak tego sprawdzić bo zablokowałem sobie programowanie spi bo ustawiałem port5 jako i/o :(




    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #4 9909557
    maciej_333
    Poziom 38  
    W tym programie w każdej iteracji pętli wstawiasz kolejne elementy tablicy "bity" do zmiennej x. Jednak potem wystawiasz tylko jeden bit i już następna iteracja. Tablica "bity" składa się z bajtów (rozrzutność definiować ją jako int). Zatem to co masz jest błędne. Tu potrzeba zagnieżdżania pętli. Tzn. musisz mieć jeden for w drugim. Ten zewnętrzny będzie pobierał bajty z tablicy "bity", wewnętrzny wystawiał poszczególne bity z danego bajtu i sterował liniami DI i CL.

    Co do problemu z zablokowanym uC, to niestety musisz wstawić nową kostkę, albo zaprogramować ją w programatorze równoległym.
  • #5 9909991
    Tomekkoko
    Poziom 15  
    maciej_333 napisał:
    W tym programie w każdej iteracji pętli wstawiasz kolejne elementy tablicy "bity" do zmiennej x. Jednak potem wystawiasz tylko jeden bit i już następna iteracja.

    Nie bardzo rozumiem o co chodzi. Jeśli dobrze myślę to za każdym razem przejściem pętli do zmiennej x zapisuje wartość i-tego elementu tablicy. Czyli jeśli pętla idzie pierwszy raz to wstawia 0, drugi-0, trzeci-zero, czwarty-1 itd.
    Czy moje myślenie jest błędne?

    Cytat:
    Tablica "bity" składa się z bajtów (rozrzutność definiować ją jako int).

    Faktycznie, wystarczy char;)

    Cytat:
    Tu potrzeba zagnieżdżania pętli. Tzn. musisz mieć jeden for w drugim. Ten zewnętrzny będzie pobierał bajty z tablicy "bity", wewnętrzny wystawiał poszczególne bity z danego bajtu i sterował liniami DI i CL.


    Czyli jakoś tak?:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Cytat:
    Co do problemu z zablokowanym uC, to niestety musisz wstawić nową kostkę, albo zaprogramować ją w programatorze równoległym.

    Biegnę właśnie po nową kostkę.
  • REKLAMA
  • #6 9910064
    maciej_333
    Poziom 38  
    Właściwie, to zauważyłem, że te fory są błędne. Chodzi mi o warunki końcowe. To powinno wyglądać jakoś tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Nie bardzo znam C, mogę pomóc napisać to w asemblerze AVR'a. Zrozumiałem, że "bity" to tablica, w której jeden element to jeden bit... Nie sądziłem, że program jest tak nieoptymalny i dlatego też pisałem o zagnieżdżaniu pętli. Wynikło to z moich założeń odnośnie pisania kodu.

    Zakładam, że dane w tablicy bity są poprawne. Tzn. najpierw pewnie masz adres dla IN1, potem dane dla IN1. Następnie znajduje się adres dla IN2, potem dane dla IN2.
  • #7 9911075
    Tomekkoko
    Poziom 15  
    Po tym programie się uruchomił, ale nie wiem dlaczego reaguje tylko na fale AM.
    Kiedy zbliżam rękę do wejścia anteny to reaguje.
    Może źle wpisałem dane do tablic?
    Z moim obliczeń wynika, że jeżeli chce ustawić F na 96Mhz to przy kroku 50khz muszę wpisać 1706 co w hex 0x06AA. Zapisując od najmłodszego czyli:
    0 - 0000
    6 - 0100 czy może 0010??
    A - 1010 czy może 0101??
    A

    Musze robić coś nie tak, bo znów milczy:(
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #8 9911276
    maciej_333
    Poziom 38  
    Program zrób z jedną pętlą. Doszliśmy już do tego, że dla tablicy bity wystarczy jedna pętla. Twój for nigdy się nie wykona. Pętle te działają do czasu, gdy warunek jest spełniony. Dlaczego w pętli jest tyle warunków ??? Wystarczyłby jeden.

    Nie wiem jak wyliczyłeś to 1706. Jeżeli stacja ma częstotliwość 96MHz, to heterodyna ma mieć 96+10,7=106,7MHz. 106,7/0,05=2134 - tyle ma być wpisane w bity P0...P15. W bin jest to 0000100001010110. Teraz P0 to LSB, P15 MSB. Zatem trzeba to zapisać "od końca" ponieważ w tym protokole transmisja odbywa się od LSB.

    Możliwe też, że dla uruchomienia tej głowicy trzeba coś wystawić na pinach sterujących - portach uniwersalnych, które ma scalak PLL. Można próbować to ustalić na podstawie analizy płytki głowicy.
  • #9 9912250
    Tomekkoko
    Poziom 15  
    Pomyliłem znaki, przepraszam

    Czy mogę mieć prośbę do ciebie, byś napisał pewny program, który wysyła takie bity jak powinien? Sprawdził bym czy trzeba jakieś tany podać na piny układu, mając chociaż pewność ze wysyłam mu prawidłowo bity.

    Tuner się uruchomił ale reaguje tylko na antenie AM
    Kod który mu wrzuciłem:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 2 [godziny] 27 [minuty]:

    Zaczynam się irytować. Żeby sprawdzić jak kontroler wystawia bity na wyjścia dałem opóźnienie 2sec i zrobiłem prostą pętle:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    I na PB0 pojawia się co ok 2 sec stan wysoki, ale na PB1 wystawia się nie po powiedzmy 16 sec, tyko losowo ? Co do robię źle?
    W c pisałem raczej na PC, na uC jest widzę trochę inaczej, ale te operacje powoli mnie przerastają:(
  • #10 9913658
    maciej_333
    Poziom 38  
    Może jakoś tak ?
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Nie znam się zbytnio na C. Przełączanie AM/FM wykonuje się w pinie 11 LA1844, natomiast pin 10 to wyciszenie. Należy ustalić jak sterowane są te wyprowadzenia. Nie wnikałem w zawartość tablicy bity. Może masz wartości w złej kolejności, albo nie poprawiłeś dzielnika ?
  • #11 9913700
    Tomekkoko
    Poziom 15  
    Poprawiłem bo miałem błędy. Zrobiłem sobie opóźnienia na 1sec i liczyłem impulsy zera i jedynki na CE i DI, i zgadza się z tablicą, ale tuner dalej nie odpowiada, zaraz się zabiorę za analizę płytki:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodano po 24 [minuty]:

    11 i 10 wysterowane jest odpowiednio pinem 9 i 10 (BO3, BO4), Jak podam na obie jednocześnie masę to tuner wyłącza wyciszenie? Ale wciąż reaguje tyko na antenę AM. Na LC na tych wyjściach jest stan wysoki.

    Bo zmianie w IN2 bitów BO3 i BO4 na 1 czyi stan niski, tuner dalej nie bangla :(
    Dalej utrzymuje san wysoki na nich, tak jak by w ogóle nie zapisywało się nic do rejestrów



    Poprawiłem kod, miałem pomyłkę w ostatnim if-ie. Tuner odpalił ale wciąż jest na AM
    Na 11 nóżce LA jes 0.8V a na 11 nóżce LC jest 0V. Coś musiałem pochrzanić może z ustawieniami heterodyny? Ewentualnie jakie wyjścia LC lub wejścia LA powinienem sprawdzić?
  • #12 11227050
    Gibol
    Poziom 17  
    Witam, dokonał się jakiś progress w tym temacie może?
  • #13 11227783
    Tomekkoko
    Poziom 15  
    Gibol napisał:
    Witam, dokonał się jakiś progress w tym temacie może?

    Głowica leży nieużywana. Jeśli ktoś nauczy mnie algorytmu dla softwarowej transmisji szeregowej to może coś ruszę.
    Obecnie nie jestem nawet pewien czy głowica jest sprawna.
  • #14 14479884
    ArturekAbdulek
    Poziom 12  
    Głowica pewnie sprawna tylko kod napisany nie ciekawie. Podobnie jak autor próbowałem uruchomić "radio" na układach LC72131 i LA1844. Na głowicy napisane jest MV014MA-B1. Zamieszczam kod w c i zdjęcia głowicy AM/FM. Uruchamiałem tylko na FM. Na AM tez będzie działał kod jedynie należy go LC72131 w głowicy, jak sterować z attiny13 LC72131 w głowicy, jak sterować z attiny13 trochę przerobić.
    Załączniki:
  • #16 18300929
    bucho
    Poziom 11  
    Witam układ przedmówcy kostakis07 wykonany sprawdzony program do sterowania LC72131dziala w 100%.Polecam
REKLAMA