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

[Atmega48]Obsługa UART synchronicznie z zewnętrzym zegarem

mientos 21 Sie 2008 13:59 1640 10
REKLAMA
  • #1 5459650
    mientos
    Poziom 12  
    Od godziny próbuję rozkminić, jak przez UART'a przesłać bajty synchronicznie z zewnętrznym zegarem. Dokładnie dane mają być wysyłane/odbierane tak(przykłądowe 3 bajty:
    
        ATT    -______________________________________________________________
                  |   Byte 1     |    |   Byte 2     |    |   Byte 3     |
        CLOCK  ---_-_-_-_-_-_-_-_-----_-_-_-_-_-_-_-_-----_-_-_-_-_-_-_-_-----
                       0xFF                0x41                0x5A 
        DATA   -------------------------__________--__----__--__----__--__----
                       0x01                0x42
        CMND   -----_____________-----__--________--__------------------------
    
        ACK    --------------------__-------------------__-----------------__-
    


    Teraz opis:
    ATT(wejście) - jeśli stan niski - to mam odebrać dane.
    CLOCK - wiadomo
    DATA(wyjście) - Dane, które mam wysłać szeregowo
    CMND(wejście) - Dane, które mam odebrać szeregowo
    ACK(wyjście) - Ustawiam stan niski na chwile, jak skończę odbierać lub wysyłać

    Nie wiem jak ustwić rejestr kontrolny, żeby był 8 bitowy, nie miał bitów startu i końca i najważniejsze jaki baudrate ustawić, żeby wysyłało/odbierało zgodnie z tym schematem na górze, taktowania zegara nie znam, bo to w PSX jest.

    Myślałem też, żeby zrobić bez UART'u, tylko żeby na normalnym porcie bity ustawiać, wtedy bym nie miał żadnych problemów, tylko, jak mam bajt, to jak będę ustawiał jego bity, muszę robić operacje na bitach, a to zajmie parę taktów i się nie wyrobi.

    PS.
    Chodzi mi o pad do PSXa tutaj jest link do opisu: http://www.gamesx.com/controldata/psxcont/psxcont.htm
    Ten schemat jak ma wyglądać komunikacja wziąłem z tej strony.

    Będę bardzo wdzięczny za pomoc, dzisiaj jeszcze chcę sobie pograć na PSX :P.
  • REKLAMA
  • #2 5459773
    szelus
    Poziom 34  
    Protokół to jest raczej SPI. W mega48 możesz ustawić USART do pracy w tym trybie (rozdział 19 w pdf), albo lepiej użyć wbudowanego układu SPI.
    Sygnały ATT i ACK będziesz, tak czy owak, musiał obsługiwać programowo.
    ---
    Ups.. autopoprawka. USART może tylko pracować jako master SPI, a Ty potrzebujesz slave. Zatem tylko wbudowany interfejs SPI.
  • #3 5461286
    mientos
    Poziom 12  
    Dzięki :D właśnie o to chodziło, nigdy nie korzystałem z SPI(tylko przy programowaniu uC), więc nie wiedziałem co to jest. 2 godziny czytałem dokumentacje i już wiem jak zainicjalizować SPI dla moich potrzeb i odbierać z przerwaniem. Nie wiem tylko jak wysyłać jako slave. Tak samo jak na master, czyli, że do SPDR wrzucam bajt? A skąd uC wie, że ma wysłać, a nie są to odebrane dane?
  • REKLAMA
  • #4 5461534
    Pijopic
    Poziom 17  
    No to juz twoja glowa zeby wiedzial, kazdy uklad ma zbior instrukcji ktore okreslaja co ma w danej sytuacji zrobic, np jak dostaje 0x45 to odpowiedziec 0x35 a jak 0x25 to zapisac nastepny bajt jaki otrzyma itd itp... Jako ze kazdy uklad ma swoj zestaw instrukcji, a avr takowego nie ma by moc pracowac w dowolnej konfiguracji, to sam musisz taki zestaw instrukcji dla niego stworzyc w oparciu o to co bedzie otrzymywac do przetworzenia.
  • #5 5462131
    mientos
    Poziom 12  
    Cytat:
    No to juz twoja glowa zeby wiedzial, kazdy uklad ma zbior instrukcji ktore okreslaja co ma w danej sytuacji zrobic, np jak dostaje 0x45 to odpowiedziec 0x35 a jak 0x25 to zapisac nastepny bajt jaki otrzyma itd itp... Jako ze kazdy uklad ma swoj zestaw instrukcji, a avr takowego nie ma by moc pracowac w dowolnej konfiguracji, to sam musisz taki zestaw instrukcji dla niego stworzyc w oparciu o to co bedzie otrzymywac do przetworzenia.


    Źle mnie zrozumiałeś - wiem co mam wysyłać, tylko nie wiem jak. W pdf w przykladzie do master jest wysyłanie, a w przykładzie slave odbieranie i nie wiem czy na slave wysyła się takim samym sposobem jak na master? Tylko jak wrzuce bajt do SPDR, to skąd Atmega wie, że ma to wysłać, a nie są to odebrane dane(bo w tym rejestrze dostaje odebrane dane)? Jakieś flagi ma czy coś, czy wogóle innym sposobem się wysyła jako slave?
  • #6 5462172
    szelus
    Poziom 34  
    SPI działa tak (i ten protokół PSX chyba też), że master podaje sygnał zegarowy i w każdym cyklu jeden bit danych jest przesyłany z mastera do slave-a i w tym samym momencie jeden bit jest przesyłany od slave-a do mastera. Czy master i slave wymieniają sie zawsze danymi. Nie ma transmisji jednokierunkowej.
    W praktyce:
    1. Master wysyła komendę. W tym samym momencie odbiera coś od slave-a - w zależnośći od protokołu (wyższego poziomu) może to być "pusty" (nieistotny) bajt lub np. odpowiedź na poprzednia komendę.
    2. Master musi dać czas urządzeniu slave na utworzenie odpowiedzi, a następnie musi wysłać np. następną komendę (lub jakiś "pusty" bajt) aby odczytać odpowiedź.
    3. Po odebraniu komendy slave wpisuje odpowiedź do rejestru SPDR. Kiedy to zostanie odczytane - to już problem master-a.
  • #7 5462187
    Pijopic
    Poziom 17  
    Wysylasz tak samo, jedyna roznica to, ze tylko w odpowiedzi, a nie jak w przypadku gdy avr jest masterem, ze to on steruje przeplywem danych.
  • REKLAMA
  • #8 5462236
    mientos
    Poziom 12  
    Dzięki :D właśnie o to chodziło, czyli w moim wypadku w przerwaniu pisze SPDR = ....

    @szelus
    Dzięki, że wytłumaczyłeś jak to działa :D, bo nie wiedziałem, że dane wysyłane są w tym samym momencie, co odbieranie. Czyli(w slave) to co w SPDR wypychane jest przez odebrane(od mastera) dane do mastera.

    Jeszcze jedno, jak kontrolować linią ACK, czyli skąd mam wiedzieć na ile czasu ustawić stan niski, nie znając taktowania PSX?
  • #9 5462590
    Pijopic
    Poziom 17  
    Linia ACK, czy sygnal ACK, a moze chodzi Ci o linie CS?? Tak czy inaczej okreslenie dokladne czasu wymaga znajomosci szybkosci magistrali, a tak to mozesz tylko na wyczucie dobrac czas sprawdzajac rozne wartosci dla roznych szybkosci standardowych. Mozesz tez zmierzyc czas trwania impulsu i na podstawie tego wyliczyc potrzebne parametry...
  • REKLAMA
  • #10 5463063
    mientos
    Poziom 12  
    Chodzi o sygnał ACK, jak długo go dać na stan niski, ale już sobie poradziłem:
    Czekam na transfer(loop_until_bit_is_set(SPSR, SPIF)), jak przejdzie to ustawiam ACK na 0, do SPDR wrzucam dane i czekam aż zacznie się transfer(loop_until_bit_is_clear(SPSR, SPIF)) i daje ACK na 1. Wtedy ACK jest w stanie niskim w przerwie między transferami.
  • #11 5463337
    Pijopic
    Poziom 17  
    Tak tez mozna. A nie lepiej zmierzyc czas trwania zero za pomoca timera, zapisac wartosc w epromie, odczytac programatorem wartosc, wyliczyc i uproscic kod??
REKLAMA