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

[atmega8][c] potencjometr cyfrowy SPI

Talvort 17 Maj 2011 18:36 2209 3
REKLAMA
  • #1 9516550
    Talvort
    Poziom 10  
    Witam
    Mam problem z wysterowaniem potencjometru cyfrowego MCP42010 (8 bit) w wersji dual przez SPI.

    Sam potencjometr z pewnością działa, bo przy poprzednich próbach wykorzystując SPI sprzętowe, podczas programowania atmegi przez ISP z komputera przy okazji programował się także potencjometr - miałem podłączoną diode LED do wyjścia potencjometru i widziałem jak zmienia sie natężenie światła.

    Ostatecznie postanowiłem wykorzystać jednak SPI programowy, doszedłem do takiego kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Jednak nic sie nie dzieje - po włączeniu, potencjometr załączą sie z domyślną wartością rezystancji - dioda podłączona do wyjścia świeci lekkim światłem. Czyli po prostu potencjometr nie łapie komend, bo ten sam efekt jest, kiedy nic do niego nie wyśle.

    I tu nie wiem, czy mój kod do obsługi SPI ma błędy
    Czy wysyłam niewłaściwe wartości do wysterowania- jeśli dobrze zrozumiałem to co jest w dokumentacji (Link) to najpierw należy wysłać komendę z odpowiednio ustawionymi bitami, określającymi co chce zrobić (odczytać; zapisać; wyłączyć) i którego kanału operacja ma dotyczyć. A następnie liczbę 0-255 określają krok ustawienia.

    Każda sugestia mile widziana :)
  • REKLAMA
  • Pomocny post
    #2 9517256
    drzasiek
    Specjalista CNC
    Czemu nie chcesz korzystać ze sprzętowego SPI?
    Tą twoją funkcję wysyłającą SPI tak bym uprościł:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Z tym, że o ile dobrze ustawiłeś porty i dobrze podłączyłeś powinno działać. Ale poczytaj dokładnie, czy dana ma być wysyłana przy SCK="L" czy SCK="H".
  • REKLAMA
  • Pomocny post
    #3 9517443
    JarekC
    Poziom 32  
    Witam,

    Błąd polega na tym że, wysyłasz ramkę w postaci:

    CS=0 Rozkaz CS=1 CS=0 Dana CS=1 a powinna być sekwencja
    CS=0 Rozkaz Dana CS=1.

    Patrz rysunek 5.1 z dokumentacji układu.

    W twoim przypadku układ traktuje jakbyś wysyłał dwa razy rozkaz a nie rozkaz + dana.

    Najlepiej przenieś sterowanie sygnałem CS poza funkcję spi_transmit8.

    Pozdrawiam
    JarekC
  • #4 9517682
    Talvort
    Poziom 10  
    Z SPI sprzętowego zrezygnowałem, bo mi na nim nie szło.. ale to pewnie dlatego, że źle je ustawiłem.
    Ale to już nieważne bo problem rozwiązany - JarekC miał racje. Wysyłany rozkaz był dzielony na dwie części, a należało go wysłać w jednym..

    ostateczny kod wygląda tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    i zdaje sie działać. dzięki.
REKLAMA