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

[Rozwiązano] Bascom-sterowanie potencjometrem MCP4641 przez I2c.

marekms1 15 Sie 2023 10:11 495 12
REKLAMA
  • #1 20693980
    marekms1
    Poziom 13  
    Czy mógłbym prosić o pomoc w napisaniu procedury sterowania przez I2c potencjometrem cyfrowym MCP 4641 10kom? Potrzebuję sterować potencjometrem poprzez wysłanie konkretnej pozycji ślizgacza.
    Wg noty należy wysłać:
    7 bitów adresu potencjometru + bit R/W
    4 bity adresu pamięci + 2bity rozkazu+2bity niewykorzystane
    7 bitów danych (potencjometr jest 7bitowy)

    Niestety moje próby skończyły się tak:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Zwraca rezystancję 3,3 kom.
    Kod: vbnet Rozwiń Zaznacz wszystko Kopiuj do schowka

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    I2cstart
    I2cwbyte 01010000
    I2cwbyte 1000000
    I2cwbyte 1
    I2cstop
    [/syntax]

    Zwraca rezystancję 180 om.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    zwraca 180om

    Próbowałem na obydwu potencjometrach, wynik jest identyczny, po zaniku zasilania potencjometr ustawia się prawidłowo, na 50% wartości.


    Załączam notę MPC4641

    Marek
  • REKLAMA
  • Pomocny post
    #2 20694458
    gps79
    Poziom 35  
    Wartości binarne wprowadzaj z prefiksem, np.:
    &B01010000
  • REKLAMA
  • #3 20695204
    marekms1
    Poziom 13  

    Z prefixem, czy bez, na wyjściu nie mam tego, co oczekuję.
    Zgodnie z notą (jeśli ją dobrze zrozumiałem), sekwencja zapisu do pamięci ulotnej powinna mieć długość 29 bitów, 3x8 bitów danych + 5 bitów sterujących przesyłem (start, stop, potwierdzenie) i tutaj coś robię źle. Próbowałem uzupełniać wartości binarne do 8 bitów, wpisywać wartości w dec również bez powodzenia.

    Marek
  • #4 20695283
    bart-projects
    Poziom 29  
    Czytałeś tę notę i nie zauważyłeś diagramu ze strukturą ramki/komend? :D

    Bascom-sterowanie potencjometrem MCP4641 przez I2c.

    Widać wyraźnie, że nie dość że wybierasz który ślizgacz to jeszcze trzeba sie zdecydować na wpis do pamięci lub reset. Komenda z dwoma zerami na końcu jest niedozwolona ;)

    Coś więc raczej w ten deseń:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #6 20695497
    bart-projects
    Poziom 29  
    Trochę dziwna ta nota. Na obrazku co innego a w tabeli co innego ( a przedtem dalej nie chciało mi się czytać).
    Na stronie 55 pisze że Command Byte wyglada tak : cztery najstarsze bity to adres pod który chcesz coś wpisać a Ty chcesz pod adres z tabelki niżej czyli pod adres 00, potem dwa bity oznaczają czy to zapis czy odczyt więc znów dwa zera i potem dwa bity które reprezentują najstarsze bity z wartości które nie zmieściłyby się w bajcie z wartością...czyli tez same zera. Wyglada jakby komenda wpisu do pierwszego rejestru miała wygladać &b0000_0000 i potem bajt z wartością.
    Wartość &b1000 na początku oznacza &H08 czyli teraz uderzasz prawdopodobnie w pamięć eeprom.

    Bascom-sterowanie potencjometrem MCP4641 przez I2c.
  • #7 20695663
    marekms1
    Poziom 13  
    Właśnie tego nie rozumiem lub źle interpretuję.
    I2cwbyte &B01010000, Ack ' to adres potencjometru czyli część stała 0101 + ustawiana na wyprowadzeniach A2,A1,A0 + bit ustawienia na zapis
    I2cwbyte &B100000d0, Ack ' polecenie: zapisz następny bajt (trzeci) do pierwszego potencjometru, d-jako najstarszy bit wartości wpisywanej do rejestru pierwszego potencjometru (nie używany)
    I2cwbyte &B00101000, Nack ' pozycja potencjometru
    Bascom-sterowanie potencjometrem MCP4641 przez I2c.

    Marek
  • #8 20695706
    bart-projects
    Poziom 29  
    Proponuję nie patrzeć na ten obrazek tylko na opis i tabele. Noty Miccrochip się nie umywają do not starego Atmel`a.

    To się prawdopodobnie obsługuje tak jak popularne zegarki RTC czyli najpierw adres urządzenia, następnie adres rejestru który zaczyna się od 0 i potem wartość.

    Jedyna rzecz ktrej mozesz nie rozumieć to to że zarezerwowali sobie miejsce na dane wartości bo mieli dwa wolne bity czyli pewnie protokół jest wspólny dla potencjometrów o wiekszej rozdzielczości.

    Według tabeli Twój jest 2x7bit a pewnie maja takie o wyższej rozdzielczości.
    Bascom-sterowanie potencjometrem MCP4641 przez I2c.

    Próbowałeś w ogóle zobaczyć czy masz sprawny hardware i pod jakim adresem się toto zgłasza?

    To moja wersja skanera :D
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    To jest nietestowane, ale może zadziałać z kazdym podobnym potencjometrem.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #9 20695918
    marekms1
    Poziom 13  
    Tak sprawdziłem skanerem ze strony bascoma i potencjometr zgłasza się z właściwym adresem.
    Poeksperymentuję jeszcze wieczorem.

    Marek
  • REKLAMA
  • #10 20695977
    bart-projects
    Poziom 29  
    Mam nadzieję że pin WP nie "zmasowany" bo powinien być ewentualnie podciagnięty do VCC.
    One mają "smart pull-up" to znaczy, że potrafią wyłaczyć wewnętrzny włączany automatycznie gdy wykryją zwarcie wejścia do GND by oszczędzać energię. W sumie mądre.
    Wiadomo tyczy tylko zapisu do eeprom i rozruchu po POR/BOR, ale kto wie jak Ty to sprawdzasz. Żeby miał jakąś wartość nawet po przerwaniu zasilania trzeba wartośc wpisać do NonVolatile memory register czyli dla pot0 to rejestr &H02

    Wpis do niego powinien skutkować tym że zawsze po podaniu napięcia zasilania i PowerOnReset(POR) do rejestrów RAM ładowana jest ta wartość z &H02
  • #11 20696009
    marekms1
    Poziom 13  
    WP mam nie podłączone.
    Po podaniu zasilania ładuje się 64 (50%) 5100 om.
    Marek
  • Pomocny post
    #12 20696079
    bart-projects
    Poziom 29  
    Skąd wiesz, że 64? Da się odczytać a nie ustawic? Czy tylko po pomiarze rezystancji wnioskujesz?
    Pomiar między B i W rozumiem?
    Tam sie ustawia czy ślizgacz ma byc z którymkolwiek końcem połaczony czyli Ślizgacz z B albo Slizgacz z A. Normalnie nie są połaczone i pomiar tylko między W do B bo wyjście A nie jest podłaczone domyślnie (FIGURE 5-2).


    [EDIT] Myslę, że w tym Sub z postu #8 przesunięcie o 6 bitów w lewo to błąd. Tam powinno być tylko Shift , Left , 4
    Akurat dla reg0 nic sie nie zmieni, ale dla reg1 przy przesunieciu o 6 adres bedzie juz wygladał 0100 a powinien 0001
  • #13 20697497
    marekms1
    Poziom 13  
    Tak pozycję potencjometru odczytałem.
    Nie wiem dlaczego ale nie działają komendy "general call commands" (TAB 6-3) mimo że w rejestrze TCON (GCEN=1) są uruchomione. Natomiast działa ustawienie potencjometru przez bezpośredni zapis do RAM, a na takim sposobie sterowania potencjometrem mi zależało, więc problem rozwiązany.
    Sprawdziłem na drugim czipie jest tak samo, czyli może taka seria.
    Dziękuję wszystkim za pomoc.

    Marek

Podsumowanie tematu

Użytkownik poszukiwał pomocy w napisaniu procedury do sterowania cyfrowym potencjometrem MCP4641 przez interfejs I2C. W trakcie dyskusji zwrócono uwagę na konieczność poprawnego formatowania danych binarnych oraz długości sekwencji zapisu, która powinna wynosić 29 bitów. Użytkownik miał problemy z odczytem i zapisem wartości, co prowadziło do nieprawidłowych wyników rezystancji. Wskazano na różnice między diagramami a tabelami w dokumentacji MCP4641 oraz na konieczność zrozumienia struktury komend. Ostatecznie, po eksperymentach, użytkownik zdołał ustawić potencjometr przez bezpośredni zapis do pamięci RAM, co rozwiązało jego problem.
Podsumowanie wygenerowane przez model językowy.
REKLAMA