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

[Atmega16][Assembler] Pętla w programie

Student_Bartosh 22 Lut 2011 22:54 1689 1
REKLAMA
  • #1 9190015
    Student_Bartosh
    Poziom 9  
    Witam

    Chciałbym, żeby mój program na makiecie powodował, że po wciśnięciu przycisku na porcie A (bit 6) na porcie B do którego podłączone są diody wysyłany był zadany stan 8 diod. I to mi się udało zrobić. To jest bez pętli. Naciskam guzik i świecą diody, puszczam i gasną.

    W tym samym programie chciałbym, żeby po wciśnięciu przycisku na porcie A (bit 7) na porcie B świeciło 8 diod, ale z zadaną sekwencją ( 4 różne stany) do momentu puszczenia przycisku.

    I tu rodzi się mój problem. Po wykonaniu opóźnienia program wraca do czytania stanu bitu na porcie A. Kiedy trzymam przycisk na porcie A (bit 7) wykonuje się tylko 1 sekwencja, program nie wraca żeby wykonać 3 pozostałe. Brakuje jakiejś komendy, ale nie wiem jakiej.

    Oto kod programu:
    
    .include"m32def.inc"
    .cseg
    .org 0
    .def acc=r16
    .def delay=r17
    .def delay1=r18
    .def delay2=r19
    
    
    ldi acc,HIGH(RAMEND) ; Definicja stosu
    out SPH,acc
    ldi acc,LOW(RAMEND)
    out SPL,acc
    
    ldi acc,0b00000000   
    out DDRA,acc       ;wszystkie bity jako wejscie
    ldi acc,0b11111111  
    out PORTA,acc     ;wszystkie wejscia w stanie wysokim
    out DDRB, acc       ;wszystkie bity jako wyjscia
    ldi acc,0b11111111   ;wszystkie diody wylaczone
    out PORTB,acc
    
    Odczyt:
    in acc, pina
    
    sbrs acc, 7
      rjmp kombinacja1
    sbrs acc, 6
      rjmp kombinacja2
      ldi acc,0b11111111   ;wszystkie diody wylaczone
    out PORTB,acc
    rjmp Odczyt   
    
    
    Kombinacja1:
    
    
    ldi acc,0b00111111 ;krok1
    out PORTB,acc       ;krok1
    ldi delay,0x01         ;krok1
    rcall delayms          ;krok1
    
    ldi acc,0b11111100   ;krok2
    out PORTB,acc         ;krok2
    ldi delay,0x01           ;krok2
    rcall delayms            ;krok2
    
    ldi acc,0b11110011  ;krok3
    out PORTB,acc        ;krok3
    ldi delay,0x01          ;krok3
    rcall delayms           ;krok3
    
    ldi acc,0b11001111  ;krok4
    out PORTB,acc        ;krok4
    ldi delay,0x01          ;krok4
    rcall delayms           ;krok4
    
    rjmp Kombinacja1
    
    
    rjmp Odczyt
    
    Kombinacja2:
    
       ldi acc,0b11111001
       out PortB,acc
       rjmp Odczyt
    
    
    delayms:		;poczatek podprogramu
    ldi delay1,0xdd
    dloop2:
    ldi delay2,0xdd	;wykonanie petli 255 razy
    dloop1:
    dec delay2	;t=1/fx255
    brne dloop1
    dec delay1		;t=1/fx255x255
    brne dloop2
    dec delay
    
    brne delayms
    rjmp Odczyt   
    
    
    .exit


    W zasadzie wykonuje się tylko 1 krok kombinacji 1, a chciałbym, żeby przy wciśniętym przycisku portu A (bit 7) kombinacja 1 wykonywała się tak długo, jak trzymam przycisk.
  • REKLAMA
  • #2 9190784
    rrytel
    Poziom 14  
    w delayms
    1) 0xdd = 221 a nie 255
    2) zamiast "rjmp Odczyt" daj "ret"
REKLAMA