Komunikacja z Potencjometrem Cyfrowym DS1267


10
Ocena: None Średnia: 10 (1 głosujący)

Opis ten przybliży zasadę komunikacji z układami posiadającymi szeregowy interfejs w postaci rejestru przesuwnego. Opis zostanie przedstawiony na podstawie układu potencjometru cyfrowego DS1267 jednak nie jest to jedyny układ sterowany tym sposobem. Ten sposób przesyłania danych do układów pomocniczych nosi nazwę 3-Wire (RST,CLK i DQ).

Język Bascom AVR:

'************* Konfiguracja uC *****************
'***********************************************
Rst Alias Portb.3        'wyjście
Dq Alias Portb.1         'wyjście
Clk Alias Portb.4        'wyjście
'********** Konfiguracja uC Koniec  ************
 
'******************  Zmienne *******************
'***********************************************
Dim N As Byte , Dane As Word
Dim Pot_A As Byte, Pot_B As Byte
'*************  Zmienne Koniec  ****************
 
'************ Warunki Poczatkowe ***************
'***********************************************
N = 15
'rozpoczęcie procedury wysyłania
Clk = 0                       'sygnał zegarowy = 0
Dane = 256 * Pot_A            'tworzenie 16-bitowej zmiennej z wartoscią potencjometrów
Dane = Dane + Pot_B
Rst = 1                       'stan wysoki na RST, początek wysyłania danych
'*******  Warunki Poczatkowe Koniec  ***********
 
'**************  Petla glowna ******************
'***********************************************
Do
  If Rst = 1 Then                                           'wysylanie
    If Clk = 1 Then
      If N <> 255 Then
        Dq = Dane.n
        Decr N
      Else
        Rst = 0
        Dq = 0
        N = 15
      End If
    End If
    Toggle Clk
  End If
Loop
End
'************ Petla glowna Koniec **************

Do komunikacji (wysyłania danych) będziemy potrzebować 3 pinów mikrokontrolera, skonfigurowanych jako wyjścia. Przypisano nim nazwy: Rst, Dq oraz Clk. Główna część programu zawiera się w głównej pętli, między instrukcjami Do i Loop. Dane są wysyłane gdy w stan wysoki zostanie ustawiona linia Rst. Wykonywane są cyklicznie następujące czynności:

    If Clk = 1 Then
      If N <> 255 Then
        Dq = Dane.n
        Decr N
      Else
        Rst = 0
        Dq = 0
        N = 15
      End If
    End If
    Toggle Clk

Linia Clk jest przebiegiem zegarowym, dzięki instrukcji Toggle Clk, pin ten jest zmieniany na przeciwny po każdym wywołaniu procedury wysyłania danych. Jeżeli wartość Clk stanie się równa 1 to znaczy że zostało wykryte zbocze narastające (moment zapisu danych przez rejestr układu DS1267). Przed zapisem Clk ma wartość 0 co na samym początku (przy pierwszym zboczu narastającym na Clk) oznacza wpisanie do rejestru 0 (taki jest stan Dq na początku, nie używamy 1 bitu w rejestrze bo jest on potrzebny w specjalnym trybie pracy potencjometru). Pozostałe wartości zapisane w zmiennej Dane (16 - bitowej) są przypisywane na wyjście Dq począwszy od bitu 15 do bitu 0 (za pomocą zmiennej pomocniczej N) i wpisywane do rejestru na kolejnych zboczach narastających sygnału Clk. Jeśli licznik N przekroczy już 0 (stanie się równy 255, bo jest to zmienna bajtowa) to procedura wysyłania danych zostanie zakończona. Ustawione zostanie zero na sygnale Rst, co spowoduje odpowiednie ustawienie suwaków, zgodnie z wysłanymi danymi. Jednocześnie sygnał Dq oraz zmienna pomocnicza N powrócą do swych domyślnych wartości.

Więcej informacji można znaleźć w bardziej rozbudowanym kodzie w projekcie: Potencjometr Cyfrowy




Portret użytkownika mateusz

DS1267

Witam!!!
Chciałbym się Pana spytać jak przerobić ten program aby można było całą pracę układu DS1267 pokazać na wyświetlaczu LCD?

Portret użytkownika mateusz

DS1267

Witam!!!
Spróbowałem sam przerobić ten program i wyszło mi coś takiego:

$regfile = "m16def.dat"
$crystal = 8000000
Config Portb = &B11111010 : Portb = &B11100101
Config Portd = Output ; Portd = &B11111111
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , Rs = Portd.4 , E = Portd.5
Config Lcd = 16 * 2
Deflcdchar 0 , 12 , 4 , 4 , 6 , 12 , 4 , 4 , 14             
Deflcdchar 1 , 2 , 4 , 32 , 15 , 16 , 14 , 1 , 30           
Deflcdchar 2 , 2 , 4 , 32 , 15 , 16 , 16 , 16 , 15          
Rst Alias Portb.3
Dq Alias Portb.1
Clk Alias Portb.4
Splus Alias Pinb.0
Sminus Alias Pinb.2
$hwstack = 20
$swstack = 10
$framesize = 40
Dim N As Byte , Dane As Word
Dim Licz_sw(2) As Byte
Dim Glos As Byte
Dim Autosave As Byte
N = 15
Readeeprom Glos , 1
Glos = Glos / 2
Glos = Glos * 2
Clk = 0
Dane = 256 * Glos
Dane = Dane + Glos
Rst = 1
Do
If Rst = 1 Then
If Clk = 1 Then
If N <> 255 Then
Dq = Dane.n
Decr N
Else
Rst = 0
Dq = 0
N = 15
End If
End If
Toggle Clk
Else
Waitms 5
If Splus = 0 Then
Incr Licz_sw(1)
If Licz_sw(1) = 10 Then
Licz_sw(1) = 0
If Glos <= 253 Then
Autosave = 250
Glos = Glos + 2
Clk = 0
Dane = 256 * Glos
Dane = Dane + Glos
Rst = 1
Waitms 50
End If
End If
Else
Licz_sw(1) = 0
End If
If Sminus = 0 Then
Incr Licz_sw(2)
If Licz_sw(2) = 10 Then
Licz_sw(2) = 0
If Glos >= 2 Then
Autosave = 250
Glos = Glos - 2
Clk = 0
Dane = 256 * Glos
Dane = Dane + Glos
Rst = 1
Waitms 50
End If
End If
Else
Licz_sw(2) = 0
End If
If Autosave > 0 Then
Decr Autosave
If Autosave = 0 Then
Writeeeprom Glos , 1
End If
End If
Cls
Lcd "G" ; Chr(0) ; "o" ; Chr(1) ; "no" ; Chr(1) ; Chr(2) ; ":"
Lowerline
Lcd "+" ; Glos ; "dB"
End If
Loop
End

Czy dobrze to wszystko napisałem?
Jeżeli nie to proszę poprawić tak aby było dobrze.
Fragment programu, który sam to:

Cls
Lcd "G" ; Chr(0) ; "o" ; Chr(1) ; "no" ; Chr(1) ; Chr(2) ; ":"
Lowerline
Lcd "+" ; Glos ; "dB"
End If
Loop
End  

Portret użytkownika mirley

Re: Program Ds

Zrób wcięcia w programie bo nie ma szans tego zanalizować.....

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mateusz

Program DS

Witam!
Jestem początkującym programistą i nie wiem jak to zrobić.Byłbym bardzo wdzięczny jak pan mógłby mi ten program przerobić.

Portret użytkownika mirley

Re; DS1267

To w takim razie napisz co masz na myśli "pokazac całą pracę na LCD"? pokazać położenia suwaków?, czy głośnośc w 100% bo tak wnioskuję z wcześniejszych postów?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mateusz

chciałbym aby na wyświetlaczu

chciałbym aby na wyświetlaczu była taka podziałka -[-----------]+.Czyli jak pan się domyśla jest to podziałka głośności.Jak będzie się pogłaszało muzykę to kursor będzie przechodził powoli w prawą stronę a jak przyciszało to w lewą.A w drugiej linijce wyświetlacza chciałbym aby był taki napis:
Głośność:(w tym miejscu cyfry od 0 do 30 w zależności od pogłoszenia)dB.
Myślę, że teraz chyba będzie pan wiedział o co mi chodzi?

Portret użytkownika mirley

Re: Potencjometr

Górną linijkę rozumiem ale niewiem skąd mamwytrzasnąć ci wzmocnienie w decybelach. Chodzi ci zrobienie wskaźnika tłumienia potencjometru głośności? tak wogóle to chodziło ci chyba o skalę od -ileś do 0 bo dodatnia wartość oznacza wzmocnienie które trzeba znać aby to policzyć (taki szkolny wzór z logarytmem: 20*log(Uout/Uin))? Chyba że poprostu ma to pokazywać położenie suwaka za pomocą liczby tak jak zrobiłeś to w twojej wersji programu?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mateusz

dokładnie tak ja w mojej

dokładnie tak ja w mojej wersji programu

Mirley: reszta postów usunięta, nie wolno pisać swoich postów jeden pod drugim, albo się zaloguj uzyskując możliwość edycji albo dokładnie przemyśl co chcesz pisać bo nie mam czasu na scalanie pojedynczych wpisów

Portret użytkownika mirley

Re; potencjometr

Zrobi się ale trzeba mieć trochę czasu

--------------
Sprawdź tak:

$regfile = "m16def.dat"
$crystal = 8000000
 
$hwstack = 20
$swstack = 10
$framesize = 40
 
Config Portb = &B11111010 : Portb = &B11100101
Config Portd = &B11111111 ; Portd = &B11111111
Config Portc = &B00000000 ; Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , Rs = Portd.4 , E = Portd.5
Config Lcd = 16 * 2
Deflcdchar 0 , 12 , 4 , 4 , 6 , 12 , 4 , 4 , 14             
Deflcdchar 1 , 2 , 4 , 32 , 15 , 16 , 14 , 1 , 30           
Deflcdchar 2 , 2 , 4 , 32 , 15 , 16 , 16 , 16 , 15          
Cls
 
Rst Alias Portb.3
Dq Alias Portb.1
Clk Alias Portb.4
Splus Alias Pinb.0
Sminus Alias Pinb.2
 
 
Dim N As Byte , Dane As Word
Dim Licz_sw(2) As Byte
Dim Glos As Byte
Dim Autosave As Byte
dim x as byte
N = 15
 
Readeeprom Glos , 1
Glos = Glos / 2
Glos = Glos * 2
Clk = 0
Dane = 256 * Glos
Dane = Dane + Glos
Rst = 1
 
Do
  If Rst = 1 Then                                           'wysylanie
    If Clk = 1 Then
      If N <> 255 Then
        Dq = Dane.n
        Decr N
      Else
        Rst = 0
        Dq = 0
        N = 15
      End If
    End If
    Toggle Clk
  Else
    Waitms 5
    '******************************** przyciski
    If Splus = 0 Then
      Incr Licz_sw(1)
      If Licz_sw(1) = 10 Then
        Licz_sw(1) = 0
        If Glos <= 253 Then
          Autosave = 250
          Glos = Glos + 2
          Clk = 0
          Dane = 256 * Glos
          Dane = Dane + Glos
          Rst = 1
          gosub LCD
          Waitms 50
        End If
      End If
    Else
      Licz_sw(1) = 0
    End If
 
    If Sminus = 0 Then
      Incr Licz_sw(2)
      If Licz_sw(2) = 10 Then
        Licz_sw(2) = 0
        If Glos >= 2 Then
          Autosave = 250
          Glos = Glos - 2
          Clk = 0
          Dane = 256 * Glos
          Dane = Dane + Glos
          Rst = 1
          gosub LCD
          Waitms 50
        End If
      End If
    Else
      Licz_sw(2) = 0
    End If
    '******************************** przyciski koniec
 
    If Autosave > 0 Then
      Decr Autosave
      If Autosave = 0 Then
        Writeeeprom Glos , 1
      End If
    End If
 
  End If
Loop
End
 
 
LCD:
cls
lcd "-[------------]+"
x = glos/23
x=x+3
locate 1,x
lcd "|"
lowerline
lcd "glos: "; glos
return

sprawdź to teraz bo napisałem na sucho bez kompilacji i mogą być błędy. Program to prawie w całości projekt pot. cyfrowego

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mateusz

kod

Czyli mam teraz zaprogramować procka?

Portret użytkownika mirley

Re: Program

Wkleić do bascoma skompilować i wgrać czy będzie działało..... nie mam czasu aby to sprawdzać dokładnie. Mam nadzieje że dobre piny do lcd wpisałeś w programie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mateusz

KWARC

Skompilowało się dobrze ale wgram jutro ponieważ zamówiłem dopiero procesor i jutro ma mi dojść.
W programie jest kwarc 8MHz czy mogę zmienić na 16MHz bo tylko taki mam?
A z tymi pinami do lcd to oco chodzi?

Portret użytkownika mirley

Re: Potencjometr

Możesz dać 16MHz ale na początku programu musisz to zdefiniować, w linijce crystal. Lcd musisz zdefiniować do jakich pinów podłączyłeś:

Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3 , Rs = Portd.4 , E = Portd.5

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mateusz

atmega16a

witam!
czy ATMEGA16 różni się czymś od ATMEGA16A?

Portret użytkownika mirley

Re: ATMEGA16

Teoretycznie nie różni się niczym, te z literą A to nowe opracowania ATMELA będące połączeniem M16 i M16L. Z tego co wiem to nie będzie już wersji LOW power bo załatwia to jeden mikrokontroler z literka A.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mateusz

atmega16a

czyli z zaprogramowaniem tej atmegi16a jest takie samo jak zaprogramowanieatmegi16?

Portret użytkownika rafliczek22

nie

nie

Portret użytkownika mateusz

nie?

a czemu nie?

Portret użytkownika rafliczek22

Tak, tak można przepraszam

Tak, tak można przepraszam byłem zmęczony i zapomniałem, aha a moze kolega zdradzic gdzie dorwał już takie atmegi, na allegro.pl nie ma

Portret użytkownika mateusz

atmega16a

wejdź na TME.EU tam znajdziesz za 13,90pln netto

Portret użytkownika matrix

Re: Obsługa potencjometru ds1267s

Mireczku, mam pytanie bo nie mogę się doczytać:

jak odczytać wartość aktualnego położenia suwaków?
jest to zapisane w tym miejscu?

Readeeprom Glos , 1

czemu dorzucona jest jedynka na końcu? chodzi o odczyt położenia suwaka potencjometru nr1?

Portret użytkownika mirley

Potencjometr

Nie, jest to standardowa funkcja odczytu z eeprom.

Readeeprom Zmienna , Adres

1 jest adresem w pamięci eeprom z którego czytam położenie obu suwaków. Zmienna głos przechowuje położenie suwaków. Oba potencjometry mają takie samo położenie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: Obsługa potencjometru ds1267s

a jeszcze jedno pytanie.
da się wprowadzić ów potencjometr od razu w tryb mute?
jeśli tak to jak to zrobić?

Portret użytkownika mirley

Re: Mute

Nie ma czegoś takiego jak mute potencjometru... jak sobie to wyobrażasz, potencjometr cyfrowy z punktu widzenia wzmacniacza jest taki sam jak zwykły potencjometr. Można na początku programu ustawić suwak w skrajnym położeniu, aby wejście wzmacniacza było zwarte do masy, wtedy uzyskasz wyciszenie

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika matrix

Re: Obsługa potencjometru ds1267s

to mute to umowne. tylko jak ustawić ten potencjometr na zero?

Portret użytkownika mirley

Re: Potencjometr

Popatrz do karty katalogowej.... potencjometr ma rejestr przesuwny 16 bitowy do zapisu położenia suwaków. Jak wpiszesz w dwa bajty 0 to suwak ustawi sie na minimum. ja robię z dwóch bajtów wartość Word (przykład pierwszy na górze):

Dane = 256 * Pot_A            'tworzenie 16-bitowej zmiennej z wartoscią potencjometrów
Dane = Dane + Pot_B

Wystarczy jak w Pot_A i Pot_B będzie wpisane 0 i suwak ustawiony

W programie niżej masz tylko jedna zmienną Glos i wpisuje się ona w dwa suwaki, więc wystarczy Glos = 0 i uruchomic procedurę wysyłania poprzez RST=1

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika wkn

kod

Jaki to język ? Panie MF

Portret użytkownika mirley

Re: Kod

Bascom AVR (Basic)

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Zibi_13

Witam, kiedyś w Bascomie

Witam, kiedyś w Bascomie programowałem... ale to były lata świetlne temu. Teraz mam "problem" i proszę o pomoc.
Muszę zrobić timer. Przeważnie to są przyciski góra - dół, wybieranie sekwencyjne... nikt tego nie lubi.
W kuchence mikrofalowej mam zegar - naciskam przycisk ustawiam godziny kręcąc pokrętłem w lewo lub w prawo.
Naciskam ponownie przycisk ustawiam minuty (kręcąc pokrętłem w lewo lub w prawo). Naciskam przycisk zatwierdzam ustawienia. Rozwiązanie bardzo fajne. Może ktoś by pomógł?
Pozdrawiam

Portret użytkownika Grzeniu 73

Witam! Masz na tej stronie

Witam! Masz na tej stronie gotowe rozwiązanie. Poczytaj o enkoderze.

Portret użytkownika Artur Jesionowski

Jak podłaczyć dwa potencjometry ds1267 pod jeden procesor

Witam

mam pytanie, może mi pomożesz.
Potrzebuję wiedzy jak ma wyglądać kod w Bascomie kiedy podłączę dwa układy ds1267.
opracowałeś kod pod jeden i ok działa a jak mam uruchomić drugi?

jest taka możliwość?

Byłbym wdzięczny za poradę , sugestię... może nawet za gotowy kod.

pozdrawiam

Portret użytkownika mirley

Re: Ds1267

Można podłączyć dowolną ilośc potencjometrów w szeregu. Kłania sie karta katalogowa na stronie 4 i 5 "Cascade Operation". W kodzie źródłowym trzeba: Zmienić zmienną Dane na typ Long (4 bajty), a zmienna N powinna miec domyślnie N = 31 a nie N = 15. W zmiennej Dane trzeba zapisac 4 bajty określające położenia suwaków

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.