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

ATmega8 - ATmega8 + WS2803 - programowe SPI (C)

kim126 25 Gru 2016 21:25 1557 25
  • #1 16149170
    kim126
    Poziom 13  
    Na początek chciałbym życzyć wszystkim wesołych świąt :)

    Męczę się z uruchomieniem układów WS2803, na elektrodzie nie ma nic na ten temat albo nie potrafię szukać.
    Idea jest taka aby za pomocą ATmega8 poprzez programowe SPI sterować układami WS2803. Programuję w czystym C.
    Wydaje mi się, że rozumiem zasadę działania tych układów jednak nie mam pojęcia jak podejść do tego od strony programowej.
    Być może ktoś z Was miał styczność z tymi układami i byłby w stanie mi pomóc, będę wdzięczny za każdą pomoc.
  • #6 16149483
    Konto nie istnieje
    Konto nie istnieje  
  • #7 16149547
    kim126
    Poziom 13  
    Próbowałem tego wcześniej ale brakuje mi wiedzy, żeby samodzielnie przekonwertować kod.

    wzór:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i to co przerobiłem
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    [/code]

    Buffer, shiftout i send - co zrobic z tymi funcjami? kompilator sypnał błedami
  • #8 16149556
    Konto nie istnieje
    Konto nie istnieje  
  • #11 16152593
    Konto nie istnieje
    Konto nie istnieje  
  • #12 16152620
    kim126
    Poziom 13  
    Widziałem i czytałem ten komunikat ale nie widzę miejsca w którym może brakować ";" z językiem C niedawno zacząłem zabawę, być może rzuciłem się na zbyt głęboką wodę ale teraz chciałbym już skończyć to co zacząłem i dlatego proszę Was o pomoc.
  • #13 16152646
    Konto nie istnieje
    Konto nie istnieje  
  • #14 16152659
    kim126
    Poziom 13  
    Próbowałem pozbyć się błędów i kombinowałem na podstawie innych działających kodów.
    Nie doszedłem jeszcze do stosowania dwóch pętli i skoków miedzy nimi, wiem, że można to jakoś robić za pomocą funkcji "goto" jednak wrzucając ją do tego programu nie porafię jej prawidłowo użyć.

    zmieniając na void loadWS2803() wychodzi coś takiego;

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i sypie większą ilością błedów;

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #15 16152761
    Konto nie istnieje
    Konto nie istnieje  
  • #17 16152941
    Konto nie istnieje
    Konto nie istnieje  
  • #18 16154097
    trol.six
    Poziom 31  
    kim126 napisał:
    zmieniając na void loadWS2803() wychodzi coś takiego;
    Można podglądać arduino, ale czy przepisywanie ma jakiś sens, szczególnie na etapie nauki C?

    Niech sobie kolega przeanalizuje ten kod (nie wiem czy jest bez błędów):

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #20 16155128
    Konto nie istnieje
    Konto nie istnieje  
  • #22 16155164
    Konto nie istnieje
    Konto nie istnieje  
  • #23 16156964
    trol.six
    Poziom 31  
    kim126 napisał:
    Kompilator nie wykazuje żadnych błędów ale też zero reakcji ze strony układu. Spróbuję przeanalizować cały kod może do czegoś dojdę.

    Jak już przeanalizujesz, albo i nie ... ;) napisz albo dopisz do tego na początku, (początek w C to funkcja main) program mrugający zwykłą diodą LED tak przez 5 sekund na jednym wyjściu, a potem przez 5 sekund na kolejnym itp.
    Będzie chociaż wiadomo czy atmega działa.

    Często program tak zaczynam, ponieważ zdarza się że np złączka od zasilania nie kontaktuje, albo występuje inny problem sprzętowy, i można tak spędzić bez sensu kilka godzin szukając błędu.

    Wtedy dalej można diagnozować również za pomocą LED (albo analizatora stanów), czy wychodzą impulsy z atmegi zgodnie z oczekiwaniami itp. itd.
  • #24 16157838
    kim126
    Poziom 13  
    Tak, też zrobiłem :) wczoraj miałem mało czasu i nie było kiedy napisać. Podłączyłem inna ATmege i program ruszył.

    Kombinowałem na różne sposoby i nadal nie rozumiem na jakiej zasadzie odbywa się sterowanie tymi układami z poziomu programu. Samą tabelę z datasheet zrozumiałem ale nie widzę co trzeba zmieniać w programie, by móc dostosowywać go do swoich potrzeb. Mógłbym Cię prosić abyś dorzucił kilka komentarzy? Zdecydowanie pomogłoby mi to w zrozumieniu.

    Co do samego SPI to jakiś czas temu uruchamiałem rejestry 74hc595 na sprzętowym SPI i nie miałem większych problemów, a tutaj szkoda gadać.
  • Pomocny post
    #25 16158404
    trol.six
    Poziom 31  
    kim126 napisał:
    Kombinowałem na różne sposoby i nadal nie rozumiem na jakiej zasadzie odbywa się sterowanie tymi układami z poziomu programu. Samą tabelę z datasheet zrozumiałem ale nie widzę co trzeba zmieniać w programie, by móc dostosowywać go do swoich potrzeb. Mógłbym Cię prosić abyś dorzucił kilka komentarzy? Zdecydowanie pomogłoby mi to w zrozumieniu.

    Musisz przerobić podstawy C (książka, kurs), tego nie da się dobrze zrobić w paru komentarzach, tak byś mógł pisać dalej sam.
    Możesz ćwiczyć na kompie, np na linuksie programiki. Mimo że kompilator się nie czepia, można tenże program napisać inaczej.


    Interfejs SPI ma dwie główne linie, danych i zegarową.
    WS2803 ma 18 diod, każda dioda sterowana liczbą 8 bitową (w programie dane to tablica uint8_t ledBar[nLEDs])
    Czyli na przesłanie całej zawartości do układu trzeba 144 impulsów.
    Dane wysyłamy od ostatniej diody patrząc od strony transmsji. Czyli pierwszej od końca.

    W programie ustawianie danych na lini odbywa się przez SDI_0, SDI_1,
    A zegar który wpisuje do rejestru przez CKI_0, CKI_1
    Ważne jest wiedzieć na jakim zboczu odbywa się wpisywanie aby dane były stabilne.
    Można to wyczytać z rysunku.
    ATmega8 - ATmega8 + WS2803 - programowe SPI (C)

    kim126 napisał:
    Tak, też zrobiłem :) wczoraj miałem mało czasu i nie było kiedy napisać. Podłączyłem inna ATmege i program ruszył.

    Dobrze by było, zdiagnozować atmege. W programie nie ma opóźnień, mogą one być konieczne jeśli atmega ma większy zegar albo linia jest badziewna ;)
    Opóźnienie (w tym przypadku niewielkie) dodajemy na sygnale zegarowym za pomocą np: _delay_us(czas);
    W naszym przykładzie przed zmianą z 0->1 i przed 1->0. Czyli CKI_0, CKI_1.


    kim126 napisał:
    Co do samego SPI to jakiś czas temu uruchamiałem rejestry 74hc595 na sprzętowym SPI i nie miałem większych problemów, a tutaj szkoda gadać.

    WS2803 to tak jakby 18 rejestrów 595.
    Samo wpisywanie do rejestru jest identyczne. Na zboczu 0->1
  • #26 16162018
    kamyczek
    Poziom 38  
    Tu nie jest problemem samo wpisywanie . Zwróćcie uwagę że nie ma tu sygnału cs jak w standardowym spi ważny jest więc początek transmisji to co na ilustracji dzieje się w czasie pierwszych 500us . Tego nie wygeneruje magistrala spi ani piny do niej przypisane . Należy albo połączyć sobie piny przez bramki logiczne i generować to osobnymi wyprowadzeniami , Albo wyłączyć spi odzyskać obsługę wyprowadzeń clk i data wygenerować to co jest w 500us i włączyć spi i wysyłać dane Dla układu ws2803 to co jest przed transmisją działa tak jak wyzwolenie linią CS bez tego dane są ignorowane bo układ nie ma pojęcia czy to początek transmisji czy jej środek .
REKLAMA