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

[C] Sterowanie potencjometrem cyfrowym DS1802 z Atmega16 - kod nie działa, co poprawić?

Dragas 01 Wrz 2012 14:39 1899 15
  • #1 11268127
    Dragas
    Poziom 26  
    Witam

    Chciałbym sterować potencjometrem cyfrowym przy użyciu atmegi. Na razie napisałem taki kod, lecz nie działa on.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dokumentacja DS1802: http://datasheets.maxim-ic.com/en/ds/DS1802.pdf

    Bardzo proszę o pomoc :!:

    Pozdrawiam
    Dragas
  • #3 11268205
    Dragas
    Poziom 26  
    W ten sposób też już próbowałem. Ustawiałem switchami głośność na około 50% (na słuch, mniej więcej), wgrywałem program, lecz nie było ani głośniej ani ciszej, ani mute :(
  • #4 11268214
    kiziu13
    Poziom 17  
    Pokaż jeszcze schemat podłączenia DSa do AVRa.
  • #5 11268227
    Dragas
    Poziom 26  
    Schematu jako takiego nie mam. Konfiguracja jest opisana na początku kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    CLR - PA4
    DATA - PA5
    RST - PA6
    Rozpiska pinów dotyczy M16.
  • #6 11268316
    kuba1im
    Poziom 19  
    Bierze kolega pod uwagę uwarunkowania ludzkiego słuchu? Proszę pamiętać, że nie jest on liniowy a logarytmiczny, także potencjometr "do dźwięku" również powinien być logarytmiczny.
  • #7 11268327
    Dragas
    Poziom 26  
    To, że ten potencjometr elektroniczny jest logarytmiczny, to zauważyłem, kiedy ściszyłem o 1 stopień od maksymalnego, kiedy to skok był bardzo duży.

    Mój problem tkwi w tym, że nie działa cyfrowa zmiana głośności, z atmegi.
  • #8 11268331
    miszczo997
    Poziom 28  
    Źle pisałem ,tak jak wysyłasz powinno być dobrze. Nie mam pomysłu. Dodałbym tylko w main zerowanie wsyztskich linii na początku. Spróbuj może dać dłuższe delaye i podpiąć diodki do lini, żeby zobaczyć, czy coś w ogole leci.

    :arrow: kuba1im
    [C] Sterowanie potencjometrem cyfrowym DS1802 z Atmega16 - kod nie działa, co poprawić?
  • #9 11268407
    Dragas
    Poziom 26  
    Chyba kolega miszczo997 miał racje z tą diodą. Wstępnie ustaliłem, że mam upalony pin PA4. Ale to jeszcze sprawdzę potem,aby mieć pewność.
    Prosiłbym o sposób, jak z wartości hex (np 0xff) zrobić tablicę bitów (czyli wyjdzie z tego 0b11111111), oczywiście w C.
  • #10 11268419
    kiziu13
    Poziom 17  
    Nie ma czegoś takiego jak tablica bitów w C, najmniejszym typem jest char (bajt) (mozna jeszcze użyć struktur z bitami ale to nic nie da). W takim wypadku po prostu zapisujesz wartość jako char i wymaskowujesz konkretne bity. W przypadku wypisywania LSB do MSB, prosta pętla do 8, wymaskoanie najmłodszego bitu (val & 0x01) i przesunięcie całej wartości o 1 w prawo (val =>> 1).
  • #12 11268697
    Dragas
    Poziom 26  
    Na stronie 15 http://datasheets.maxim-ic.com/en/ds/DS1802.pdf znalazłem taką rozpiskę:
    [C] Sterowanie potencjometrem cyfrowym DS1802 z Atmega16 - kod nie działa, co poprawić?
    Tylko jak ona się tyczy do czasów odstępu pomiędzy poszczególnymi bitami i czasu trwania stany wysokiego/niskiego?
    Testowałem z czasem 1us i 10us, lecz zawsze wchodzi w MUTE, albo ustawia głośność na 0 (pozycja 64). Jednakże obstawiam raczej na opcję drugą, ponieważ po jednokrotnym zwarciu do masy pin MUTE do masy, głos się wyłącza, a po drugim zwarciu do masy, głos powraca, a w przypadku wysłania komendy z atmegi, zwarcie piny MUTE do masy głos nie przywraca się, muszę zewrzeć na chwilę volume-up do masy - po chwili głos wraca (wg noty około 7.3s). Obstawiam, że problem leży w czasie trwania i pomiędzy impulsami. Problem w tym, że nie wiem jak mam to zrobić, aby działało to poprawnie.

    Dodano po 5 [minuty]:

    Znalazłem projekt Mirley'a potencjometru cyfrowego, lecz na DS1267. W nocie zauważyłem, że większość czasów opóźnienia to 50ms. Odwzorowane to jest w kodzie na do uC 2/3 opóźnień to 50ms.
  • #13 11268738
    miszczo997
    Poziom 28  
    Spróbuj dodać dwa switche i zmieniać wartość zmiennej którą wysyłasz w zakresie od 0 do 63 i w ten sposób regulować siłę głośności. Wtedy powinno wszystko się wyjaśnić. Chyba, że wysyłasz tablicą to wtedy przygotuj kilka tablic z różnymi wartościami do wysłania i przeskakuj switchem pomiędzy nimi. Delaye 1us w zupełności wystarczą. Pomiędzy wysyłaniem kolejnych bitów masz w tej chwili 2us przerwy+ kilka taktów zegara. Możesz spróbować dodać _delay_us(1); za pętlą for przed zerowanie rst.
  • #14 11268764
    kiziu13
    Poziom 17  
    Tak właściwie to dlaczego korzystasz z programowej obsługi, a nie z softwareowego SPI? Widać po przebiegach, że jest kompatybilny (nie używa się tylko MISO), trzeba tylko dobrze ustawić rejestry, żeby zbocza się zgadzały.
  • #15 11268923
    Dragas
    Poziom 26  
    Opóźnienie po pętli nic nie dało :(
    Kolego kiziu13, czy możesz udostępnić kod do sterowania DS'em poprzez SPI? I schemat podłączenia?
  • #16 11268954
    kiziu13
    Poziom 17  
    Nie posiadam takowego, ale myślę, że nie powinno to sprawić problemu, trzeba jedynie przepiąć piny CLK i DATA na piny SPI i skonfigurować odpowiednio SPI.

    Oto kod, który sobie stworzyłem w celu ułatwienia konfiguracji. Musisz jedynie sprawdzić czy konfiguracja pinów jest zgodna z Twoim AVRem. Dorzucam też funkcje wymieniające dane bez użycia przerwań.

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


    Pamiętaj jeszcze, że zmieniając kierunkowość wysyłania danych (MSB/LSB pierwsze), należy też uaktualnić procedurę wysyłającą słowo. Nie zapomnij też, że pinem /CS, czy w tym przypadku /RST musisz sterować sam podczas wymiany danych.
REKLAMA