Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

3wire Bascom, sterowanie kostki DS1802. Co jest źle w zamieszczonym kodzie?

romek77r 11 Oct 2006 19:24 2655 8
  • #1
    romek77r
    Level 16  
    Witam!

    Mam problem z wysterowaniem kostki DS1802 http://pdfserv.maxim-ic.com/arpdf/ds1802.pdf

    Przerobilem kod znajdujacy sie w watku https://www.elektroda.pl/rtvforum/topic348732.html , jednak mimo tego, sterowanie dalej nie dziala. (sprawdzalem z dluzszymi czasami i poszczegolne linie dzialaja) Nie mam za bardzo pomyslu, na to co moze byc nie tak. Prosilbym o pomoc :)


    Code:
    $regfile = "m8def.dat"
    
    $crystal = 4000000

    Declare Sub Wyslij(a As Integer)

    Dim Nastaw(16) As Integer
    Dim Licznik As Integer
    Dim A As Integer
    Dim Wartosc As Integer


    Resset Alias Portc.1
    Zegar Alias Portc.4
    Dane Alias Portc.3

    Cls

    Do



    Nastaw(1) = 0
    Nastaw(2) = 1
    Nastaw(3) = 0
    Nastaw(4) = 1
    Nastaw(5) = 0
    Nastaw(6) = 1
    Nastaw(7) = 0
    Nastaw(8) = 0

    Nastaw(9) = 0
    Nastaw(10) = 1
    Nastaw(11) = 0
    Nastaw(12) = 1
    Nastaw(13) = 0
    Nastaw(14) = 1
    Nastaw(15) = 0
    Nastaw(16) = 0

    Call Wyslij(nastaw(16))

    Wait 1

    Loop
    End


    Sub Wyslij
    Resset = 1

    For Licznik = 0 To 16
    If Zegar = 1 Then
    Zegar = 0
    Else
    Zegar = 1
    End If

    Wartosc = Nastaw(licznik)
    If Wartosc = 1 Then
    Dane = 1
    Else
    Dane = 0
    End If
    Waitms 10
    Next Licznik

    Waitms 500
    Resset = 0

    End Sub
  • #2
    zumek
    Level 39  
    Pierwsze co się rzuca w oczy to For Licznik = 0 To 16 , a powinno byc For Licznik = 1 To 16 .

    Piotrek
  • #3
    romek77r
    Level 16  
    Rzeczywiscie tego nie zauwazylem, jednak dalej nie dziala.

    Mozliwe, ze uklad nie wykrywa transmisji, bo przebiega ona zbyt szybko ?
  • #4
    zumek
    Level 39  
    Efekt02 wrote:
    ...Mozliwe, ze uklad nie wykrywa transmisji, bo przebiega ona zbyt szybko ?

    Niemożliwe , bo ten scalaczek "wytrzymuje" do 10MHz na linii CLK.
    Ponieważ od rana nie chce mi sie za bardzo myśleć(czytaj tłumaczyć) , to podaję kodzik do przetestowania:
    Code:

    $regfile = "m8def.dat"
    $crystal = 4000000

    Declare Sub Wyslij(byval A As Word)
    Const Mute = 6

    Dim Nastaw As Word , Wiper0 As Byte At Nastaw Overlay , Wiper1 As Byte At Nastaw + 1 Overlay
    Dim Licznik As Byte

    Resset Alias Portc.1
    Zegar Alias Portc.4
    Dane Alias Portc.3

    Ddrc = &B00011010       'portc.1,portc.3,portc.4 -> output
    Reset Resset       'reset portu szeregowego DS1802
    Reset Zegar       ' stan niski na linii CLK

    Wiper0 = 15
    Wiper1 = 31

    Cls

    Do
    Reset Wiper0.mute       'wyzerowanie bitu mute dla wiper0
    Set Wiper1.mute       'ustawienie bitu mute dla wiper1
    Call Wyslij(nastaw)
    Wait 5

    Set Wiper0.mute       'ustawienie bitu mute dla wiper0
    Reset Wiper1.mute       'wyzerowanie  bitu mute dla wiper1
    Call Wyslij(nastaw)
    Wait 5

    Reset Wiper0.mute       'wyzerowanie bitu mute dla wiper0
    Reset Wiper1.mute       'wyzerowanie  bitu mute dla wiper1
    Call Wyslij(nastaw)
    Wait 5

    'itd. itp. ;)

    Loop
    End


    Sub Wyslij(byval A As Word)

    Resset = 1
    For Licznik = 0 To 15       'LSB wiper0 -> MSB wiper0 -> LSB wiper1 -> MSB wiper1
       Dane = A.licznik
       Set Zegar : Reset Zegar
    Next
    Resset = 0

    End Sub



    Piotrek
  • #5
    romek77r
    Level 16  
    Quote:
    Dim Nastaw As Word , Wiper0 As Byte At Nastaw Overlay , Wiper1 As Byte At Nastaw + 1 Overlay


    Jest z ta linia problem podczas kompilacji - szukalem w pomocy i brak tam takiej mozliwosci
  • #6
    zumek
    Level 39  
    Efekt02 wrote:
    Quote:
    Dim Nastaw As Word , Wiper0 As Byte At Nastaw Overlay , Wiper1 As Byte At Nastaw + 1 Overlay


    Jest z ta linia problem podczas kompilacji - szukalem w pomocy i brak tam takiej mozliwosci

    Skoro tak sie sprawy mają , to znaczy , że używasz Bascoma "staruszka" v 1.11.7.4 lub jeszcze starszej wersji. Spróbuj więc zmienić tę nieszczęsną linie na:
    Code:

    Dim Nastaw As Word At $60 , Wiper0 As Byte At $60 Overlay , Wiper1 As Byte At $61 Overlay

    Jeśli będziesz korzystał z jeszcze innych zmiennych , to ta linia musi być 1-szą linią z Dim w kodzie,lub ... ale o tym potem.
    Jeśli tej linii Bascom też "nie zrozumie" , to napisz jaką masz wersję Bascoma , a poprawię kod.

    Piotrek
  • #7
    romek77r
    Level 16  
    Nowa linie bascom lyknal, a stara na wyzszej wersji tez chodzi :D

    Jest natomiast inny problem - przy 1-4 glosnosc jest wysoka, natomiast w pozostalych pozycjach wogole sie nie zmienia. Nie dziala ponadto mute. Troszke rozbudowalem program i pozmienialem koncowki portow.

    ps. jak zrobic najwydajniej przedzial glosnosci od 0 do 63 ?

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 4000000

    'wyswietlacz

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portb.0

    ' koniec ustawien wyswieltacza

    ' deklaracja zmiennych dla potka

    Declare Sub Wyslij(byval A As Word)
    Const Mute = 6

    Dim Nastaw As Word At $60 , Wiper0 As Byte At $60 Overlay , Wiper1 As Byte At $61 Overlay
    Dim Licznik As Byte

    ' koniec deklaracji zmiennych

    ' ustawinia dla RC5

    $lib "mcsbyte.lbx"
    Cursor Off
    Config Pind.2 = Input
    Portd.2 = 1
    Config Rc5 = Pind.2
    Dim A As String * 2                                         'Deklaracja umożliwiająca działanie komendy GETRC5
    Dim Address As Byte
    Dim Command As Byte
    Enable Interrupts

    ' koniec ustawien

    ' ustawienia 3wire

    Resset Alias Portc.3
    Zegar Alias Portc.5
    Dane Alias Portc.4

    Ddrc = &B00111000                                           'portc.3,portc.4,portc.5 -> output

    Reset Resset                                                'reset portu szeregowego DS1802
    Reset Zegar                                                 'stan niski na linii CLK

    Wiper0 = 63
    Wiper1 = 63

    ' koniec ustawien, potki na 63

    Cls

    Do

    ' zmiana glosnosci RC5

    Getrc5(address , Command)
    Command = Command And &B01111111


    If Command = 17 Then
    Wiper0 = Wiper0 - 1
    Wiper1 = Wiper1 - 1
    End If

    If Command = 16 Then
    Wiper0 = Wiper0 + 1
    Wiper1 = Wiper1 + 1
    End If

    Cls
    Locate 1 , 1 : Lcd "Pot0= " ; Wiper0
    Locate 2 , 1 : Lcd "Pot1= " ; Wiper1

    ' koniec zmiany glosnosci


    'Reset Wiper0.mute     'wyzerowanie bitu mute dla wiper0
    'Set Wiper1.mute       'ustawienie bitu mute dla wiper1
    'Call Wyslij(nastaw)
    'Wait 5

    'Set Wiper0.mute       'ustawienie bitu mute dla wiper0
    'Reset Wiper1.mute     'wyzerowanie  bitu mute dla wiper1
    'Call Wyslij(nastaw)
    'Wait 5

    Reset Wiper0.mute                                           'wyzerowanie bitu mute dla wiper0
    Reset Wiper1.mute                                           'wyzerowanie  bitu mute dla wiper1
    Call Wyslij(nastaw)
    Wait 5

    'itd. itp. ;)

    Loop
    End

    ' procedura ustawiania glosnosci

    Sub Wyslij(byval A As Word)

    Resset = 1
    For Licznik = 0 To 15                                       'LSB wiper0 -> MSB wiper0 -> LSB wiper1 -> MSB wiper1
       Dane = A.licznik
       Set Zegar : Reset Zegar
    Next
    Resset = 0

    End Sub

    ' koniec procedury
  • #8
    zumek
    Level 39  
    Teoretycznie , powinno działać , ale skoro tak nie jest , to:
    a)daj rezystory podciągające do VCC na wszystkich pinach magistrali
    b)popraw program tak , by nie zapisywał danych do DS-a w każdym obiegu pętli , a tylko wtedy , kiedy wartości Wiper0 lub Wiper1 , zmienią się.
    Nie posiadam takowego DS-a , więc nie mogę tego sprawdzić doświadczalnie :(

    Piotrek

    PS
    Na początek , zacznij od poprawki z punktu "b".
  • #9
    Leonti
    Level 12  
    Zamierzam sterować dym ds'em przez Atmega8, pod który jest podpięty oscylator 16 Mhz.
    Czy transmisja danych będzie przebiegać prawidłowo?