Wiem że ten temat był już wielokrotnie poruszany przeszukałem forum wielokrotnie nie pomogło mi to ani wujek Google. Pracuje nad tym już długo, za długo.
Przyjmę każdą radę nawet jak pracować.
Forum zwracam się do Was bo nie wiem jak to zrobić.
moim zadaniem jest napisanie interface dla DS1302 z attiny2313 w Asemblerze
Problem:
Jednak przy próbie odczytania danych zawsze dostaje same jedynki.
Próbowałem już napisać flagę zapisu (WP) i nadal tak to wygląda.
opisałem każdy krok zmagań tu: Link
oto schemat podłączenia:
interpretacja analizy stanów logicznych:
interpretacja analizy stanów logicznych + timming:
najnowsza analiza stanów:
Przyjmę każdą radę nawet jak pracować.
Forum zwracam się do Was bo nie wiem jak to zrobić.
moim zadaniem jest napisanie interface dla DS1302 z attiny2313 w Asemblerze
Problem:
Jednak przy próbie odczytania danych zawsze dostaje same jedynki.
Próbowałem już napisać flagę zapisu (WP) i nadal tak to wygląda.
opisałem każdy krok zmagań tu: Link
oto schemat podłączenia:
interpretacja analizy stanów logicznych:
interpretacja analizy stanów logicznych + timming:
najnowsza analiza stanów:
.NOLIST ; wyłączenie z raportu z kompilacji
.INCLUDE "2313def.inc" ; dołączonego pliku AT90S2313def.inc
.equ DS1302_Port = PORTB
.equ DS1302_CE = 0
.equ DS1302_IO = 1
.equ DS1302_SCLK = 2
.list
.listmac
;-----------------------------------------------------------------------------
.cseg
.org 0
rjmp ResetProcessor ;
;-----------------------------------------------------------------------------
ResetProcessor : ;
cli ;
ldi r16,LOW(RAMEND) ;
out SPL,r16 ;
rjmp Main ; powrot do petli
InitDS1302:
cbi DS1302_Port,DS1302_SCLK ;LOW (stan niski) == cbi PORTB,PORTB2
cbi DS1302_Port,DS1302_IO ;LOW (stan niski) == cbi PORTB,PORTB1
cbi DS1302_Port,DS1302_CE ;LOW (stan niski) == cbi PORTB,PORTB0
sbi DS1302_Port-1,DS1302_SCLK ;output == sbi DDRB,DDB2
sbi DS1302_Port-1,DS1302_IO ;output == sbi DDRB,DDB1
sbi DS1302_Port-1,DS1302_CE ;output == sbi DDRB,DDB0
ret
wait:
nop nop
nop nop
nop nop
nop nop
nop nop
nop nop
nop nop
nop nop
nop nop
nop nop
nop nop
nop nop
nop nop
nop nop
ret
;wysyłanie polecenia
;r16
SendCode_COMMAND:
CBI DS1302_Port,DS1302_SCLK ;OFF
;ustaw linie
SBRS r16,0 ;jeżeli bit jest wyzerowany
CBI DS1302_Port,DS1302_IO ;wyzeruj
SBRC r16,0 ;jeżeli bit jest ustawiony
SBI DS1302_Port,DS1302_IO ;to go ustaw
;--------------
;przesun bity w prawo(ten już wysłano)
LSR r16
;----------
SBI DS1302_Port,DS1302_SCLK ;ON
;czekaj
rcall wait;
;----------
;TU DE1302 odczytuje dane
;czekaj
rcall wait;
;----------
;czekaj
rcall wait;
;----------
;koniec odczytu
CBI DS1302_Port,DS1302_IO ;czyść stan linie
ret
;TODO - nie testowane
;pobieranie danych
;r17
GetCode_DATA:
CBI DS1302_Port,DS1302_SCLK ;OFF
;tu ds1302 ustawia wartość
in r17,PINB; todo: zamien na DS1302_Port-??
;czytaj
SBRS r17,DS1302_IO ;jeżeli bit jest wyzerowany
CBR r16,7 ;wyzeruj
SBRC r17,DS1302_IO ;jeżeli bit jest ustawiony
SBR r16,7 ;to go ustaw
;--------------
;przesun bity w prawo(ten już wysłano)
LSL r16
;----------
SBI DS1302_Port,DS1302_SCLK ;ON
;czekaj
rcall wait;
;----------
;czekaj
rcall wait;
;----------
ret
;---------------
;wysyła się od tyłu
;r16 - command
;r17 - data
WriteData:
SBI DS1302_Port,DS1302_CE ;ON - transmisja rozpoczeta
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
nop ; nic nie porzeba
mov r16,r17
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
ret
;odczyt danych
;r16
;r17
ReadData:
SBI DS1302_Port,DS1302_CE ;ON - transmisja rozpoczeta
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
rcall SendCode_COMMAND;
clr r16
;cbi DS1302_Port, DS1302_IO ;LOW (stan niski) == cbi PORTB,PORTB1
cbi PINB, DS1302_IO ;PINB
cbi DS1302_Port-1, DS1302_IO ;DDRB
rcall GetCode_DATA;
rcall GetCode_DATA;
rcall GetCode_DATA;
rcall GetCode_DATA;
rcall GetCode_DATA;
rcall GetCode_DATA;
rcall GetCode_DATA;
rcall GetCode_DATA;
CBI DS1302_Port,DS1302_CE ;OFF - transmisja zakończone
ret
;ustala czy czytamy czy zapisujemy
;r16
;r17
;jeżeli BIT0 w r16 HI - odczyt
;jeżeli BIT0 w r16 LOW - zapis
SendCode:
rcall InitDS1302
SBRS r16,0
rcall WriteData
SBRC r16,0
rcall ReadData
rcall InitDS1302;CBI DS1302_Port,DS1302_CE ;OFF - transmisja zakonczona
ret
;-----------------------------------------------------------------------------
Main:
;flaga zapisu (ustaw na 0)
;moge zapisywac zmiany
ldi r16,0x8E; 0b10001110
ldi r17,0b00000000
rcall SendCode
;-------------------------
Main2:
;odczytaj flage zapisu
;---------------------------
ldi r16,0x8F;
rcall SendCode
;-------------------------
;czekaj---------------------
rcall wait
rcall wait
rcall wait
;-------------------------
rjmp Main2
;-----------------------------------------------------------------------------
.exit
