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.

[Bascom] [Atmega32] sterowanie DS1802 po 3wire

keermiit 06 Sie 2010 19:42 1716 2
  • #1 06 Sie 2010 19:42
    keermiit
    Poziom 9  

    Witam.
    Chcę sterować potencjometrem audio DS1802 za pomocą atmegi32 i nie mam pojęcia ja przekazywać do scalaka DS1802 bity sterujące.
    Zrobiłem program który imituje zwarcie przycisku do masy i wtedy atmega ze swojego pinu wysyła "impuls masy" na pin DS1802 tyle razy ile przyciśnięty został microswitch podłączony do atmegi do pinub.0

    Takie sterowanie jest troche daremne ( jestem początkujący ) i chcę to rozwiązać przez sterowanie 3wire.

    Manuala do DS1802 mam ale z angielskim u mnie krucho ( też jestem w trakcie nauki :D ) ale wyczytałem że na czas transmisji danych do ds1802 na pinie CLK mam mieć logiczne "1" i jeśli dobrze wyczytałem po zakończeniu wysyłania ma pojawić się logiczne "0" , Wiem też ze daną (liczbe) którą chce wysłać musze przedstawić w postaci zero-jedynkowej (binarnej).

    Nie mam bladego pojęcia jak wysyłać taką liczbe binarną, czy czeba podciągnąć ją pod jakąś zmienną.

    Przedstawie na przykładzie co chcę zrobić.
    Niech pinb.0 będzie podpięty pod przycisk do +5V ( przycisk od podgłaszania)
    niech pinb.1 będzie podpięty pod przycisk do +5V ( przycisk do zciszania )

    A piny - Pina.0 - podłączone do pinu CLK scalaka DS1802
    - Pina.1 - podłączone do pinu D scalaka DS1802
    - Pina.2 - podłączone do RST scalaka DS1802

    Czy ktoś może napisać mi jak to zrealizować w Bascomie
    A najlepiej jak ktoś by napisał kod ( ofiaruje punkty ) albo najlepiej
    sie chciał spotkać ( z katowic ) i naprowadzić, wytłumaczyć. jak coś to Fusie(malpa)o2.pl.

    PS. szukałem na google i znalazłem pare tematów tu na elektrodzie i pare na innych serwisach ale niewiele mi to pomogło

    0 2
  • CControls
  • Pomocny post
    #2 07 Sie 2010 04:03
    danthe
    Poziom 29  

    Witam!

    Po pierwsze to z reguły przyciski powinny zwierać piny wejściowe do masy a nie do zasilania. Wynika to z faktu posiadania przez procesory AVR wewnętrznych rezystorów pull-up podciągających wejścia do +vcc, czyli panuje na nich stale stan wysoki (oczywiście gdy zostaną uaktywnione).
    Po drugie to akurat sygnał CLK ma się zmieniać, podczas narastającego zbocza sygnału clk bit na linii danych jest przepisywany do wewnętrznego rejestru DS'a, z noty katalogowej wynika że jest to zwykła transmisja szeregowa dwóch bajtów danych, czyli będzie trzeba utworzyć dwie zmienne np: Lkanal i Pkanal i zadeklarować je jako "byte". Zmienne te będą przyjmować wartości od 0 do 127, gdzie od 0 - 63 - ustawienie pozycji potencjometru, a dodanie wartości 64 spowoduje włączenie "mute".

    CDN, dziś już więcej nie dam rady.

    Ok, kontynuuję.

    Najpierw wyjaśnię na czym polega transmisja szeregowa.

    Jak wiadomo najmniejszą jednostką informacji jest bit, może on przyjąć wartość 0 (najczęściej 0v) oraz 1 (najczęściej +vcc).
    Ponieważ na jeden bajt składa się 8 bitów możemy w bajcie zapisać wartość od 0 do 255. Dane można przesyłać zarówno równolegle (wszystkie 8 bitów naraz używając 9 wyprowadzeń procesora) lub szeregowo (po jednym bicie po kolei używając 2 wyprowadzenia procesora). W twoim wypadku interesuje nas ten drugi przypadek. Według noty katalogowej należy najpierw ustawić wszystkie linie w stan 0.
    DS1802 ma 16 bitowy rejestr w którym przechowuje wartość położenia potencjometru lewego i prawego. Aby wysłać do niego dane należy w kolejności :

    /reset = 1
    D = bit0 zmiennej Lkanal
    CLK = 1 - zerowy bit zapisywany jest na pozycji 15 w szeregowym rejestrze DS'a, zawartość rejestru przesuwana jest w prawo czyli bit 15 zamuje pozycję 14 itd.
    CLK = 0

    D = bit1 zmiennej Lkanal
    CLK = 1 - jak wyżej tylko teraz bit0 zmiennej Lkanal jest już na pozycji 14 w rejestrze szeregowym, do poz 15 wpisywany jest bit1 zmiennej Lkanal
    CLK = 0

    D=bit2 zmiennej Lkanal .... - wszystko powtarzamy do momentu D=bit7 zmiennej Lkanal

    W tym momencie jeden bajt jest już w rejestrze, ale na niewłaściwej pozycji, ponieważ starsze 8 bitów szeregowego rejestru (od 8 do 15) przechowuje dane dla "prawego" potencjometru. Więc wprowadzamy kolejne 8 bitów powyższą metodą z tą różnicą że kolejne bity wystawiane na wejście D DS'a bierzemy ze zmiennej Pkanal.

    Po wprowadzeniu kolejnych 8 bitów danych należy tylko ustawić z powrotem stan niski na wejściu /reset co spowoduje zapisanie danych.

    Oczywiście Bascom posiada pewne elementy języka pozwalające na komunikację szeregową ( np: spiout), ale warto poznać zasadę transmisji szeregowej "na własnej skórze" i stąd taki opis.

    Oczywiście przy pisaniu własnej procedury warto pamiętać że pomiędzy wystawieniem danej na linię D i stanu wysokiego na CLK musi minąć kilkadziesiąt nanosekund, stan wysoki musi też trwać odpowiedni czas (według noty min. 50 ns).

    Jeśli będziesz miał pytania to CDN.

    P.S. Punkty zachowaj sobie, ja sporo piszę na forum i raczej nie potrzebuję dodatkowego wsparcia :D .

    0
  • CControls
  • #3 07 Sie 2010 14:17
    keermiit
    Poziom 9  

    OK dzięki , to już coś , czekam na ciąg dalszy (punkty)

    0