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

obsługa ds18b20 w asemblerze, atmega8

kamil1cos7 07 Lut 2012 21:25 1664 13
REKLAMA
  • #1 10511271
    kamil1cos7
    Poziom 14  
    Witam wszystkich,
    Mam problem z kodem w asemblerze do obsługi czujnika temperatury, przy samym sygnale resetu czujnik nie odpowiada a jest na pewno sprawny bo sprawdzałem z gotowymi bibliotekami dla języka C.
    .equ	DQ_PIN	=	PINB
    .equ	DQ_DDR	=	DDRB
    .equ	DQ		=	2		
    	
    .macro	clr_dq
    	sbi DQ_DDR, DQ 
    .endmacro
    
    .macro	set_dq
    	cbi DQ_DDR, DQ
    .endmacro
    
    wire_init:
    
    	clr_dq
    
    	ldi r16, 250
    	rcall wait_us		
    	ldi r16, 230
    	rcall wait_us               ;ustaw 0 na magistrali przez 480us
    	
    	set_dq
    
    	ldi r16, 80
    	rcall wait_us		;zwolnij magistrale na 80us
    
    	sbis DQ_PIN, DQ
    	cbi PORTD, 1		;zapala diode jesli czujnik odpowiada
    
    	ldi r16, 250
    	rcall wait_us
    
    ret


    I właśnie problem jest w tym że dioda się nie zapala, to znaczy że czujnik nie wysyła sygnału obecności... I za nic nie mogę dojść dlaczego...
  • REKLAMA
  • #2 10511310
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 10511423
    excray
    Poziom 41  
    Powinieneś sprawdzać przez jakiś czas a nie jednorazowo. Moja biblioteka:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    EDIT> A błąd w Twoim kodzie polega najprawdopodobniej an tym że brakuje tam jeszcze jednej komendy:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #4 10512691
    kamil1cos7
    Poziom 14  
    Właśnie nie chodzi ani o czas, ani o to że nie ustawiałem rejestru PORTB na pinie DQ na zero(przecież po resecie wartości w tym rejestrze są równe 0), dla pewności napisałem taki kod i nadal jest to samo:
    
    wire_init:
    
    	cbi PORTB, DQ
    	clr_dq
    
    	ldi r16, 250
    	rcall wait_us		;ustaw 0 na magistrali przez 500us
    	ldi r16, 230
    	rcall wait_us
    	
    	set_dq
    
    	ldi r16, 5
    	rcall wait_us		;zwolnij magistrale na 5us
    
    
    	wait_ds:	sbic DQ_PIN, DQ
    				rjmp wait_ds
    			
    	cbi PORTD, 1		;zapala diode jesli czujnik odpowiada
    
    	ldi r16, 250
    	rcall wait_us
    
    ret
  • #5 10512715
    snnaap
    Poziom 25  
    Program z pierwszego postu wyglądał całkiem przyzwoicie jeżeli chodzi o czasy.
    Może błąd tkwi w wait_us?
    Czy na pewno po wywołaniu

    ldi r16, 80
    rcall wait_us

    występuje opóźnienie 80us?

    pokaż jak wygląda wait_us.

    Pozdrawiam
  • #6 10512739
    kamil1cos7
    Poziom 14  
    To jest ta procedura, myślę że jest dobra...
    ;***************************wait_us********************
    ;	Procedura opozniajaca o wartosc parametru 1-255[us], dla 8MHz
    ;	Parametr: r16
    
    wait_us:
    		loon:
    		nop
    		nop
    		nop
    		nop
    		nop
    		dec r16
    	breq loon
    ret
    
    ;***************************************************************
  • #7 10512987
    snnaap
    Poziom 25  
    Wygląda dobrze, dla pewności zapytam czy masz gdzieś:
    sbi DDRD, 1 ?

    Czujnik na pewno sprawny i podłączony prawidłowo?


    Wg mnie sama funkcja wire_init powinna wyglądać tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #8 10513080
    kamil1cos7
    Poziom 14  
    Tak mam sbi DDRD, 1 i sbi PORTD, 1... Bo potem cbi PORTD, 1 zaświeca...

    Dodano po 22 [minuty]:

    @snnaap
    Tak czujnik sprawny, i dobrze podłączony bo nawet dziś go jeszcze sprawdzałem tylko że na gotowych bibliotekach napisanych w języku C, i działa jak należy.
    A dlaczego w tym kodzie napisałeś sbic DQ_PIN, DQ a nie sbis??
  • #9 10513242
    snnaap
    Poziom 25  
    kamil1cos7 napisał:

    A dlaczego w tym kodzie napisałeś sbic DQ_PIN, DQ a nie sbis??


    Oczywiście moja pomyłka, powinno być sbis.

    Zadam głupie pytanie (chodź niby głupich pytań nie ma) prawidłowo masz ustawione fusa bits?
  • REKLAMA
  • #10 10513592
    kamil1cos7
    Poziom 14  
    Chodzi o częstotliwość taktowania? To jest dobrze, na 8MHz...
    hfuse:w:0xD9:m -U lfuse:w:0xe4:m
  • #11 10514585
    2rs232
    Poziom 18  
    Sprawdź to:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #12 10517670
    kamil1cos7
    Poziom 14  
    Już nie mam pojęcia co jest grane, pomyślałem że może coś namieszałem z plikami bo jeszcze miałem pliki od lcd, jakieś procedury dodatkowe itp... Ale w końcu napisałem wszystko w jednym pliku i efekt jest ten sam, oto cały program, tylko to co się tyczy tego czujnika:
    .include "m8def.inc"
    
    .cseg 
    .org 0x013
    
    
    .equ	DQ_PIN	=	PINB
    .equ	DQ_DDR	=	DDRB
    .equ	DQ		=	2
    
    .macro		outw
    	out		@0H, @1H
    	out		@0L, @1L
    .endm
    
    .macro      ldiw
          ldi   @0L, low(@1)
          ldi   @0H, high(@1)     	;wpisuje stala do slowa
    .endm
    
    .macro		clr_dq
    	sbi 	DQ_DDR, DQ 
    .endm							; DQ - wyjscie, 0 na DQ
    								; Po resecie rejestr PORTX = 0
    .macro		set_dq
    	cbi 	DQ_DDR, DQ
    .endm							; DQ - wejscie, rezystor 5k podciaga
    								; linie do 5V
    	ldiw X, RAMEND
    	outw SP, X					
    	
    	sbi DDRD, 1
    	sbi PORTD, 1				; ustawienia dla diody
    	
    
    	rcall wire_init1
    	rcall wire_init
    
    main:
    	
    
    rjmp main
    
    
    
    wire_init:	clr_dq
    
    			ldi r16, 250
    			rcall wait_us		
    			ldi r16, 230
    			rcall wait_us				;ustaw 0 na magistrali przez 480us
    	
    			set_dq
    
    			ldi r16, 10
    			rcall wait_us				;zwolnij magistrale na 10us
    
    			petla:	sbic DQ_PIN, DQ			
    					rjmp petla			;czekaj na sygnał od czjnika
    
    			cbi PORTD, 1				;zapala diode jesli czujnik odpowiada
    
    			ldi r16, 250
    			rcall wait_us
    
    			ret
    			
    wire_init1:
     
       sbi DDRB, DQ
       cbi PORTB, DQ
     
       ldi r16, 250
       rcall wait_us      ;ustaw 0 na magistrali przez 500us
       ldi r16, 250
       rcall wait_us
     
       cbi ddrb, DQ
       sbi PORTB, DQ
     
       ldi r16, 65
       rcall wait_us      ;zwolnij magistrale na 65us
     
     
       sbis DQ_PIN, DQ    
       cbi PORTD, 1      ;zapala diode jesli czujnik odpowiada
     
       ldi r16, 250
       rcall wait_us
       ldi r16, 250
       rcall wait_us
     
    ret
    
    wait_us:
    		loon:
    		nop
    		nop
    		nop
    		nop
    		nop
    		dec r16
    	breq loon
    ret
    
  • Pomocny post
    #13 10518573
    2rs232
    Poziom 18  
    Masz błąd w "wait_us", po dekrementacji sprawdzasz czy zero,jeśli tak to skocz do loon, jeśli nie to ret (powinno być odwrotnie).
    Poprawiony kod:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #14 10518666
    kamil1cos7
    Poziom 14  
    hehe... Wielkie dzięki:) Wstyd mi:P
REKLAMA