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

Atmega16, czujnik temp ds18b20 w assemblerze, problem.

djmdp 20 Kwi 2009 09:30 1350 2
  • #1 6435573
    djmdp
    Poziom 16  
    Witam, napisałem prawie całą obsługę tegoż urządzenia w assemblerze, ale niestety po odbiorze bajtów scratchpada mam same zera, podejrzewam, że problem leży w procedurzeodbioru bajtu, prosze spojrzeć:

    
    readbyte:
    	push R16
    	push R17
    	push R18
    	clr R18
    	clr R16
    	ldi R17,8
    
    	read:
    	cbi PORTB, 0
    	sbi DDRB, 0
    	ldi R18, 1
    	rcall waits     ;procedura mikrosekundowa
    	cbi DDRB, 0
    	ldi R18, 14
    	rcall waits
    	sbic PINB, PINB0    ;sprawdza stan na porcie gdzie jest podłączona szyna 1-wire;
    	brne dalej
    	rcall zapisz0
    	rjmp dalej1
    	dalej:
    	rcall zapisz1
    	dalej1:
    	ldi R18, 45
    	rcall waits
    	lsr R16       ;przesuwa rejestr zapisujący bajt w prawo
    	dec R17
    	brne read
    	sts bajt2, R16
    	pop R18
    	pop R17
    	pop R16
    	ret
    zapisz1:                 ;według mnie tu jest błąd, ponieważ te procedury nie chcą zapisać wartości wykrytej przez testowanie portu B, jak to naprawić?
    sbr R16, 1
    ret
    zapisz0:
    cbr R16, 0
    ret


    To jest fragment części zapisującej odbierany bajt, sbr i cbr nie chcą zapisywać wartości wykrytych przez sbic, czy są jakieś inne komendy które zapiszą bit w rejestrze?np w najmłodszym bicie, później przesunięcie w prawo i następny bit, tak aż do ośmiu, ma ktoś pomysł na rozwiązanie tego problemu?
  • #3 6546709
    Suchy
    Poziom 17  
    Dobrze że przesuwasz bit w prawo w rejestrze ale musisz wpisywać bit w 7 bit rejestru i następnie go przesunąć w prawo. Ponieważ DS wysyła od najmłodszego(LSB) bitu. aby ustawić lub wyzerować bit w rejestrze roboczym musisz użyć następującej komendy:

    ustawianie bitu sbr r16,1<<7 ; 7 oznacza wagę bitu

    zerowanie bitu cbr r16,1<<7 ; 7 oznacza wage bitu.

    próbowałem również używać komendy sbr i cbr R16,7 ale one nie działają na tych rejestrach roboczych, nie dociekałem nigdy czemu.

    Pozdrawiam.
REKLAMA