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