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

Atmega32 i 74HC595: Błąd przy komunikacji SPI w LED Cube

Templarious 15 Mar 2013 20:45 3291 18
  • #1 12065171
    Templarious
    Poziom 22  
    Witam Serdecznie,

    Obecnie zbudowałem już układ składający się z 8 rejestrów 74hc595 podłączonych pod interfejs SPI ATMega32. Niniejszy układ jest dedykowany do LED Cube i stanowi moją pracę inzynierską ale posiadam pewien problem.

    Mianowicie przy nadawaniu do pierwszej kości 595 wiadomości 0xFF, pauza 1 sek, wiadomosc 0x00 i ponownie pauza 1 sek i to w pętli while(1) - układ włącza diode, wyłącza i to na tyle. przy kolejnej pętli nic się nie dzieje...

    Kod w C oraz schemat w załączniku elektroda.rar

    Jeżeli chodzi o wkład własny w kod i nie pojscie na łatwizne - posiadam książkę T.Francuza oraz przejrzałem sporo stron internetowych z wytłumaczeniem działania SPI w celu zlokalizowania problemu.

    PS. Fusebity - zegar 8 MHZ. reszta jak fabryka dała.
  • #2 12069804
    Templarious
    Poziom 22  
    Witam,

    Znalazłem przyczyne.
    jest to : SPI Interrupt Flag, ale jest to bit tylko do odczytu i nie wiem jak sie go pozbyc, kto mi pomoze ?
  • #3 12070058
    Sparrowhawk
    Poziom 22  
    Mogę się tylko domyślać, bo niekompletny ten kod chyba dałeś w tym załączniku, że masz nie obsłużone przerwanie od SPI. Można również skasować tę flagę (Datasheet str. 138)
  • #4 12070816
    Templarious
    Poziom 22  
    Witam,

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

    Niestety to nie załatwia sprawy.
    Tak samo jak:

    SPSR;
    SPDR; // Skasuj Flagę SPIF

    Włozyłem w to sporo pracy i zadne z tych dwóch rozwiązań nie działa.
    Jakieś pomysły ?

    Pozdrawiam
  • #5 12072485
    tmf
    VIP Zasłużony dla elektroda
    Jeśli flaga jest ustawiona to znaczy, że coś jeszcze w buforze jest i trzeba to odczytać. Przykłady komunikacji SPI masz w linku z mojej stopki (za darmo do ściągnięcia), przejrzyj, zobacz, zastosuj. Swoją drogą skoro robisz LED Cube to nie lepiej to zrobić na np. SCT2024, a nie 74xx595? Odpadnie ci konieczność lutowania rezystorów, a przede wszystkim SCT ma większy prąd wyjściowy. W sterowaniu jest to to samo, cenowo też wychodzi tak samo.
  • #6 12072642
    Templarious
    Poziom 22  
    Już mam zaprojektowaną płytkę pod 74hc595, skoro odchodzi konieczność lutowania rezystorów, podaruje sobie przeprojektowanie całego układu itd. - za dużo roboty : ) (ale dziękuje za wskazanie innego rozwiązania).

    Co do SPI i flagi SPIF, przeczytałem w książce Tomasza Francuza, że jeżeli obsłużę przerwanie od zakończenia transmisji SPI, automatycznie usunie się flaga SPIF. Sprawdzę to dzisiaj wieczorem i jeśli pomoże - napisze, jeśli nie, będę dalej prosił o Waszą pomoc.

    Dziękuję za zainteresowanie tematem, wiele to dla mnie znaczy.
    Już zaglądam do stopki i czytam. Może to coś pomoże.. ---- Właśnie sprawdziłem stopkę, mam te książkę i na niej się wzoruje.
  • #7 12072844
    tmf
    VIP Zasłużony dla elektroda
    To świetnie, masz tam też działające przykłady transmisji SPI także do 595. Po prostu je użyj :)
    BTW, 595 ma stosunkowo niewielką wydajność prądową - na całą kostkę prąd nie może przekroczyć o ile pamiętam 70mA. Dla SCT to jest 40-70mA ale na diodę, w dodatku SCT steruje 16 wyjściami, więc jeden zastępuje dwie kości 595.
  • #8 12072950
    AndrzejZ82
    Poziom 2  
    Nie ustawiłeś MISO jako wejścia. W kodzie masz wszystkie piny z portu B ustawione jako wyjścia.
  • #9 12073430
    Templarious
    Poziom 22  
    Zgodze się z Tobą, że STC jest dużo lepszy nić 595 : )

    AndrzejZ82, kod: DDRB = 0xBF; // MISO wejście reszta wyjścia
    inaczej binarnie : 10111111 co oznacza MISO wejście, reszta wyjścia :).

    Jestem jeszcze przed próbą obsługi przerwania SPI aby sam sprzętowo skasował flagę SPIF. Dam znać.
  • #10 12115037
    Templarious
    Poziom 22  
    Mam następujący kolejny błąd :

    SPI Collision FLAG. Przerwania nie naprawiły błędy. ktoś ma pomysł ?

    Dodano po 1 [godziny] 15 [minuty]:

    Witam,

    Naprawiłem problem.
    Napisałem jeszcze raz od nowa cały program, problem był w tym, że kompilator nie za bardzo rozumiał kodu w postaci (1<<PB4) gdzie był zatrzask. SPIIF kasuje poprzez

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


    Temat uwazm za zamknięty. Dziekuje za okazaną mi pomoc.
  • #11 12116567
    Ostry23
    Poziom 18  
    Cytat:
    problem był w tym, że kompilator nie za bardzo rozumiał kodu w postaci (1<<PB4)


    Bzdura. Kompilator wszystko dobrze rozumiał, to mądre zwierzę jest.
    Chciałeś wykonać
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A niby jak kompilator miał wykonać coś, co znajdowało się za instrukcją return?
    Zrozumiał, że ma to wywalić z kodu. Czytasz w ogóle warningi kompilatora?

    Poza tym (1<<PB4) to dokładnie to samo co _BV(PB4).
    Jeśli używasz Atmel Studio to polecam dobry skrót klawiszowy (gdy kursor jest na nazwie makra, funkcji, struktury itp.) - ALT + G - przenosi cię od razu do definicji danej konstrukcji - w ten sposób nawet bez czytania dokumentacji do avr-libc szybko się można zorientować, co tam siedzi.
  • #12 12117249
    Templarious
    Poziom 22  
    Kompilator czepiał sie dokladnie tego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

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

    Pomogła.

    kod wygląda tak:

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


    I jak widać, nie ma tutaj return SPDR i działa.
  • #13 12117521
    Ostry23
    Poziom 18  
    Templarious napisał:
    I jak widać, nie ma tutaj return SPDR i działa

    Wg mnie właśnie dlatego zadziałało, tzn. dlatego, że teraz nie ma nic za instrukcją return. Zmiana (1<<SPIF) na _BV(SPIF) to żadna zmiana.
    Jaki warning dawał kompilator?
    (jeśli możesz wklejaj dłuższy kod w znacznikach SYNTAX - patrz regulamin).
  • #14 12117543
    BlueDraco
    Specjalista - Mikrokontrolery
    Tylko tak Ci się wydaje, że kompilator tego się czepiał. Popatrz na definicję _BV - to to samo, co miałeś. Problem był zapewne gdzie indziej. Poszukiwanie magii w kompilatorze to nie jest dobra metoda na poprawianie programów.

    Działa bez return, bo Twoja funkcja nie zwraca wartości odczytanej z SPI - instrukcja return jest potrzebna, gdy funkcja ma typ inny niż void. Problem nie polegał na samym return, tylko na tym, że miałeś instrukcję umieszczoną po return, która nigdy nie była wykonywana.
  • #16 12119061
    Templarious
    Poziom 22  
    Niestety co do Warninga nie moge już go podać, nie mam tego starego "złego" kodu.

    znacznik <syntax> ? // w regulaminie nie znalazłem nic.

    Zastanawia mnie fakt jak można pisać animacje na LED Cube wykorzystujac 74hc595... czy oprzeć to na tablicach ręcznie pisanych czy może zrobić funkcję.. mam niezłą zagwozdkę.
  • #18 12120888
    Templarious
    Poziom 22  
    Zastosowałem się i zmieniłem oznaczenia kodu w znacznikach syntax w moich poprzednich postach.

    Chciałbym zapytać się o techniczne rozwiązanie (wskazanie kierunku) w jaki sposób pisać animacje do LED Cube opartego na 74hc595 na SPI. Czy pisać funkcję czy może operować na tablicach, używać timerów etc..

    Ja sam mam pomysł żeby napisać funkcję do obliczenia animacji, wrzucac ją do tablicy 2-wymiarowej i wtedy uużywając SPI, wrzucać zawartość tablicy na SPI i na LEd Cube. do tego jakoś sterować warstwami. Dobrze kombinuje ? (bez użycia timerów itd.)
  • #19 12156172
    Templarious
    Poziom 22  
    Animacje napisane, wszystko działa. (SPI również)

    Temat do zamknięcia.
REKLAMA