cac huynh ti cho em hoi cai nha ===> có cách nào dùng ngắt để trở về chương trình của 8951 tại vị trí 0000h không ạ (( chắc là không phải không ạ
Thông báo
Collapse
No announcement yet.
dùng ngắt trở về địa chỉ 0000h??
Collapse
X
-
Trước khi vào chương trình ngắt, bộ đếm PC được PUSH vào ngăn xếp ( 2 byte), bạn xác định địa chỉ PUSH này, trước khi thoát khỏi chương trình ngắt, bạn gán giá trị 00h vào 2 byte tại địa chỉ bạn xác định trên. Như vậy khi thoát khỏi ngắt chương trình sẽ chạy lại từ địa chỉ 0000h. Cách này tôi đã làm lâu lắm rồi nên không nhớ Code như thế này, bạn tự suy nghỉ xem.
Chúc thành công!
-
Nguyên văn bởi dangdung Xem bài viếtchi bằng bạn reset còn hơn
hoặc dùng lệnh jmp #0000h
Comment
-
Nguyên văn bởi pvkhai Xem bài viếtTrước khi vào chương trình ngắt, bộ đếm PC được PUSH vào ngăn xếp ( 2 byte), bạn xác định địa chỉ PUSH này, trước khi thoát khỏi chương trình ngắt, bạn gán giá trị 00h vào 2 byte tại địa chỉ bạn xác định trên. Như vậy khi thoát khỏi ngắt chương trình sẽ chạy lại từ địa chỉ 0000h. Cách này tôi đã làm lâu lắm rồi nên không nhớ Code như thế này, bạn tự suy nghỉ xem.
Chúc thành công!
Comment
-
Trước tiên bạn phải biết về ngăn xếp.
Ban đầu thanh ghi SP có giá trị =07h. (ô nhớ 07h, trùng với địa chỉ của thanh ghi r7)
Khi có ngắt thì SP tăng lần lượt lên và ghi giá trị là địa chỉ của chương trình hiện tại vào (2 byte), sau đó thì SP =09h, và chương trình nhảy tới vecto ngắt.
Khi gặp lệnh reti thì chương trình sẽ lấy địa chỉ củ trước khi có ngắt từ các ô nhớ được trỏ bởi thanh ghi SP ( lúc này là 08h và 09h) và nhảy tới đó để làm tiếp công việc đồng thời sp lần lượt giảm xuống 2 lần. -->07h
Với lệnh push thì SP sẽ tăng 1 và lưu giá trị cần lưu vào ô nhớ trỏ bởi sp, lúc này là 08h.
Với lệnh pop thì ngược lại,...
Vậy thì với cách push các số 00 vào ngăn xếp hay là dùng lệnh nhảy về đị chỉ 0000h gì thì thanh ghi SP của bạn cũng sẻ phình to lên (tăng dần lên) ít hay nhiều.
Cho đến khi nào đó nó trùng vào vùng Ram nội mà bạn đang lưu dữ liệu tạm thời Ví dụ 20h chẳn hạn. Vậy thì chương trình không còn chạy đúng nữa.
Chào!
Comment
-
Nguyên văn bởi thanhnguyen0 Xem bài viếtcac huynh ti cho em hoi cai nha ===> có cách nào dùng ngắt để trở về chương trình của 8951 tại vị trí 0000h không ạ (( chắc là không phải không ạ
CSEG
ORG 0000H ; power on/reset vector
jmp on_reset
ORG xxxxH
; Thay xxxx bằng địa chỉ hexa
; của ngắt mà bạn dùng để reset
jmp on_reset
;......các địa chỉ ngắt khác mà bạn sử dụng
on_reset:
mov sp, #50H ; khởi tạo stack pointer
;...... phần chương trình của bạnImagine all the people
Living life in peace...
Comment
-
Nguyên văn bởi vodangks Xem bài viếtXin hỏi cách xác định địa chỉ PUSH ở trên được ko??? Dùng mô phỏng thì có thể thấy được nhưng mình ko hiểu tại sao nó lại có những con số ấy cả, có cách nào tính toán ra ko???
Ví dụ :
mov r0,sp
mov @r0,#00h
dec r0
mov @r0,#00h
Như vậy nội dung 2 ô nhớ mà SP trỏ vào đã bị thay đổi thành 0000h.
Ở đầu chương trình bạn nên xác định vị trí ngăn xếp
main : mov sp,#07h
....
Chúc vui!
Comment
-
Nguyên văn bởi pvkhai Xem bài viếtThanh ghi SP chứa giá trị địa chỉ ngăn xếp, bạn sử dụng điều này để xác định.
Ví dụ :
mov r0,sp
mov @r0,#00h
dec r0
mov @r0,#00h
Như vậy nội dung 2 ô nhớ mà SP trỏ vào đã bị thay đổi thành 0000h.
Ở đầu chương trình bạn nên xác định vị trí ngăn xếp
main : mov sp,#07h
....
Chúc vui!
TROVE: mov sp,#50
mov 4FH,#5D ; (giả sử là 5D)
mov 50H,#00
RETI
Trên đây là 1 đoạn ct mình viết làm đồng hồ, sau khi kết thúc việc chỉnh hẹn giờ, mình cho trở về lại phần hiển thị giờ bình thường. Địa chỉ 5D (địa chỉ này có thể thay đổi tùy ct)là địa chỉ mình thấy khi mô phỏng tới phần mình muốn nhảy về (mặc định nó nằm ở R7). Thật sự mình ko hiểu rõ tại sao lại như thế.
Mấy bạn có thể giải thích cách xác định đia chỉ của 1 dòng lệnh có thể tính được ko??? Việc này rất quan trọng khi cần nhảy về đúng chỗ sau khi xài ngắt!!!
Và mình phải viết đúng như vậy thì nó mới trở về đúng, còn ko thì sai
Comment
-
Trong 8051: Khi có ngắt thì địa chỉ hiện thời của nó tự động ghi vào vùng Stask và khi gặp lệnh RETI thì tự động nó lấy địa chỉ đó để mà nhảy tới, không cấn phải định trước.
Chú ý là trong chương trình phục vụ ngắt bạn đừng dùng các lệnh tác động đến vùng stask này. Mà nếu có dùng thì phải làm sao cho thanh ghi SP vẩn giữ nguyên giá trị. Ví dụ nếu có lệnh call thì phải có lệnh ret, nếu có lệnh push thì phải có lệnh pop..
Comment
-
Nguyên văn bởi toymaker Xem bài viếtÝ bạn là khi có ngắt thì reset (mềm) MCU phải k?
CSEG
ORG 0000H ; power on/reset vector
jmp on_reset
ORG xxxxH
; Thay xxxx bằng địa chỉ hexa
; của ngắt mà bạn dùng để reset
jmp on_reset
;......các địa chỉ ngắt khác mà bạn sử dụng
on_reset:
mov sp, #50H ; khởi tạo stack pointer
;...... phần chương trình của bạn
giả sử chương trình chính mình đặt trng nhãn on_reset và nhãn on_reset đó cũng chính là trình phục vụ ngắt của ORG xxxxH và thì bắt buộc chương trình chính mình cũng phải đặt lệnh trở về là RETI vậy có mâu thuẫn gì kg anh? vì đầu tiên chương trình phải thực hiện ở nhảy tới nhãn on_reset trước mà
Comment
-
mình thấy cái này đơn giản thế này,không biết có đúng không?
sau khi đã thực hiện xong chương trình ngắt trước lệnh reti ta chỉ cần đặt vào ngan xếp giá trị 00 là đuowcj rồi
;chuong trình ngắt
...........
....
mov a,#00
push acc
push acc
reti
lúc này trên ngăn xếp có 2 byte 00h rồi
khi gặp lệnh reti thì uC sẽ lấy 2 byte ngăn xếp trở về và có địa chỉ 00h
tuy nhiên trong chương trình main khởi tạo bạn nên nạp lại giá trị cho ngăn xếp mov sp,#07h. như vậy có đúng không?hãy cố gắng dù vướn phải thất bại!!!!!!!!
Comment
-
Nguyên văn bởi chipmickey Xem bài viếtmình thấy cái này đơn giản thế này,không biết có đúng không?
sau khi đã thực hiện xong chương trình ngắt trước lệnh reti ta chỉ cần đặt vào ngan xếp giá trị 00 là đuowcj rồi
;chuong trình ngắt
...........
....
mov a,#00
push acc
push acc
reti
lúc này trên ngăn xếp có 2 byte 00h rồi
khi gặp lệnh reti thì uC sẽ lấy 2 byte ngăn xếp trở về và có địa chỉ 00h
tuy nhiên trong chương trình main khởi tạo bạn nên nạp lại giá trị cho ngăn xếp mov sp,#07h. như vậy có đúng không?
cach làm hay thật --- cam ơn anh nhe
kg cần tíinh toán gì cả.... heheh
Comment
-
Nguyên văn bởi chipmickey Xem bài viếtmình thấy cái này đơn giản thế này,không biết có đúng không?
sau khi đã thực hiện xong chương trình ngắt trước lệnh reti ta chỉ cần đặt vào ngan xếp giá trị 00 là đuowcj rồi
;chuong trình ngắt
...........
....
mov a,#00
push acc
push acc
reti
lúc này trên ngăn xếp có 2 byte 00h rồi
khi gặp lệnh reti thì uC sẽ lấy 2 byte ngăn xếp trở về và có địa chỉ 00h
tuy nhiên trong chương trình main khởi tạo bạn nên nạp lại giá trị cho ngăn xếp mov sp,#07h. như vậy có đúng không?
à nhưng mà cần phải lưu ý là khi thoát ra khỏi lệnh ngắt thì khôg dc phép dùng lệnh POP. nếu vo tình dùng lệnh này thì .......toi. vì trong vùng stack vẫn còn lưu địa chỉ trờ về của lệnh nhảy trước đó
dù sao cách này vẩn là một giải pháp mời nah một ly nhé
Comment
-
Nguyên văn bởi thanhnguyen0 Xem bài viếtý anh oi cho em hỏi cái nha
giả sử chương trình chính mình đặt trng nhãn on_reset và nhãn on_reset đó cũng chính là trình phục vụ ngắt của ORG xxxxH và thì bắt buộc chương trình chính mình cũng phải đặt lệnh trở về là RETI vậy có mâu thuẫn gì kg anh? vì đầu tiên chương trình phải thực hiện ở nhảy tới nhãn on_reset trước màImagine all the people
Living life in peace...
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Hỏi về bơm màng bldcbởi nhathung1101Thì đây là 4r điên nặng điện mà, nên họ show phần điện thôi. Phần "cốt lõi" có cái tay biên chắc sang Văn Môn rồi....
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 18:54 -
-
Trả lời cho Chọn dây dẫn cho điện DC?bởi nhathung1101Điện DC đương nhiên là khác với AC rồi. Chỉ cần biết mặt chữ là thấy khác như gà trống với gà mái mà.
Còn về bản chất, AC là dòng điện hoạt động theo tần số. Tần số càng cao thì dây dẫn càng mỏng, nhẹ, vì hiệu ứng...-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 18:46 -
-
Trả lời cho Công thức điện tửbởi nhathung1101Ăn ít => Nói nhiều.
Nói nhiều => Làm ít.
Làm ít => Vợ mắng.
Vợ mắng => Cáu nhiều.
Cáu nhiều => Ngủ ít.
Ngủ ít => Râu nhiều.
Râu nhiều =>...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 18:39 -
-
Trả lời cho Chọn dây dẫn cho điện DC?bởi mèomướpDạ vài chục mét thì chú tính như vậy được ạ. Chứ chuẩn thì phải tính cả điện trở của toàn bộ chiều dài dây dẫn nhân với dòng điện xem sụt áp có trong khoảng chấp nhận đc hông ạ. Trong mạch điện tử khoảng cách ngắn và mạch...
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 14:49 -
-
bởi vietroadTheo mình biết thì chọn dây dẫn dựa vào dòng tải. Thường thì tiết diện 1mm2 cho dòng 6A. Nhưng trong các mạch điện tử, như mạch nguồn tổ ong chẳng hạn, dòng đến vài chục Ampe mà đường mạch mỏng dính. Phải chăng điện DC nó khác với...
-
Channel: Điện tử dành cho người mới bắt đầu
Hôm qua, 14:19 -
-
Trả lời cho Hỏi về bơm màng bldcbởi vi van phamPhải xem cơ cấu bơm, chứ xem cơ cấu rotor, thì chỉ làm thầy bói xem voi.
-
Channel: Điện tử dành cho người mới bắt đầu
29-11-2024, 08:19 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11vg, cám ơn bác...........
-
Channel: Thiết bị điện tử cá nhân
28-11-2024, 14:37 -
-
bởi khoine9899
Em chào các anh và mọi người.
Hiện em đang có 1 con bơm màng trong thiết bị y tế đang gặp tình trạng yếu dần hoặc ngừng hoạt động sau thời gian sử dụng
Sau khi tìm hiểu về thông tin của bơm trên mạng thì em được biết...-
Channel: Điện tử dành cho người mới bắt đầu
28-11-2024, 11:22 -
-
Trả lời cho Cần mọi người giúp mạch tạo sóng siêu âm máy rửabởi bqviet
-
Channel: Điện tử công suất
27-11-2024, 20:26 -
-
bởi Minhdai95Em chào mọi người, e đang sửa mạch tạo sóng siêu âm cho máy rửa mà chưa có tài liệu để tham khảo sửa, mọi người cho e xin tài liệu ạ...
-
Channel: Điện tử công suất
27-11-2024, 11:37 -
Comment