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
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.
Ź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.
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.
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).
Na stronie 15 http://datasheets.maxim-ic.com/en/ds/DS1802.pdf znalazłem taką rozpiskę:
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.
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.
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.
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.