Tải bản đầy đủ (.docx) (6 trang)

prelab vi xử lí bài 1

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (56.48 KB, 6 trang )

Bài 2 a) chương trình dl1ms
DL1MS VÀ TẠO XUNG VNG :
.ORG 0
SBI DDRA , 0
LP : SBI PORTA , 0
RCALL DL1MS
CBI PORTA , 0
RCALL DL1MS
RJMP LP
DL1MS :

LDI R16 ,4

LOOP3 :

LDI R17 , 250

LOOP2 :

LDI R18 , 250

LOOP1 :

NOP
DEC R18
BRNE LOOP1
DEC R17
BRNE LOOP2
DEC R16
BRNE LOOP3
RET



Câu 2b ) tạo chươg trình delay 10ms , 100ms và 1s
DL10MS : PUSH R17
LDI R17 ,10 /100/1000
LP1 : RCALL DL1MS
DEC R17
BRNE LP1
POP R17
RET


DL1MS : LDI R16 ,4
LOOP3 :

LDI R17 , 250

LOOP2 :

LDI R18 , 250

LOOP1 :

NOP
DEC R18
BRNE LOOP1
DEC R17
BRNE LOOP2
DEC R16
BRNE LOOP3
RET


Câu 2 c ) Viết chớp tắt 1 led gắn vào PA0
.ORG 0
SBI DDRA , 0
CBI DDRA , 0
LDI R16 ,2
LP2 : RCALL DL1S
DEC R16
BRNE LP2
CBI PORTA , 0
HR : JMP HR
DL1S : : PUSH R17
LDI R17 , 1000
LP1 : RCALL DL1MS
DEC R17
BRNE LP1
POP R17
RET


DL1MS : LDI R16 ,4
LOOP3 :

LDI R17 , 250

LOOP2 :

LDI R18 , 250

LOOP1 :


NOP
DEC R18
BRNE LOOP1
DEC R17
BRNE LOOP2
DEC R16
BRNE LOOP3
RET

CÂU 3 ) b) viết chương trình tạo hiệu ứng LED sáng dần từ trái qua phải, sau đo tắt dần
từ trái qua phải sau mỗi khoảng thời gian 500ms.

; Cấu hình định nghĩa hằng số
.equ LED_DDR = DDRB ; Port dẫn xuất cho LED
.equ LED_PORT = PORTB ; Port điều khiển LED
.equ LED_MASK = 0 ; Mặt nạ cho 4 LED trên Port B
.equ DELAY_COUNT = 500 ; Đếm giá trị đợi 500ms

; Cấu hình bộ đếm thời gian
.cseg
.org 0x0000
jmp reset ; Nhảy đến hàm reset
.org 0x0012
jmp TIMER0_COMPA_vect ; Nhảy đến hàm ngắt TIMER0_COMPA_vect
reset:
; Cấu hình thanh ghi TCCR0B
ldi r16, (1 << CS02) | (1 << CS00)
out TCCR0B, r16
; Cấu hình giá trị đếm cho bộ đếm thời gian

out OCR0A, r16
; Cho phép ngắt tương đối cho bộ đếm thời gian
ldi r16, (1 << OCIE0A)

; Cấu hình Port B là đầu ra cho LED
ldi r16, 0xFF
out LED_DDR, r16
; Khởi tạo biến trạng thái LED ban đầu


ldi r16, LED_MASK
out LED_PORT, r16
; Vơ hiệu hóa ngắt tồn cục
cli
; Vịng lặp chính
main_loop:
rjmp main_loop ; Vơ hiệu hóa vơ hạn
; Hàm ngắt tương đối để xử lý hiệu ứng LED
TIMER0_COMPA_vect:
; Đọc giá trị trạng thái của LED
in r16, LED_PORT
; Dịch trái 1 bit để tạo hiệu ứng sáng dần từ trái qua phải
lsl r16
; Cập nhật trạng thái của LED
out LED_PORT, r16
; Nếu tất cả các LED đã được bật thì bắt đầu tắt dần từ trái qua phải
tst r16
brne skip_fade_out
ldi r16, LED_MASK ; Khởi tạo giá trị trạng thái LED
skip_fade_out:

; Dịch phải 1 bit để tạo hiệu ứng tắt dần
ror r16
; Cập nhật trạng thái của LED
out LED_PORT, r16
reti ; Kết thúc ngắt tương đối
.cseg ; Khai báo segment mã chương trình

; Khai báo hàm delay để tạo độ trễ
.macro delay count
ldi r16, 4
ldi r17, 250
ldi r18, 250
lp: sbiw r16, 1
brne lp
dec r18
brne lp
.endm

; Khai báo các vector ngắt mặc định
.org 0x002A
rjmp TIMER0_COMPA_isr


; Khai báo hàm khởi tạo bộ đếm thời gian
init_timer:
; Cấu hình thanh ghi TCCR0A để bật chế độ PWM Fast với Clear OC0A on Compare Match
ldi r16, (1<sts TCCR0A, r16
; Cấu hình thanh ghi TCCR0B để chọn nguồn đồng hồ là CPU clock với tỷ số chia là 1024
ldi r16, (1<

sts TCCR0B, r16
; Cấu hình thanh ghi OCR0A với giá trị delay tương ứng
sts OCR0A, r16
sts OCR0A+1, r17
; Cho phép ngắt khi bộ đếm thời gian đạt đến giá trị trong thanh ghi OCR0A
ldi r16, (1<sts TIMSK0, r16
; Xóa cờ ngắt khi khởi động
ldi r16, (1<sts TIFR0, r16
ret

main:
; Khởi tạo bộ đếm thời gian
call init_timer
; Khởi tạo giá trị ban đầu cho LED_PORT và LED_DDR
ldi r30, LED_PORT
ldi r31, LED_PORT
ldi r16, 1<sts LED_DDR, r16
sts LED_PORT, r16
; Vòng lặp

loop:
; Dịch chuyển giá trị mặt nạ của LED sang trái để tạo hiệu ứng sáng dần từ trái qua phải
ldi r16, 1
rol r16
; Ghi giá trị mới vào thanh ghi LED_PORT để bật LED tương ứng
sts LED_PORT, r16


; Dịch chuyển giá trị mặt nạ của LED sang trái để tạo hiệu ứng tắt dần từ trái qua phải
ldi r17, 1
neg r17
and r16, r17
; Ghi giá trị mới vào thanh ghi LED_PORT để tắt LED tương ứng
sts LED_PORT, r16


; Quay lại vòng lặp để tiếp tục tạo hiệu ứng LED
rjmp loop
; Hàm ngắt timer 0
TIMER0_COMPA_isr:
ret

a)

.def input_port =r16 ; thanh ghi để đọc giá trị đầu vào
.def output_port =r17 ;thanh ghi để đọc giá trị đầu ra
ldi input_port ,0xff ;cấu hình port là đầu vào
sbi portC ,2 ;chân 2 của portC là chân SH_CP
sbi portC ,3 ; chân 3 của portC là chân ST_CP
sbi portC ,4 ;chân 4 của portC là chân DS
in input_port ,portB ;đọc giá trị từ thanh ghi portB và lưu giá trị vào thanh ghi đầu vào
ldi output_port ,0x00 ;khởi tạo giá trị đầu ra là 0
out portC ,output_port ;ghi giá trị đầu ra vào portC
ldi r18 ,0x08 ;lặp lại quá trình 8 lần
loop:rcall l_out ; gọi hàm l_out để ghi giá trị đầu vào vào thanh ghi dịch
dec r18 ; giảm biến đếm
brne loop ;lặp lại nếu biến đếm khác 0
l_out : out portC , output_port ;đẩy giá trị của thanh ghi đầu ra




Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×