- Dział: arts -
elektronika/ds1302_asm
Komunikacja DS1302 z attiny3113
Cel
Obługa zegara czasu rzeczywistego przez DS1302 marki Dallas. Komunikacja układu DS1302 z mikrokontrolerem Attiny2313.
DS1302 - informacje
komunikacja: 3-Wire interface - interface własny (to nie TWI-Two wire interface) ograniczenia: bedzie działac do 2100r -40°C do +85°C pamięc ram: 31x8b zasilania: 2.0 - 5.0V zamiennik: ds1202
DS1302 - protokół 3-Wire
Zaprezentuje tu moje wypociny związane ze zrozumieniem dokumentacji. DS1302 kożysta z protokół 3-Wire opracowanego w celu ułatwienia komunikacji z układem.
TŁUMACZENIE DOKUMENTACJI
EN:
"DATA OUTPUT"
"Following the eight SCLK cycles that input a read command byte, a data byte is output on the falling edge of the next eight SCLK cycles."
"Note that the first data bit to be transmitted occurs on the first falling edge after the last bit of the command byte is written."
"Additional SCLK cycles retransmit the data bytes should they inadvertently occur so long as CE remains high. "
"This operation permits continuous burst mode read capability."
"Also, the I/O pin is tri-stated upon each rising edge of SCLK."
"Data is output starting with bit 0."
PL:
WYSYŁANIE DANYCH przez DS1302
Po ośmiu cyklach SCLK w których układ czyta bajt polecenia, wysyłany jest bajt danych na kolejnych ośmiu opadajacych zboczach cyklu SCLk.
Zauważ że pierwszy wysyłany przez układ bit danych pojawia się na pierwszym opadajacym zboczu po zapisaniu ostatniego bitu bajtu polecenia.
Dodaktowo cykle SCLK "retransmit" bajt danych powinny "inadvertently occur" tak długo jak CE pozostaje w stanie wysokim.
Ta operacja pozwala na zgodność z trybem "burst".
także, pin I/O jest 3-stanowy przy każdym wzrastającym zboczu SCLk.
Bajt danych wysyłany jest zaczynając od bitu zerowego.
Firmware ver 0.1
Pierwsza robocza wersja oporogramowania komunikacji, celem tej wersji jest sprawdenie poprawności wysyłanych danych przez mikrokontroler.
Dizałanie firwaru ogranicza się do przeprowadzenia 3 działań:
- Odblokowanie flagi zapisu
- Odblokowanie zegara, czyli włączenie go
- Odczyt sekund
Uwaga! obiektem testu jest poprawność wysłanych danych, odbieranie danych będzie opracowywany w dalszych wersjach.
Podłoczenie
Rys 1 prezentuje schemat podłączenia układów. Podłoczenie nie zostało jeszcze wykonane! Ma ono jedynie harakter orientacyjny. Niebieskie linie to progrmator, Purpura - CE Pomarańcz- I/O Zieleń - SCLK
firmware w działaniu
Oto test działania firmware ver0.1. Obserwacji danych dokonano przy użyciu AVT389 przy frekwencji 2MHz, zapis uruchamiało pierwszy stan wysoki lini CE.
UWAGA: układ DS1302 nie był podłączony do mikrokontrolera podczas testu.
Czerwone linie wydzielają 3 komunikaty:
- usuniecie flagi WP
- usuniecie flagi CH
- oraz odczyt sekund
Każdy z komunikatów dzieli się na 2 części:
- Command Data - adres do odczytu/zapisu
- Data - informacje odczytane/zapisane
Szczegółowy opis znajduje się w dokunentacji.
I. usunięcie flagi zapisu
Aby móc dokonywać zapisu do RAM/ZEGARA musimy najpierw usunąc flagę WP.
WP - w stanie niskim oznacza możliwość zapisu.
WP - w stanie wysokim oznacza zakaz zapisu.
Flaga WP znajduje się na 7 bicie pod adresem(8F,8E)
Aby to zrobić musimy wyslać do zegara:
- COMMAND BYTE z adresem flagi WP [zobacz Tab 3a]
odczyt (hex) zapis (hex) Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 8F 8E WP 0 0 0 0 0 0 0 Dokonamy zapisu tak więc interesuje nas adres: 0x8E(hex) = 0b01110001(bin). [zobacz Tab 3b]
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 0 1 1 1 0 0 0 1 - DATA wartość zero: 0x00h = 0b00000000
Nie jestem pewien czy tak ma wyglądać, tego kroku nie ma opisanego w dokumentacji. Staram się ustawić 7Bit na zero wartość 0x00 = 0b00000000
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 0 0 0 0 0 0 0 0
II. usunięcie flagi stopu zegara
Aby zegar, 'tykał' musimy go o to poprosić. Odbywa się to przez usunięcie flagi CH (Clock Halt Flag) CH - w stanie wysokim oznacza że zegar stoi CH - w stanie niskim zegar tyka Flaga CH znajduje się na 7 bicie pod adresem (81h,80h)
Aby ustawić flage CH musimy wyslać do zegara:
- COMMAND BYTE z adresem flagi CH:
odczyt (hex) zapis (hex) Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 81 80 CH 10 Seconds Seconds Dokonamy zapisu tak więc interesuje nas adres: 0x80(hex) = 0b10000000(bin).
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 1 0 0 0 0 0 0 0 - DATA wartość 0: 0x00(hex) = 0b00000000
Aby wyzerować Bit7,wysyłam wartość 0.
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 0 0 0 0 0 0 0 0
II. odczyt
Dla testu działania program odczyta sekundy. Sekundy są zapidane na bicie6,7,4 oraz 3,2,1,0 pod adresem(81h,80h) Aby je odczytać musimy wyslać do zegara:
- COMMAND BYTE z adresem flagi CH:
odczyt (hex) zapis (hex) Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 81 80 CH 10 Seconds Seconds Dokonamy zapisu tak więc interesuje nas adres: 0x80(hex) = 0b10000000(bin).
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 1 0 0 0 0 0 0 0 - DATA wartość: tę wartość powinien podać na DS1302
wartość odczytaną, narazie pomijamy gdyż DS1302 nie był podłączony.
Firmware ver 0.5
Druga wersja robocza z poprawionymi zasadami zapisu odczytu.
[Output] Zapis bitu do zegara: Zegar czyta z linii I/O bit na rosnącym zboczu SCLK,
[input] Odczyt danych z zegara: Zegar wysyła bit na linii I/O na opadającym zboczu SCLK.
firmware w działaniu
Podgląd działania ujawnia znaczne problemy: Układ zawsze odpowiada 0xFF(hex)=0b11111111 niezależnie od COMMAND BYTE.
Z obserwacji wiem że jego odłączenie DS1302 od attiny2313 sprawia brak Sygnału/odczytu na lini I/O, to dobrze gdyż dzięki temu wiem że sygnał pochodzi z DS1302. Sygnał pojawia się nawet przy braku zasilania dla zegara! To dziwne, moze swiadczyć o tym że jest to komunikat błędu, może odmowy zapisu? Po wymianie na nowy nadal istnieje ten sam problem tak wiec wiem juz że to robie coś źle. Przypuszczam że może to być: zle podłąone zasilanie do DS1302, złe podłączenie układów, brak usunięcia flagi WP, lub bład w kodzie związany z odczytem.
Firmware ver 1.0
Pierwsza sprawna wersja interfacu. Pozwala na zapis i odczyt danych
UWAGA: układ podczas pracy grzeje się można to wyczuć ręką.
Na obrazku widać podłączony układ.
timming
dowód działania dla częstotliwości pracy 1Mhz:
download
Wersja napisana dla attiny2313 w AVR Studio. Zezwalam na dowolne wykożystanie. Jeżeli Ci to pomoże, powiedz mi o tym. pobierz: ver 1.0
Firmware ver 1.1
zmiany
Naprawiłem procedure odczytu danych (był błąd w zapisywaniu do rejestru) Teraz dane prezentowane są na ekranie segmentowym
; ******** #16 ************
;zapisz wyslane dane
push j
in j,DS1302_PIN; todo: zamien na DS1302_Port-??
;czytaj
;SBRS j,DS1302_IO ;jeżeli bit jest wyzerowany
;CBR data_byte,7 ;wyzeruj
SBRC j,DS1302_IO ;jeżeli bit jest ustawiony
SBR data_byte,0b10000000 ;to go ustaw ;UWAGA: a nie: "SBR data_byte,7"
;przesun bity w lewo(ten już odczytano)
;(przeskocz ten krok w ostatnim kroku)
ldi j,1
CPSE i,j
LSR data_byte
;----------
pop j
;--------------
działanie
- test podłączenia ekranow (a,b,c,d,e,f,g,pd)
- usuniecie flagi 'Clock Halt'
- usuniecie flagi 'Write Protection'
- ustawienie czasu: godziny, minuty, sekundy
- odczyt: godziny, minuty, sekundy
- wyświetlenie wartośći na 8ekranach sementowych w kolejnosci: godziny, minuty, sekundy
układ w działaniu
Działanie: Test w nocy:
źródła
DS1302:
- stona producenta - podukt:
http://www.maxim-ic.com/datasheet/index.mvp/id/2685 - dokumentacja:http://datasheets.maxim-ic.com/en/ds/DS1302.pdf
Attiny2313:
- strona producenta - Atmel
http://www.atmel.com/dyn/products/product_card.asp?part_id=3229
Assembler:
- tabela niekótrych poleceń [PL]
http://www.elportal.pl/ea/asm_avr_jezyk.html
Zakup układu:
Tu uzyskałem pomoc:
Pobierz kod w asm:
- szukaj tu
download