Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

Bartek47 18 Lis 2009 22:51 1751 3
  • #1 18 Lis 2009 22:51
    Bartek47
    Poziom 10  

    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 ;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

    0 3
  • #2 19 Lis 2009 08:53
    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

    0
  • #3 19 Lis 2009 15:58
    grysek
    Poziom 19  

    Nie rozumiem tego fragmentu:

    Code:
     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

    0
  • #4 19 Lis 2009 17:08
    Bartek47
    Poziom 10  

    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 ?

    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
                  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.

    0