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

bascom ds1302 transmisja 3-wire

07 Lut 2010 19:02 5786 23
  • Poziom 14  
    Witam wszystkich liczę na pomoc.
    Mam takie pytanie jak w baskomie zrobić taką transmisje?
    Dobrze to rozumię?
    ds1302
    Address/Comand byte
    bit7 1 to transmisja 0 brak transmisj
    bit6 0 wybieram zegar 1 pamięć ram
    bit5 4 3 2 1 rejestry odczytu zapisu do czego służą ?
    bit0 0 to odczyt danych 1 wyślij dane
    następnie wysyłam bajt z komendą co mam odczytać lub wysłać ?
    Jak wysłać odebrać coś ? następny bajt ?
    Czyli bajt Address + bajt Comand +bajt +bajt
    Czy to tak ma się odbywać (bardzo słabo znam angielski) PDF-a posiadam.
    Co to jest Cloc brust,Ram brust (chodzi mi o brust)
    :cry::idea::?::|
  • Serwerowe OpowieściSerwerowe Opowieści
  • Poziom 14  
    Tak.
    Potrzebuję tylko podpowiedzi od znawców lub osób co uruchamiali takie układy na 3-wire
    Chciałbym się dowiedzieć jakich komend bascoma użyć do 3-wire najlepiej aby transmisja się udała. Po co są te rejestry bit 1 2 3 4 5 ? :|
  • Serwerowe OpowieściSerwerowe Opowieści
  • Poziom 30  
    Masz na myśli Figure3 z piątej strony datasheeta ?
  • Poziom 14  
    Ja mam Figure 4 6-strona Address/Command Byte
  • Poziom 30  
    Code:
    Bits 1 to 5 specify the designated registers to be input or output, and the LSB (bit 0) specifies a write operation (input) if logic 0 or read operation (output) if logic 1. 


    Na tych pięciu bitach określasz z którego rejestru chcesz odczytywać/zapisywać dane.
  • Poziom 14  
    Czyli rejestr 1 to
    2 i 3 to Trickle-charge register
    4 to
    5 to
    6 to

    tyle odczytałem czy dobrze rozumię.
    muszę binarnie sprawdzić to

    Dodano po 12 [minuty]:

    czyli clock brust BFh 10111111 czytaj z zegara następnie np 81h sekundy czy oto biega?

    Dodano po 8 [minuty]:

    co to jest 8Fh,8Eh WP|0|0|0|0|0|0|0 Table 2.Register Address/Definition chodzi mi do czego ten rejestr służy ?
  • Poziom 14  
    Chodzi mi konkretnie a0 a1 a2 a3 a4 nie widzę albo nie umie się doczytać do czego są ?
  • Poziom 30  
    Służą do ustawiania adresu, tak jak masz napisane wyżej :) Bit 7 musi być 1 jeśli chcesz wpisywać dane do układu, bit 6 określa czy chcesz zapisywać czas/date (jak ma wartość 1), czy RAM (jak ma wartość 0). Bity od 5 do 1 określają adres, bit 0 też określa tryb zapis/odczyt, tylko nie bardzo rozumiem jak to się ta do bitu 7? Zwróć uwagę na Figure 4. Data Transfer Summary może to nam coś pomoże :) Tymi pięcioma bitami na pewno możesz sobie wybrać numer komórki pamięci RAM (0-31) do której chcesz zapisywać/odczytywać. W trybie Burst mode ustawiasz tam też czas/date.

    OK już doczytałem, ten 7 bit to WRITE-PROTECT BIT, czyli zabezpieczenie przed zapisem.
  • Poziom 14  
    Dzięki.
    OK teraz wysyłam 1bajt rejestry ustawiamy następnie 2bajt komunikujemy co zapisujemy lub odczytujemy i gdzie 3bajt to będą dane które wyślemy lub odczytamy z (do) układu? czy tak to powinno się odbyć?
  • Poziom 30  
    Jeśli chcesz zapisać np. sekundy to pierwszy konfiguracyjny bajt ma wartość &B10000000 (&H80) (patrz Table 3. Register Address/Definition ) . Następny bajt to wartość z przedziału od 00 do 59 (sekundy w BCD :!: ) Następnie nie wiem, czy układ ma autoinkrementacje, czy musisz podać adres następnej komórki (&H82), żeby zapisać minuty (w BCD :!: ). Nie jestem pewny jak to będzie w Burst Mode .
  • Poziom 14  
    Tak tylko pierwszy bajt ustawia rejestry ? czy z układu robię odczyt lub zapis i czy to dotyczy zegar, ram następnie podaje w drugim bajcie co zapisuje lub odczytuję sekundę minuty godziny datę dnia rok lub ram ? Ram spoko bo podaje adres w pierwszym bajcie, skąd dokąd odczytać lub zapisać a0 a2 a3 a4 a5, następnie podaje drugi baj z informacją do zapisu lub wpisuje do odczytu i teraz powinien być trzeci bajt w którym jest informacja zapisana z zegara ramu, lub wpisana do odczytu bo pierwszy jest konfiguracyjny drugi, co ma zrobić układ i teraz powinien być trzeci z informacją odczytaną lub do zapisu. A datasheet nic o tym nie pisze tego nie rozumie.
    Według mnie powinien być trzeci bajt czy się mylę? :!:
  • Poziom 30  
    Słuchaj może weź ten układ i sprawdź ? Bo z nas dwóch to Ty go masz, a nie ja :)
  • Poziom 14  
    to jet ten pierwszy bajt
    bit 76543210
    Rozpisałem sobie adresy binarnie i nap zapisz 80h-&B10000000
    odczyt 81h-&B10000001
    czyli bit7 zezwalaj na odczyt i zapis układu
    bit6 0-dotyczy zegara
    bit5 zegar nie dotyczy
    bit4 zegar nie dotyczy
    bit3 zegar nie dotyczy
    bit2 zegar nie dotyczy
    bit1 zegar nie dotyczy
    bit0 0-zapis do układu 1-odczyt z układu sekund

    ram
    C1h-11000001 adres 00 odczyt
    C0h-11000000 adres 00 zapis

    FDh-11111101 adres 31 odczyt
    FCh-11111100 adres 31 zapis

    bit7 zezwalaj na odczyt i zapis układu
    bit6 1-dotyczy ram
    bit5 zegar adres bajtu -1 a4
    bit4 zegar adres bajtu -1 a3
    bit3 zegar adres bajtu -1 a2
    bit2 zegar adres bajtu -1 a1
    bit1 zegar adres bajtu -1 a0
    bit0 0-zapis do układu 1-odczyt z układu sekund
    adresy od 4 do 1 &B11111 to jest 31.

    Więc drugi bajt to nic innego jak dane odczytane lub do zapisu. I dlatego są tylko
    dwa bajty.
    Teraz pytanie jak to zrobić w bascomie aby np. pinc.0 potrafił wysłać i odebrać te dane jak to najlepiej ugryźć aby działało 3-wire ?:!:

    Dodano po 3 [minuty]:

    ram tak miało być
    *********************************
    bit7 zezwalaj na odczyt i zapis układu
    bit6 1-dotyczy ram
    bit5 Ram adres bajtu -1 a4
    bit4 Ram adres bajtu -1 a3
    bit3 Ram adres bajtu -1 a2
    bit2 Ram adres bajtu -1 a1
    bit1 Ram adres bajtu -1 a0
    bit0 0-zapis do układu 1-odczyt z układu sekund
    ***********************************
    :D:D:D:D:D:D

    Dodano po 1 [minuty]:

    bit0 0-zapis do układu 1-odczyt z układu ram adresu

    Dodano po 5 [minuty]:

    Ale dalej nie wiem poco jest ten brust ram,clock?
  • Poziom 14  
    Więc tak prubuję:
    Code:

    $regfile = "m128def.dat"
    $crystal = 16000000
    $baud = 115200
    Dim Oc As Word At &H600                                     '0-1 zmienna word
    Dim Oa As Byte At &H600 Overlay                             '0 zmienna
    Dim Ob As Byte At &H601 Overlay   
     Config Portb.4 = Output
     Config Portb.5 = Input
     Config Portb.6 = Output
    Declare Sub 1302_czytam
     Declare Sub 1302_zapisuj
    Print
     Print "                                          "
     Print

     1302_czytam   

     1302_zapisuj 

     1302_czytam   
    end

    '*****************************************************************************
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '*****************************************************************************
     Sub 1302_czytam
    ' Przeznaczenie:
    'Wsuwa ciąg bitów do zmiennej.
    'Składnia:
    'SHIFTIN  pin_danych , pin_zegarowy , zmienna , opcje [, il_bitów , opóźnienie ]

    '0 najpierw bit MSB jest wpisywany przy wystawieniu niskiego poziomu logicznego na końcówce zegarowej
    '1 najpierw bit MSB jest wpisywany przy wystawieniu wysokiego poziomu logicznego na końcówce zegarowej
    '2 najpierw bit LSB jest wpisywany przy wystawieniu niskiego poziomu logicznego na końcówce zegarowej
    '3 najpierw bit LSB jest wpisywany przy wystawieniu wysokiego poziomu logicznego na końcówce zegarowej
    'Gdy liczba określająca opcję zostanie powiększona o 4, wtedy sygnał zegarowy nie będzie generowany i lina zegarowa będzie pełnić rolę wejścia zewnętrznego sygnału zegarowego (tryb SLAVE).:


    '4 najpierw bit MSB jest wpisywany przy niskim poziomie logicznym na końcówce zegarowej
    '5 najpierw bit MSB jest wpisywany przy wysokim poziomie logicznym na końcówce zegarowej
    '6 najpierw bit LSB jest wpisywany przy niskim poziomie logicznym na końcówce zegarowej
    '7 najpierw bit LSB jest wpisywany przy wysokim poziomie logicznym na końcówce zegarowej

     Oa = &H81                                                  '&H81
     Ob = &H00
     'Oc = Oa + Ob
     Portb.6 = 1
     Print Hex(oc)

     Shiftin Pinb.5 , Portb.4 , Oc , 0 , 16 , 1000              'odczytuje 16 bitów

     Portb.6 = 0

     Print Hex(oc)


     End Sub

    '***********************************************
    '+++++++++++++++++++++++++++++++++++++++++++++++
    '***********************************************
     Sub 1302_zapisuj
     'Przeznaczenie:
     'Wysuwa ciąg bitów pochodzący z określonej zmiennej.
     'Składnia:
     'SHIFTOUT  pin_danych , pin_zegarowy , zmienna , opcje [, il_bitów , opóźnienie ]
     '0 najpierw bit MSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
     '1 najpierw bit MSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
     '2 najpierw bit LSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
     '3 najpierw bit LSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej


      Oa = &H80                                                 '&H80
      Ob = &H26

      'Oc = Oa + Ob
      Portb.6 = 1
      Print Hex(oc)
      Shiftout Pinb.5 , Portb.4 , Oc , 2 , 16 , 1000            'nadanie 16 bitów

      Portb.6 = 0

      Print Hex(oc)

     End Sub
    '********************************************************
    '++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '********************************************************


    a wyniki są takie:
    0081 tak wygląda 1 odczyt
    0000

    2680 tak wygląda zapis
    2680

    0081 tak wygląda 2 odczyt
    0002------->ta 2 jest zawsze po drugim odczycie
    może ktoś wie co robię nie tak?
  • Poziom 14  
    Witam ponownie zastanawiam się czy ktoś byłby taki miły i przetłumaczył mi te fragmenty
    tekstu to może więcej się dowiem i uda mi się uruchomić tę transmisje.




    Z moim słabym angielskim nie umie połapać o co chodzi z tym "BURST"
    [img]
    bascom ds1302 transmisja 3-wire

    Dodano po 11 [minuty]:

    Coś mi nie wyszło z tym textem ięc jeszcze raz:

    text:
    BURST MODE
    Burst mode can be specified for either the clock/calendar or the RAM registers by addressing location 31 decimal (address/command bits 1 through 5 = logic 1). As before, bit 6 specifies clock or RAM and bit 0 specifies read or write. There is no data storage capacity at locations 9 through 31 in the Clock/Calendar Registers or location 31 in the RAM registers. Reads or writes in burst mode start with bit 0 of address 0.
    When writing to the clock registers in the burst mode, the first eight registers must be written in order for the data to be transferred. However, when writing to RAM in burst mode it is not necessary to write all 31 bytes for the data to transfer. Each byte that is written to will be transferred to RAM regardless of whether all 31 bytes are written or not.

    CLOCK/CALENDAR BURST MODE
    The clock/calendar command byte specifies burst mode operation. In this mode, the first eight clock/calendar registers can be consecutively read or written (see Table 3) starting with bit 0 of address 0.
    If the write-protect bit is set high when a write clock/calendar burst mode is specified, no data transfer will occur to any of the eight clock/calendar registers (this includes the control register). The trickle charger is not accessible in burst mode.
    At the beginning of a clock burst read, the current time is transferred to a second set of registers. The time information is read from these secondary registers, while the clock may continue to run. This eliminates the need to re-read the registers in case of an update of the main registers during a read.

    RAM BURST MODE
    The RAM command byte specifies burst mode operation. In this mode, the 31 RAM registers can be consecutively read or written (see Table 3) starting with bit 0 of address 0.


    :|
    Figure 4. Data Transfer Summary na obrazku powyżej przy odczycie rejestr jest wysyłany na zboczu narastającym a dane od czytywane są przy opadającym.
    Jak to zrealizować programowo ? Proszę o podpowiedzi.:|
  • Pomocny post
    Poziom 30  
    Translator Google naszym przyjacielem :D

    BURST MODE coś jak tryb seryjny

    Burst mode can be specified for either the clock/calendar or the RAM registers by addressing location 31 decimal (address/command bits 1 through 5 = logic 1).
    Tryb seryjny można działać dla zegar/kalendarz lub rejestrów RAM poprzez adresowanie lokalizacji 31 (adres / bity polecenia od 1 do 5 = logiczne 1).

    As before, bit 6 specifies clock or RAM and bit 0 specifies read or write.
    Bit 6 określa zegar/RAM, a bit 0 zapis/odczyt.

    There is no data storage capacity at locations 9 through 31 in the Clock/Calendar Registers or location 31 in the RAM registers.
    Nie ma możliwości przechowywania danych w miejscach od 9 do 31 w zegar / kalendarz rejestrów lub miejsce 31 w rejestrach pamięci RAM.

    Reads or writes in burst mode start with bit 0 of address 0.
    Odczyt lub zapis w trybie burst zaczyna się od bitu 0 w adresie 0.

    When writing to the clock registers in the burst mode, the first eight registers must be written in order for the data to be transferred.
    Podczas wpisywania do rejestrów zegara w trybie burst, w ciągu pierwszych ośmiu rejestrów musi być napisana w celu transferowanych danych. Czyli w trybie burst musisz kolejno zapisywać wszystkie rejestry zegara.

    RAM in burst mode it is not necessary to write all 31 bytes for the data to transfer. Each byte that is written to will be transferred to RAM regardless of whether all 31 bytes are written or not.
    RAM w trybie burst nie jest konieczne, aby napisać do wszystkich 31 bajtów danych do przesłania. Każdy bajt, który jest zapisywany zostaną przeniesione do pamięci RAM, niezależnie od tego, czy wszystkie 31 bajty są w formie pisemnej lub nie. Czy w trybie burst nie musisz zapisywać wszystkich komórek RAMu.

    Resztę sobie możesz samodzielnie przetłumaczyć na translate.google.pl :)

    Cytat:
    Figure 4. Data Transfer Summary na obrazku powyżej przy odczycie rejestr jest wysyłany na zboczu narastającym a dane od czytywane są przy opadającym.
    Jak to zrealizować programowo ? Proszę o podpowiedzi.


    Tu masz gotowe przykłady, w pierwszym linku nawet KLIK
  • Poziom 14  
    Wielkie dzięki Logan myślę że te informacje które pomogłeś mi zdobyć wystarczą,
    do obsłużenia układu.:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D
  • Poziom 30  
    Nie zapomnij pochwalić się wynikami.
  • Poziom 14  
    Witam i dla wszystkich zainteresowanych a widziałem że było wielu działający kod wymaga jeszcze paru poprawek. Dzięki za pomoc.
    a poniżej kod:
    Code:

    $regfile = "m128def.dat"
    $crystal = 16000000
    $baud = 115200

     Dim I As Word
     Dim A As Byte
     Dim B As Byte
     Dim C As Byte
     Dim D As Byte
     Dim S As Long
     Dim Rok As Byte
     Dim Dzien_tygodnia As Byte
     Dim Dzien As Byte
     Dim Miesiac As Byte
     Dim Godzina As Byte
     Dim Minuta As Byte
     Dim Sekunda As Byte

     'Dim Oc As Word
     'Dim Oa As Byte
     'Dim Ob As Byte


    Dim Oc As Word At &H600                                     '0-1 zmienna word
    Dim Oa As Byte At &H600 Overlay                             '0 zmienna
    Dim Ob As Byte At &H601 Overlay                             '1 zmienna

    Dim Writecommand As Byte
    Dim Writebyte As Byte
    Dim Readcommand As Byte
    Dim Readbyte As Byte


      Const Po = "Poniedzialek"                                 ' stałe do zegara
      Const Wt = "wtorek"                                       ' stałe do zegara
      Const Sr = "Sroda"                                        ' stałe do zegara
      Const Cz = "Czwartek"                                     ' stałe do zegara
      Const Pi = "Piatek"                                       ' stałe do zegara
      Const So = "Sobota"                                       ' stałe do zegara
      Const Ni = "Niedziela"                                    ' stałe do zegara

      Const Sty = "Styczeń"                                     ' stałe do zegara
      Const Lut = "Luty"                                        ' stałe do zegara
      Const Mar = "Marzec"                                      ' stałe do zegara
      Const Kwi = "Kwiecień"                                    ' stałe do zegara
      Const Maj = "Maj"                                         ' stałe do zegara
      Const Cze = "Czerwiec"                                    ' stałe do zegara
      Const Lip = "Lipiec"                                      ' stałe do zegara
      Const Sie = "Sierpień"                                    ' stałe do zegara
      Const Wrz = "Wrzesienń"                                   ' stałe do zegara
      Const Paz = "Pazdziernik"                                 ' stałe do zegara
      Const Lis = "Listopad"                                    ' stałe do zegara
      Const Gru = "Grudzien"                                    ' stałe do zegara










     Config Portb.4 = Output
     Config Portb.6 = Output


     Serialclock Alias Portb.4
     Serialin_out Alias Pinb.5                                  '
     Ds1302 Alias Portb.6

     
     Declare Sub 1302_czytam
     Declare Sub 1302_zapisuj
     Declare Sub Zegar_1302
     Declare Sub Czytam_zegar


     


     

     
      Zegar_1302       'tu jest zapis
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar
      Waitms 1000
      Czytam_zegar


    End                                                         'end program

    '*****************************************************************************
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '*****************************************************************************
    Sub Zegar_1302

     Print "Wpisuje bit odbezpieczający zapis Protect"
     Writecommand = &H8E
     Writebyte = &B00000000
     1302_zapisuj

     Waitus 5

     Print "Wpisuje rok"
     Writecommand = &H8C
     Writebyte = &B00010000
     1302_zapisuj

     Print "Wpisuje dzień nazwa"
     Writecommand = &H8A
     Writebyte = &B00000100
     1302_zapisuj

     Print "Wpisuje miesiąc"
     Writecommand = &H88
     Writebyte = &B00000010
     1302_zapisuj

     Print "Wpisuje dzień"
     Writecommand = &H86
     Writebyte = &B00010000
     1302_zapisuj

     Print "Wpisuje godzina"
     Writecommand = &H84
     Writebyte = &B00100000
     1302_zapisuj


     Print "Wpisuje minuty"
     Writecommand = &H82
     Writebyte = &B00110101
     1302_zapisuj

     Print "Wpisuje sekundy"
     Writecommand = &H80
     Writebyte = &B00000000
     1302_zapisuj



    End Sub

    '*****************************************************************************
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '*****************************************************************************
     Sub Czytam_zegar

     Readcommand = &H81
     1302_czytam
     Sekunda = Readbyte

     'Print "sekunda=" ; Bcd(readbyte)

     Readcommand = &H83
     1302_czytam
     Minuta = Readbyte
     'Print "minuta=" ; Bcd(readbyte)

     Readcommand = &H85
     1302_czytam
     Godzina = Readbyte
     'Print "godzina=" ; Bcd(readbyte)

     Readcommand = &H87
     1302_czytam
     Dzien = Readbyte
     'Print "data=" ; Bcd(readbyte)

     Readcommand = &H89
     1302_czytam
     Miesiac = Readbyte
     'Print "miesiąc=" ; Bcd(readbyte)

     Readcommand = &H8B
     1302_czytam
     Dzien_tygodnia = Readbyte
     'Print "dzień tygodnia=" ; Bcd(readbyte)

     Readcommand = &H8D
     1302_czytam
     Rok = Readbyte
     'Print "rok=" ; Bcd(readbyte)



     Print "20" ; Bcd(rok) ; "r.-" ;

        If Miesiac = 1 Then
        Print Sty;
        Elseif Miesiac = 2 Then                                 'Bcd(miesiac)
        Print Lut;
        Elseif Miesiac = 3 Then
        Print Mar;
        Elseif Miesiac = 4 Then
        Print Kwi;
        Elseif Miesiac = 5 Then
        Print Maj;
        Elseif Miesiac = 6 Then
        Print Cze
        Elseif Miesiac = 7 Then
        Print Lip;
        Elseif Miesiac = 8 Then
        Print Sie;
        Elseif Miesiac = 9 Then
        Print Wrz;
        Elseif Miesiac = 10 Then
        Print Paz;
        Elseif Miesiac = 11 Then
        Print Lis;
        Elseif Miesiac = 12 Then
        Print Gru;
        End If

        Print ; "-" ; Bcd(dzien) ; "   " ;                      '


        If Dzien_tygodnia = 1 Then
        Print Po ;                                              '
        Elseif Dzien_tygodnia = 2 Then                          '
        Print Wt ;                                              '
        Elseif Dzien_tygodnia = 3 Then                          '
        Print Sr ;
        Elseif Dzien_tygodnia = 4 Then                          '
        Print Cz ;
        Elseif Dzien_tygodnia = 5 Then                          '
        Print Pi ;
        Elseif Dzien_tygodnia = 6 Then                          '            Bcd(dzien_tygodnia)
        Print So ;
        Elseif Dzien_tygodnia = 7 Then                          '
        Print Ni ;                                              '
        End If
        Print ; "  ";


     Print Bcd(godzina) ; ":"; Bcd(minuta) ; ":" ; Bcd(sekunda)

                                               '
     End Sub
    '*****************************************************************************
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '*****************************************************************************

    '*****************************************************************************
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '*****************************************************************************
     Sub 1302_czytam
    ' Przeznaczenie:
    'Wsuwa ciąg bitów do zmiennej.
    'Składnia:
    'SHIFTIN  pin_danych , pin_zegarowy , zmienna , opcje [, il_bitów , opóźnienie ]

    '0 najpierw bit MSB jest wpisywany przy wystawieniu niskiego poziomu logicznego na końcówce zegarowej
    '1 najpierw bit MSB jest wpisywany przy wystawieniu wysokiego poziomu logicznego na końcówce zegarowej
    '2 najpierw bit LSB jest wpisywany przy wystawieniu niskiego poziomu logicznego na końcówce zegarowej
    '3 najpierw bit LSB jest wpisywany przy wystawieniu wysokiego poziomu logicznego na końcówce zegarowej
    'Gdy liczba określająca opcję zostanie powiększona o 4, wtedy sygnał zegarowy nie będzie generowany i lina zegarowa będzie pełnić rolę wejścia zewnętrznego sygnału zegarowego (tryb SLAVE).:


    '4 najpierw bit MSB jest wpisywany przy niskim poziomie logicznym na końcówce zegarowej
    '5 najpierw bit MSB jest wpisywany przy wysokim poziomie logicznym na końcówce zegarowej
    '6 najpierw bit LSB jest wpisywany przy niskim poziomie logicznym na końcówce zegarowej
    '7 najpierw bit LSB jest wpisywany przy wysokim poziomie logicznym na końcówce zegarowej

     'Oa = &H81                                                  '&H81
     'Ob = &H00
     'Oc = Oa + Ob
     'Portb.6 = 1
     'Print Hex(oc)

     'Shiftin Pinb.5 , Portb.4 , Oc , 0 , 16 , 1000              'odczytuje 16 bitów

     'Portb.6 = 0

     'Print Hex(oc)
     Config Portb.5 = Output
     Serialin_ou Alias Portb.5
     Serialclock = 1
     Serialin_ou = 1
     Ds1302 = 1
     Reset Serialclock
     Reset Ds1302
     Waitus 5
     Set Ds1302
     Waitus 5                                                   'tcc =4us, CE to clock setup time
     Shiftout Serialin_ou , Serialclock , Readcommand , 3

     Config Portb.5 = Input
     Serialin Alias Pinb.5

     Serialclock = 1
     Serialin_out = 0
     Ds1302 = 1
     Shiftin Serialin , Serialclock , Readbyte , 2
     Reset Ds1302
     Rotate Readbyte , Left , 1

     Waitus 5

     End Sub

    '*****************************************************************************
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '*****************************************************************************
     Sub 1302_zapisuj
     'Przeznaczenie:
     'Wysuwa ciąg bitów pochodzący z określonej zmiennej.
     'Składnia:
     'SHIFTOUT  pin_danych , pin_zegarowy , zmienna , opcje [, il_bitów , opóźnienie ]
     '0 najpierw bit MSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
     '1 najpierw bit MSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej
     '2 najpierw bit LSB jest podawany przy niskim poziomie logicznym na końcówce zegarowej
     '3 najpierw bit LSB jest podawany przy wysokim poziomie logicznym na końcówce zegarowej


      'Oa = &H80                                                 '&H80
      'Ob = &H26

      'Oc = Oa + Ob
      'Portb.6 = 1
      'Print Hex(oc)
      'Shiftout Pinb.5 , Portb.4 , Oc , 2 , 16 , 1000            'nadanie 16 bitów

      'Portb.6 = 0

      'Print Hex(oc)
      Config Portb.5 = Output
      'Serialin_out Alias Portb.5
     Serialclock = 1
     Serialin_ou = 0
     Ds1302 = 1
     Reset Serialclock
     Reset Ds1302
     Waitus 5
     Set Ds1302
     Waitus 5                                                   'tcc =4us, CE to clock setup time
     Shiftout Serialin_ou , Serialclock , Writecommand , 3
     Shiftout Serialin_ou , Serialclock , Writebyte , 3
     Reset Serialclock
     Waitus 5
     Reset Ds1302
     Waitus 5

     End Sub
    '*****************************************************************************
    '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    '*****************************************************************************

    Dodano po 2 [minuty]:

    a tu odczyt
    2010r.-Luty-10 Czwartek 21:33:22
    2010r.-Luty-10 Czwartek 21:33:23
    2010r.-Luty-10 Czwartek 21:33:24
    2010r.-Luty-10 Czwartek 21:33:25
    2010r.-Luty-10 Czwartek 21:33:26
    2010r.-Luty-10 Czwartek 21:33:27
    2010r.-Luty-10 Czwartek 21:33:28
    2010r.-Luty-10 Czwartek 21:33:29
    2010r.-Luty-10 Czwartek 21:33:30
    2010r.-Luty-10 Czwartek 21:33:31
    2010r.-Luty-10 Czwartek 21:33:32
    2010r.-Luty-10 Czwartek 21:33:33
    2010r.-Luty-10 Czwartek 21:33:34
    2010r.-Luty-10 Czwartek 21:33:35
    2010r.-Luty-10 Czwartek 21:33:36
    2010r.-Luty-10 Czwartek 21:33:37
    2010r.-Luty-10 Czwartek 21:33:38

    Dodano po 2 [godziny] 7 [minuty]:

    Witam ale dzisiaj jest jeszcze środa więc poprawiłem i ponowny odczyt:

    2010r.-Luty-10 Środa 23:37:35
    2010r.-Luty-10 Środa 23:37:36
    2010r.-Luty-10 Środa 23:37:37
    2010r.-Luty-10 Środa 23:37:38
    2010r.-Luty-10 Środa 23:37:39
    2010r.-Luty-10 Sroda 23:37:40
    2010r.-Luty-10 Środa 23:37:41
    2010r.-Luty-10 Środa 23:37:42
    2010r.-Luty-10 Środa 23:37:43
    2010r.-Luty-10 Środa 23:37:44
    2010r.-Luty-10 Środa 23:37:45
    2010r.-Luty-10 Środa 23:37:46
    2010r.-Luty-10 Środa 23:37:47
    2010r.-Luty-10 Środa 23:37:49
    2010r.-Luty-10 Środa 23:37:50
    2010r.-Luty-10 Środa 23:37:51
    2010r.-Luty-10 Środa 23:37:52
  • Poziom 2  
    Good morning.

    I'm sorry for the Google translation of my message into Polish but it is the best that I can do.

    I found this thread while looking for some DS1302 code. I used the last code segment to develop my own DS1302 include. I'm posting my finished code here. I hope you find it useful.

    Hank.

    Dzień dobry.

    Przepraszam za moje tłumaczenie wiadomości z Google na język polski, ale to najlepsze, co mogę zrobić.

    Znalazłem ten wątek, patrząc na niektóre DS1302 kodu. Użyłem ostatnio segment kodu do opracowania własnej DS1302 zawiera. Jestem gotowy kod mój komentarz tutaj. Mam nadzieję, że okaże się przydatny.

    Hank.

    ------------------------------------------------------------

    First, you need a clock library. This library works for both the DS1307 and the DS1302.

    Po pierwsze, musisz zegar biblioteki. Biblioteka ta działa zarówno dla DS1307 i DS1302.

    Code:
    ;the only changes needed are calling the main program to set/get the variables
    

    [_make_dt]
    ; assigns the reserved variables TIME$ and DATE$
    $external _byte2str
    _make_dt:
       Call Getdatetime ; This Is In The Main Prog
       Loadadr Date$ , X ; Get Address Of Date$
       Loadadr _month , Z ; Get Address Of _month Byte
       Ld r24,Z                           ; get first byte is month
       Rcall _byte2Str                    ; add to date string
       Ldi r24,47                         ; add /
       St x+,r24                          ; store
       Ld r24, -z                         ; get day
       rcall _byte2Str                    ; add to date string
       ldi r24,47                         ; add /
       st x+,r24                          ; store
       adiw zl,2                          ; point to year
       ld r24,z                           ; get year
       rcall _byte2Str                    ; add to date string
       clr r24                            ; string terminator
       st x+,r24                          ; store tring terminator
       ;now do the time time$ must be dimmed after date$
       ;this is handled by the compiler
       sbiw zl,2                          ; go back
       ld r24,-z                          ; get hour
       rcall _byte2Str                    ; add to date string
       ldi r24,58                         ; add :
       st x+,r24                          ; store
       ld r24,-z                          ; get minutes
       rcall _byte2Str                    ; add to date string
       ldi r24,58                         ; add :
       st x+,r24                          ; store
       ld r24,-z                          ; get secs
       rcall _byte2Str                    ; add to date string
       clr r24
       st x,r24                           ; add null terminator
    Ret
    [end]

    [_set_date]
    $external _str2byte
    ; assigns the date$ variable to the date bytes
    _set_date:
       Loadadr _month , X ; Address Of Month Byte
       Loadadr Date$ , Z ; Point To Date$ Variable
       ld r24,z+                          ; get month MSB
       ld r25,z+                          ; get month LSB
       rcall _str2byte                    ; convert
       st x,r16                           ; save month
       adiw zl,1                          ; skip /
       ld r24,z+                          ; get day MSB
       ld r25,z+                          ; get day LSB
       rcall _str2byte                    ; convert
       st -x,r16                          ; save day
       adiw zl,1                          ; skip /
       ld r24,z+                          ; get year MSB
       ld r25,z                           ; get year LSB
       rcall _str2byte                    ; convert
       adiw xl,2                          ; point to year
       st x,r16                           ; save year
       Call Setdate ; Calls The Main Program
    Ret
    [end]

    [_set_time]
    $external _str2byte
    ;assigns the time$ variable to the time bytes of the clock
    _set_time:
       Loadadr _hour , X ; Load Address Of Hour
       Loadadr Time$ , Z ; Point To Time$
       ld r24,z+                          ; get hour MSB
       ld r25,z+                          ; get hour LSB
       rcall _str2byte                    ; convert
       st x,r16                           ; save hour
       adiw zl,1                          ; skip :
       ld r24,z+                          ; get minute MSB
       ld r25,z+                          ; get minute LSB
       rcall _str2byte                    ; convert
       st -x,r16                          ; save minutes
       adiw zl,1                          ; skip :
       ld r24,z+                          ; get seconds MSB
       ld r25,z                           ; get seconds LSB
       rcall _str2byte                    ; convert
       st -x,r16                          ; save seconds
       Call Settime
    Ret


    Next, you need the include:

    Następnie należy między innymi:

    Code:
    '----------------------------------------------------------------------
    
    ' ds1302include.bas
    '----------------------------------------------------------------------

    $lib "ds1302clock.lib"

    Config Portc.4 = Output
    Config Portc.6 = Output

    Ds1302_clock Alias Portc.4                                  ' DS1302 Pin 7 - Clock
    Ds1302_io Alias Pinc.5                                      ' DS1302 Pin 6 - I/O
    Ds1302_io_port Alias Portc.5
    Ds1302_enable Alias Portc.6                                 ' DS1302 Pin 5 - Enable

    Declare Sub Ds1302_write(byval Clockcommand As Byte , Clockbyte As Byte)
    Declare Function Ds1302_read(byval Clockcomand As Byte) As Byte
    Declare Sub Ds1302_set_time(byval Strtime As String)

    '----------------------------------------------------------------------
    ' Ds1302_read
    '----------------------------------------------------------------------

    Function Ds1302_read(byval Clockcomand As Byte) As Byte

       Dim Readbyte As Byte

       Config Ds1302_io_port = Output

       Set Ds1302_clock

       Set Ds1302_io

       Set Ds1302_enable

       Reset Ds1302_clock

       Reset Ds1302_enable

       Waitus 5

       Set Ds1302_enable

       Waitus 5                                                 'tcc =4us, CE to clock setup time

       Shiftout Ds1302_io_port , Ds1302_clock , Clockcomand , 3

       Config Ds1302_io_port = Input

       Set Ds1302_clock

       Reset Ds1302_io

       Set Ds1302_enable

       Shiftin Ds1302_io , Ds1302_clock , Readbyte , 2

       Reset Ds1302_enable

       Rotate Readbyte , Left , 1

       Waitus 5

       Ds1302_read = Readbyte

    End Function

    '----------------------------------------------------------------------
    ' Ds1302_write
    '----------------------------------------------------------------------

    Sub Ds1302_write(byval Clockcommand As Byte , Clockbyte As Byte)

       Config Ds1302_io_port = Output

       Set Ds1302_clock

       Reset Ds1302_io

       Set Ds1302_enable

       Reset Ds1302_clock

       Reset Ds1302_enable

       Waitus 5

       Set Ds1302_enable

       Waitus 5                                                 'tcc =4us, CE to clock setup time

       Shiftout Ds1302_io_port , Ds1302_clock , Clockcommand , 3

       Shiftout Ds1302_io_port , Ds1302_clock , Clockbyte , 3

       Reset Ds1302_clock

       Waitus 5

       Reset Ds1302_enable

       Waitus 5

    End Sub

    '----------------------------------------------------------------------
    ' Getdatetime
    '----------------------------------------------------------------------
    '
    ' Reads the date and time from the DS1302 real time clock and stores
    ' them in the system variables _year, _month, _day, _hour, _min, and
    ' _sec
    '
    '----------------------------------------------------------------------

    Getdatetime:

       _sec = Ds1302_read(&H81)

       _min = Ds1302_read(&H83)

       _hour = Ds1302_read(&H85)

       _day = Ds1302_read(&H87)

       _month = Ds1302_read(&H89)

       _year = Ds1302_read(&H8d)

      _sec = Makedec(_sec)
      _min = Makedec(_min)
      _hour = Makedec(_hour)
      _day = Makedec(_day)
      _month = Makedec(_month)
      _year = Makedec(_year)

    Return

    '----------------------------------------------------------------------
    ' Setdate
    '----------------------------------------------------------------------
    '
    ' Writes the date stored in the system variables _year, _month, and
    ' _day to the DS1302 real time clock.  Called by ds1302clock.lib
    '
    ' To use:
    '
    ' Date$ = "yy-mm-dd"
    '
    '----------------------------------------------------------------------

    Setdate:

       _day = Makebcd(_day)
       Ds1302_write &H86 , _year

       _month = Makebcd(_month)
       Ds1302_write &H88 , _month

       _year = Makebcd(_year)
       Ds1302_write &H8C , _year

    Return

    '----------------------------------------------------------------------
    ' Settime
    '----------------------------------------------------------------------
    '
    ' Writes the time stored in the system variables _hour, _min, and _sec
    ' to the DS1302 real time clock.  Called by ds1302clock.lib
    '
    ' To use:
    '
    ' Time$ = "hh:mm:dd"
    '
    '----------------------------------------------------------------------

    Settime:

       _hour = Makebcd(_hour)
       Ds1302_write &H84 , _hour

       _min = Makebcd(_min)
       Ds1302_write &H82 , _min

       _sec = Makebcd(_sec)
       Ds1302_write &H80 , _sec

    Return


    Finally, some demo code:

    Wreszcie jakiś kod demo:

    Code:
    '----------------------------------------------------------------------
    
    ' ds1302demo.bas
    '----------------------------------------------------------------------

    $regfile = "8515def.dat"
    $crystal = 16000000

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

    '----------------------------------------------------------------------
    ' Main Program
    '----------------------------------------------------------------------

       Config Clock = User

       Config Date = Ymd , Separator = -

       Enable Interrupts

       Cls

       Upperline

       Lcd "ds1302demo.bas"

       Lowerline

       Lcd "by Hank Carr"

       Waitms 500

       Cls

       Time$ = "00:00:00"
       Date$ = "00-01-01"

       Upperline
       Lcd Time$
       Lowerline
       Lcd Date$

       Waitms 500

       Time$ = "13:25:00"
       Date$ = "10-08-09"

       Upperline
       Lcd Time$
       Lowerline
       Lcd Date$

       Waitms 500


    End

    $include "ds1302include.bas"
  • Poziom 14  
    Witam Hank nie znam Angielskiego ale dzięki za zainteresowanie ten kod napisałem tylko dla siebie czy potrafię, i działa ale jak będę miał czas (czas to kasa) przeanalizuję twój kod. I chętnie odpiszę jak to widzę (jeżeli coś z tego Polskiego zrozumiesz) i pozdrawiam kraj gdzie doceniają wiedzę i ludzi ją posiadających.
    ( Polska to zielona wyspa = Grecja)
  • Poziom 2  
    Witam. Przepraszam, nie znają języka polskiego. Kod był bardzo pomocny. Wiem, że to kolejny w ciągu kilku minut. Zrobiłem sporo zmian, aby to działało lepiej dla mojego wniosku. Niedawno kupiłem kilka DS1307s, które są takie same jak DS1302, ale bez funkcji ładowania podtrzymującego. Jeżeli pracują z tym samym kodem Ja po zauważyć tutaj.

    Hank.