Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] - Atmega16 + DS1802 nie działa

Dragas 01 Wrz 2012 14:39 1590 15
  • #1 01 Wrz 2012 14:39
    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
    Zaloguj się, aby zobaczyć kod


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

    Bardzo proszę o pomoc :!:

    Pozdrawiam
    Dragas

    0 15
  • CControls
  • #3 01 Wrz 2012 15:03
    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 :(

    0
  • #4 01 Wrz 2012 15:04
    kiziu13
    Poziom 16  

    Pokaż jeszcze schemat podłączenia DSa do AVRa.

    0
  • CControls
  • #5 01 Wrz 2012 15:07
    Dragas
    Poziom 26  

    Schematu jako takiego nie mam. Konfiguracja jest opisana na początku kodu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    CLR - PA4
    DATA - PA5
    RST - PA6
    Rozpiska pinów dotyczy M16.

    0
  • #6 01 Wrz 2012 15:44
    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.

    0
  • #7 01 Wrz 2012 15:48
    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.

    0
  • #8 01 Wrz 2012 15:49
    miszczo997
    Poziom 27  

    Ź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] - Atmega16 + DS1802 nie działa

    0
  • #9 01 Wrz 2012 16:19
    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.

    0
  • #10 01 Wrz 2012 16:23
    kiziu13
    Poziom 16  

    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).

    0
  • #12 01 Wrz 2012 17:55
    Dragas
    Poziom 26  

    Na stronie 15 http://datasheets.maxim-ic.com/en/ds/DS1802.pdf znalazłem taką rozpiskę:
    [C] - Atmega16 + DS1802 nie działa
    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.

    0
  • #13 01 Wrz 2012 18:00
    miszczo997
    Poziom 27  

    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.

    0
  • #14 01 Wrz 2012 18:07
    kiziu13
    Poziom 16  

    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.

    0
  • #15 01 Wrz 2012 18:57
    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?

    0
  • #16 01 Wrz 2012 19:07
    kiziu13
    Poziom 16  

    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
    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.

    0