Thông báo

Collapse
No announcement yet.

dùng ngắt trở về địa chỉ 0000h??

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • dùng ngắt trở về địa chỉ 0000h??

    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 ạ

  • #2
    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!

    Comment


    • #3
      chi bằng bạn reset còn hơn
      hoặc dùng lệnh jmp #0000h
      Điện thoại:
      email:

      Comment


      • #4
        Nguyên văn bởi dangdung Xem bài viết
        chi bằng bạn reset còn hơn
        hoặc dùng lệnh jmp #0000h
        Bạn nên xem lại, nếu bạn đặt lệnh jmp #0000h trong chương trình ngắt thì chương trình sẽ nhảy về địa chỉ 0000h nhưng chưa ra khỏi chương trình ngắt ...thì không biết chuyện gì sẽ xãy ra

        Comment


        • #5
          Nguyên văn bởi pvkhai Xem bài viết
          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!
          Xin 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???

          Comment


          • #6
            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


            • #7
              Nguyên văn bởi thanhnguyen0 Xem bài viết
              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 ạ
              Ý 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
              Imagine all the people
              Living life in peace...

              Comment


              • #8
                Nguyên văn bởi vodangks Xem bài viết
                Xin 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???
                Thanh 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!

                Comment


                • #9
                  Nguyên văn bởi pvkhai Xem bài viết
                  Thanh 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!
                  Cái mình thắc mắc là khi ta trở về từ 1 chương trình ngắt, thì trước cái lệnh RETI mình phải thiết lập cái địa chỉ trở về cho nó, ví dụ như sau:
                  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


                  • #10
                    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


                    • #11
                      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
                      ý 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à

                      Comment


                      • #12
                        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


                        • #13
                          Nguyên văn bởi chipmickey Xem bài viết
                          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?
                          ---------
                          cach làm hay thật --- cam ơn anh nhe
                          kg cần tíinh toán gì cả.... heheh

                          Comment


                          • #14
                            Nguyên văn bởi chipmickey Xem bài viết
                            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?
                            --------------

                            à 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


                            • #15
                              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à
                              Chương trình chính KHÔNG được có reti (Chả có luật nào bắt buộc phải có reti cả, vì bạn muốn reset CPU chứ đâu cần trở về chương trình chính ở điểm xử lý ngắt !)
                              Imagine all the people
                              Living life in peace...

                              Comment

                              Về tác giả

                              Collapse

                              thanhnguyen0 Tìm hiểu thêm về thanhnguyen0

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X