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

ATmega64A - komunikacja po SPI z potencjometrem AD8403 [rozwiązany]

arturromarr 25 Kwi 2015 21:46 891 3
  • #1 14645898
    arturromarr
    Poziom 17  
    Witam,
    Mam prośbę o pomoc do osób, które mają doświadczenie w komunikacji z potencjometrem cyfrowym AD8403.
    Mam dziwny problem ze skonfigurowaniem interfejsu SPI gdyż Mikro-kontroler ustawia stany na potencjometrze ale tylko kilkadziesiąt razy po włączeniu zasilania.
    Okroiłem program do testów jedynie do pętli wysyłającej po SPI i na oscyloskopie pojawia się te kilkadziesiąt przebiegów. Nawet po zaprogramowaniu (JTAG) jest cisza dopiero po odłączeniu zasilania się pojawia krótka seria.
    Po tym czasie program zawisa w warunku oczekiwania na zakończenie transmisji.
    Linie MOSI, CLK i CS podciągnięte opornikiem do zasilania.
    Konfiguracja transmisji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dziwne też, że jak ustawiam inny rodzaj transmisji: z CPOL to nic nie zmienia czyli działa przez moment.
    Sam program teraz to praktycznie sam pętla:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Fusebity: L: E4, H: B9 E: FF.
    Jest tu ustawiane bez SPIEN, ale robiłem też z nim i nic nie dawało.
    Czy SPIEN dotyczy też programowej komunikacji po SPI czy tylko wczytywania programu po SPI, bo MEGA 64 ma osobne piny do programowania szeregowego PDI, PDO?
    Co może być nie tak?.
    Program jak był w wersji docelowej przerwania itd.. zawsze kilka razy wysyłał dane do potencjometru (ale tylko po włączeniu zasilania a następnie wieszał się w wierszu oczekiwania na zakończenie transmisji:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Czy są jakieś szczególne ustawienia dla Mega 64?
    Czy jest jakiś inny problem?

    Proszę o pomoc (może jakieś linki do sprawdzonych programów) i pozdrawiam.
  • Pomocny post
    #2 14646124
    piotrva
    VIP Zasłużony dla elektroda
    Problem jest podstawowy - aby SPI poprawnie pracowało w trybie MASTER pin SS sprzętowy (u Ciebie PB0) musi być skonfigurowany jako wyjście.
    Zatem dodaj linijkę DDRB |= (1<<PB0); i problem powinien ustąpić.
    Teraz zachowanie jest losowe, bo pin zapewne wisi w powietrzu i czasem "łapie" stan umożliwiający pracę SPI jako master, a czasem "łapie" stan blokujący SPI (wtedy program się zawiesza zapewne w którejś pętli oczekiwania przy transmisji SPI).
  • #3 14659607
    arturromarr
    Poziom 17  
    Dzięki,
    Dokładnie taki był problem.
    Układ śmiga jak szalony.
    Trochę szkoda że gdy korzystamy z SPI jako master (nie multimaster) to musimy mieć zablokowany pin SS.
  • #4 14659755
    piotrva
    VIP Zasłużony dla elektroda
    Jeszcze jedna ważna kwestia - czasem sekwencja zmiany CS w układzie slave powoduje nie tylko wyłączenie/włączenie odbierania danych, ale także resetuje transmisję - np. w sytuacji gdy slave "zgubi" jakiś bit
REKLAMA