logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

DS2433 1-Wire problem z adresowaniem pamieci

unnamed 15 Lut 2011 23:13 1220 6
REKLAMA
  • #1 9157894
    unnamed
    Poziom 13  
    Witam mam problem z obsluga pamieci DS2433 .
    Napisalem maly programik ktory nawet dziala ale jakos dziwnie , podejrzewam ze zle mam cos opisane w adresowaniu pamieci takwiec oto moj kod .
    Zapis i odczyt :
    
    rst:
    sbi ddrd,ddd5
    cbi portd,sda
    rcall pause1
    rcall pause1
    sbi portd,sda
    cbi ddrd,ddd5
    sbi portd,sda
    sbi pind,5
    czekaj1:
    sbic pind,5
    rjmp czekaj1
    czekaj2:
    sbis pind,5
    rjmp czekaj2
    ret
    
    onewwrite:
    	push pointer
    	sbi ddrd,ddd5
    	ldi pointer,8
    rep1:
    ;	sbi portd,sda
    	cbi portd,sda
    	rcall delay
    	rol mp
    	brcs dos
    	sbi portd,sda
    dos:rcall delay
    	rcall delay
    	rcall delay
    	rcall delay
    	rcall delay
    	rcall delay
    	rcall delay
    	rcall delay
    ;	rcall delay
    	sbi portd,sda
    	rcall delay
    	dec pointer
    	brne rep1
    	rcall delay
    	pop pointer
    	ret
    
    onewread:
    	push pointer
    	ldi pointer,8
    	clr mp
    rep2:
    	sbi ddrd,ddd5
    	cbi portd,sda
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	nop
    	cbi ddrd,ddd5
    	sbi portd,sda
    	sbi pind,5
    	rcall delay
    ;	rcall delay
    	sec
    	sbic pind,5
    	clc
    	rol mp
    	rcall delay
    	rcall delay
    	sbi portd,sda
    	sbi ddrd,ddd5
    	rcall delay
    	rcall delay
    	rcall delay
    	rcall delay
    	rcall delay
    	dec pointer
    	brne rep2
    	rcall delay
    	pop pointer
    	ret
    


    a main

    
    rcall rst
    ldi mp,$CC
    rcall onewwrite
    ldi mp,$0F
    rcall onewwrite
    ldi mp,0
    rcall onewwrite
    ldi mp,$0
    rcall onewwrite
    ldi mp,78
    rcall onewwrite
    ldi mp,2
    rcall onewwrite
    ldi mp,3
    rcall onewwrite
    ldi mp,4
    rcall onewwrite
    
    
    
    rcall rst
    ldi mp,$CC
    rcall onewwrite
    ldi mp,$AA
    rcall onewwrite
    rcall pause1
    rcall onewread        ;38
    sts adr0,mp
    rcall onewread        ;00
    sts adr1,mp
    rcall onewread        ;07
    sts adr2,mp
    rcall onewread			;44
    sts adr3,mp
    rcall onewread         ;22
    sts adr4,mp
    lds mp,adr0
    rcall print
    lds mp,adr1
    rcall print
    lds mp,adr2
    rcall print
    lds mp,adr3
    rcall print
    lds mp,adr4
    rcall print
    
    
    
    
    rcall rst
    ldi mp,$CC
    rcall onewwrite
    ldi mp,$55
    rcall onewwrite
    lds mp,adr0
    rcall onewwrite
    lds mp,adr1
    rcall onewwrite
    lds mp,adr2
    rcall onewwrite
    ldi temp,60
    rcall lpause
    
    
    odczyt:
    
    rcall rst
    ldi mp,$CC
    rcall onewwrite
    ldi mp,$F0
    rcall onewwrite
    ldi mp,$0
    rcall onewwrite
    ldi mp,$0
    rcall onewwrite
    
    
    rcall onewread
    sts qe1,mp
    rcall onewread
    sts qe2,mp
    rcall onewread
    sts qe3,mp
    rcall onewread
    sts qe4,mp
    rcall onewread
    sts qe5,mp
    rcall onewread
    sts qe6,mp
    rcall onewread
    sts qe7,mp
    rcall onewread
    


    Problem polega na tym ze niedokonca rozumie jak adresowac do pamieci , z dokumentacji wynika za pocztkowy adres to 00 00
    czyli TA1 00h i TA2 00h
    gdy tak daje zapisuje mi pierwszy bajt pod adres 00 a puzniej same 0
    Dosteje TA1 TA2 ES
    00 7F 4E
    na moje oko TA2 to mlodszy bajt ale jak go zmieniam to nic sie niezmienia .
    Natomiast gdy TA2 dam 01 to mam zapis zupelnie gdzie indziej i odczytuje jakies konkretne dane rozne od 0 i FF czyli tak jakby dobrze. tylko niemoge zaskoczyc jak tu sie oblicza te adresy bo chyba przy zapisie do scratch pada i odczycie z pamieci jakos to inczej musi wygladac , gdyby ktos mogl doradzic .
    Dodam ze pracuje na wew kwarcu 8 mhz odstepy czasowe sa zachowane ustalone na symulatorze.
    Pozdrawiam
  • REKLAMA
  • #2 9158221
    asembler
    Poziom 32  
    unnamed napisał:

    rep2:
    sbi ddrd,ddd5
    cbi portd,sda
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    cbi ddrd,ddd5
    sbi portd,sda
    sbi pind,5

    Jestes pewny że symulator cie wyręczył dobrze w wyliczeniach.
    Moim zdaniem opoznienia powinienes robic w formie funkcji uzaleznionej od deklaracji zegara. Tutaj w/g mnie powinno być wiecej NOP-ów
    Biorąc wszystkie dodatkowe rozkazy petla opozniająca mogłaby wygladac tak
    (ZAMIAST TYCH NOPÓW )
    
           LD R16,(15*KWARZ/1000000-4)/3
    LDI    DEC R16
           JNZ LDI
    

    Jezeli to nie to to ja nie wiem.
  • REKLAMA
  • #3 9158536
    unnamed
    Poziom 13  
    Tak w symulatorze podaje sie czestotliwosc taktowania zegara i on dokladnie nawet bardzo oblicza czas jaki uplynal. pozatym dane odczytuje mi prawidlowo.
    Problem tylko w zaadresowaniu.
  • #4 9158735
    asembler
    Poziom 32  
    No nie wiem u mnie nie czyta za pomocą twojego programu, tzn czyta ale nie to co trzeba. Jesteś pewny tego że odczytujesz dobrze skoro nie masz pewnosci co lub gdzie zapisujesz?
    A zadałeś sobie trud i zwiekszyłes opóźnienie, czy jesteśtaki pewny że skoda ci tych 2 minutek.
  • REKLAMA
  • #5 9162529
    unnamed
    Poziom 13  
    Tak sie wlasnie zastanawiam jak to mozliwe ze probowales mojego programu skoro niewkleilem tu 2 prawie ze najwazniejszych funkcji jesli chodzi o czas , mianowicie delay oraz pause1 .
    
    delay:
    	push r20
    	ldi r20,20
    delay2:
    	dec r20
    	brne delay2
    	pop r20
    	ret
    
    pause1:	
    	push r22
    	ldi r22,60
    pause2:
    	rcall delay
    	dec r22
    	brne pause2
    	pop r22
    	ret
    
  • REKLAMA
  • #6 9162963
    asembler
    Poziom 32  
    A zastanowiłeś sie dlaczego tylko jeden idiota ci odpowiedział cokolwiek podsuwając miejsca w których możesz mieć błędy bo nie sądziłeś ze ktoś ci tu napisze program za darmo.
    Ten post to jest test na domyslanie sie co autor ma na myśli?
    Samo czytanie cudzych programu jest uciążliwe jeszcze do tego w ASM, a ty myślisz że dasz wyrywek programu i uzyskasz grad odpowiedzi.

    To tak jakbys napisał jedno ze zdań:

    TY chu............ju...mi nie dawaj.
    Ty .......teczki już mi nie dawaj
    Ty ....ust....... już mi nie dawaj.
    A oryginał jest taki.
    Ty chusteczki już mi nie dawaj.

    Druga sprawa to odpowiedz sam sobie na swoje pytanie jak to możliwe, że mimo tego iż nie dałeś całego programu można go sprawdzic?

    P.S. Wystarczy właczyć system przerwań i twój program jest do chusteczki niepodobny, i to tylko z tego powodu nie analizując innych, ale oczywiście to czy używasz przerwań, czy deklarujesz stos, itp,itd dowiemy sie po kolejnych 30 postach
  • #7 9165741
    unnamed
    Poziom 13  
    No i moje podejrzenia sie sprawdzily
    zamias instrukcji rol powinno byc ror a zamiast brcc powinno byc brcs , i oto rozwiazanie.
    ALe mam jeszcze pytanie , czy ktos zna odpowiednik tej pamieci DS2433 tyle ze z mozliwoscia zmiany lasser rom-u i o takiej samej lub wiekszej pojemnosci ?
REKLAMA