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

[ASM]Prosty programik - zaświecanie diody jednym przyciskiem

Bartek47 18 Lis 2009 22:51 2027 3
REKLAMA
  • #1 7279485
    Bartek47
    Poziom 11  
    .include "tn2313def.inc"
                 
           .org       0
           
                  ldi              r24,LOW(RAMEND)       
                  out              SPL,r24
                   ser                      r24                         
                  out              DDRB,r24       ; port B - wyjscia  
    			       
                  ldi    r24,0
               out              DDRD,r24       ; port D - wejscia
    		   out PORTB,r24 ;diody zgaszone
                  ser                      r24
                  out          PORTD,r24 ;na przyciskach jedynki 
    
               start:
             in     r16,PIND
    		 andi  	r16,48 ;sprawdza tylko 2 przyciski
             cpi r16,16
             breq zielona 
             cpi r16,32
             breq czerwona
    		 
             rjmp start
             czerwona:
             ldi r16,PINB
    		 cpi r16,0
    		 breq zaswiec
    		 rcall zgas
    		 ret
    		 zaswiec:
             ldi r16,255
    		 out PORTB,r16
    		 rcall Delay
    		 ret
    		 zgas:
             ldi r16,0
    		 out PORTB,r16
    		 rcall Delay
    		 ret
    		 zielona:
    		 ret
    
    Delay 	: 	  	; realizacji opóźnienia
      	ldi 	r17,200	 	; zawartość acc2 = 0
      	ldi 	r16,0	; zawartość acc = 0
    Del_0 	: 	  	;
      	inc 	r16 	; zwiększ zawartość acc
      	brne 	Del_0 	; skocz gdy acc różne od 0
      	inc 	r17 	; zwiększ zawartość acc2
      	brne 	Del_0 	; skocz gdy acc2 różne od 0
      	ret 	  	; powrót z podpr         
    


    Diody w porcie B 2 przyciski w porcie D jeden zaświecać powinien i gasić diodę drugi nie robi nic. Część sprawdzająca przyciski jest poprawna bo w innym programie działa. Widzie błąd bo ja nie mogę zauważyć. Nic się nie dzieje z diodami
  • REKLAMA
  • #2 7280182
    Ch.M.
    Poziom 27  
    Witaj
    Po 1 nie żałuj komentarzy! Rozumiem, że przyciski sa podpięte pod PIND4,5;

    Po 2 Twój program po odliczeniu opóźnienia się restartuje ponieważ podprogram czerwona lub zielona był wywoływany instrukcją rjmp (breq) a powrót chcesz zorganizować retEM...

    Pozdrawiam
  • REKLAMA
  • #3 7281643
    grysek
    Poziom 19  
    Nie rozumiem tego fragmentu:

     czerwona: 
             ldi r16,PINB 
           cpi r16,0 
           breq zaswiec 
           rcall zgas 
           ret


    Po co chcesz wczytać wartość rejestru wejściowego portu B skoro cały PORTB masz ustawiony jako wyjścia? Cały czas wczytujesz do rejestru r16 stałą określającą adres rejestru PINB czyli 0x16 i porównujesz do 0 co nie ma sensu :| Jeśli chcesz wczytać coś z jakiegoś rejesrtu to używaj polecenia in, lub lds :D

    Zamiast ret, powinieneś dać rjmp start, ponieważ instrukcja ret działa tylko przy wywołaniu rcall
  • #4 7281869
    Bartek47
    Poziom 11  
    Sprawdzam tym fragmentem czy diody są zaświecone czy nie i w zależności od wyniku gaszę je albo zaświecam.

    A dlaczego tutaj napisałem programik którym jednym przyciskiem zapalam drugim gasze diode i powrót retem z breq działa ?

    .include "tn2313def.inc"
                 
           .org       0
           
                  ldi              r24,LOW(RAMEND)       
                  out              SPL,r24
                   ser                      r24                         
                  out              DDRB,r24       ; port B - wyjscia  
    			       
                  ldi    r24,0
               out              DDRD,r24       ; port D - wejscia
                  ser                      r24
                  out          PORTD,r24
    
               start:
             in     r16,PIND
    		 andi  	r16,48
             cpi r16,16
             breq zielona
             cpi r16,32
             breq czerwona
             rjmp start
             czerwona:
             ldi r24,64
             out PORTB,r24
             ret
             zielona:
             ldi r24,128
             out PORTB,r24
             ret

    [code]

    edit: oho chyba widzę błąd, rzeczywiście głupotę robię z tym ldi :]

    edit2: teraz świeci jak trzymam przycisk :P

    nowy kod:

    [code].include "tn2313def.inc"

    .org 0

    ldi r24,LOW(RAMEND)
    out SPL,r24
    ser r24
    out DDRB,r24 ; port B - wyjscia

    ldi r24,0
    out DDRD,r24 ; port D - wejscia
    out PORTB,r24
    ser r24
    out PORTD,r24

    start:
    in r16,PIND
    andi r16,48
    cpi r16,16
    breq zielona
    cpi r16,32
    breq czerwona

    rjmp start
    czerwona:
    in r16,PINB
    cpi r16,0
    breq zaswiec
    rcall zgas
    ret
    zaswiec:
    ldi r16,255
    out PORTB,r16
    rcall Delay
    ret
    zgas:
    ldi r16,0
    out PORTB,r16
    rcall Delay
    ret
    zielona:
    ret

    Delay : ; realizacji opóźnienia
    ldi r17,0 ; zawartość acc2 = 0
    ldi r16,0 ; zawartość acc = 0
    Del_0 : ;
    inc r16 ; zwiększ zawartość acc
    brne Del_0 ; skocz gdy acc różne od 0
    inc r17 ; zwiększ zawartość acc2
    brne Del_0 ; skocz gdy acc2 różne od 0
    ret ; powrót z podpr [/code]

    Dodano po 18 [minuty]:

    Ok poprawile to ret i program działa. Dzięki za pomoc. Troszkę trudno się przestawić na avr z '51.

    [code].include "tn2313def.inc"

    .org 0

    ldi r24,LOW(RAMEND)
    out SPL,r24
    ser r24
    out DDRB,r24 ; port B - wyjscia

    ldi r24,0
    out DDRD,r24 ; port D - wejscia
    out PORTB,r24 ;diody zgaszone
    ser r24
    out PORTD,r24 ;na przyciskach jedynki

    start:
    in r16,PIND
    andi r16,48
    cpi r16,16
    breq zielona
    cpi r16,32
    breq czerwona

    rjmp start
    czerwona:
    in r16,PINB
    cpi r16,0
    breq zaswiec
    rcall zgas
    ret
    zaswiec:
    ldi r16,255
    out PORTB,r16
    rcall Delay
    rjmp start
    zgas:
    ldi r16,0
    out PORTB,r16
    rcall Delay
    rjmp start
    zielona:
    rjmp start

    Delay : ; realizacji opóźnienia
    ldi r17,0 ; zawartość acc2 = 0
    ldi r16,0 ; zawartość acc = 0
    Del_0 : ;
    inc r16 ; zwiększ zawartość acc
    brne Del_0 ; skocz gdy acc różne od 0
    inc r17 ; zwiększ zawartość acc2
    brne Del_0 ; skocz gdy acc2 różne od 0
    ret ; powrót z podpr
    [/code]

    Daję programik może komuś się przyda.
REKLAMA