Thông báo

Collapse
No announcement yet.

Giúp ngắt ngoài trong 89 dùng ngôn ngữ ASM

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

  • Giúp ngắt ngoài trong 89 dùng ngôn ngữ ASM

    Yêu cầu: khi cấp nguồn hiển thị số 0, khi chân INT0 bị tác động thì hiển thị số 1... cứ như vậy cho đến số 9. Khi LED 7 thanh hiển thị số 9 thì chân INT0 bị tác động thì không lặp lại mà vẫn hiển thị số 9, muốn lặp lại trừ khi ta RESET. Bạn nào biết thì giúp mình nha, thanks

    Code vẫn chưa chạy:


    DEM EQU R1

    ORG 0000H
    LJMP MAIN
    ORG 0003H
    LJMP EX0_ISR
    ORG 0030H

    MAIN: SETB TCON.2
    MOV IE,#81H ;10000001B
    SJMP $
    MOV DEM,#00 ;NAP CHO DEM GIA TRI BAN DAU (DEM CHUA SO DEM)


    EX0_ISR: MOV DPTR,#MA_LED7SEG ;CHI CON TRO DPTR VAO BANG MA_LED7SEG
    LAP: MOV A,DEM
    MOVC A,@A+DPTR
    MOV P1,A
    LCALL DELAY
    INC DEM
    CJNE DEM,#10,EXIT ;SO SANH R1 VOI 10 NEU CHUA = 10 THI NHAY TOI EXIT CON NEU = 100 THI XOA NO VOI 0
    SJMP LAP
    EXIT: RETI



    DELAY:
    MOV R2,#5 ;NAP GIA TRI 5 VAO THANH GHI R0
    LOOP: MOV TMOD,#01H ;CHON TIME 0 CHE DO 1
    MOV TH0,HIGH(-50000) ;NAP GIA TRI -50000 VAO BYTE CAO CUA TIME 0
    MOV TL0,LOW(-50000) ;NAP GIA TRI -50000 VAO BYTE THAP CUA TIME 0
    SETB TR0 ;CHO BO DINH THOI 0 HOAT DONG
    JNB TF0,$ ;NHAY TAI CHO DE CHO CO TRAN TF0
    CLR TF0
    CLR TR0
    DJNZ R2,LOOP
    RET

    MA_LED7SEG: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

    END
    Attached Files
    Last edited by minhthanh29; 10-08-2012, 02:15.
    Nhận vẽ mạch in ^_^
    TEL: 0167 4500 365
    Mail:

  • #2
    2 lỗi trong chương trình:
    - Biến DEM đc chọn là R2 trong khi trong DELAY lại dùng R2 làm bộ đếm số lần tràn của timer dẫn tới sau khi làm xong DELAY R2 luôn bằng 0
    - Biến DEM luôn đc gán giá trị 0 khi xảy ra ngắt nên khi ngắt DEM luôn bằng 0.
    Khi sử dụng cách kiểm tra lệnh kết hợp mô phỏng, bạn cần phải chú ý các đoạn lệnh ảnh hưởng tới kết quả mà bạn cần để đặt điểm dừng

    Comment


    • #3
      Nguyên văn bởi chung1608 Xem bài viết
      2 lỗi trong chương trình:
      - Biến DEM đc chọn là R2 trong khi trong DELAY lại dùng R2 làm bộ đếm số lần tràn của timer dẫn tới sau khi làm xong DELAY R2 luôn bằng 0
      - Biến DEM luôn đc gán giá trị 0 khi xảy ra ngắt nên khi ngắt DEM luôn bằng 0.
      Khi sử dụng cách kiểm tra lệnh kết hợp mô phỏng, bạn cần phải chú ý các đoạn lệnh ảnh hưởng tới kết quả mà bạn cần để đặt điểm dừng
      Mình đã sữa lại như bạn nói nhưng vẫn không chạy
      Nhận vẽ mạch in ^_^
      TEL: 0167 4500 365
      Mail:

      Comment


      • #4
        Dem equ r1

        org 0000h
        ljmp main
        org 0003h
        ljmp ex0_isr
        org 0030h

        main: Setb tcon.2
        mov ie,#81h ;10000001b
        sjmp $
        mov dem,#00


        ex0_isr:
        Mov dptr,#ma_led7seg ;chi con tro dptr vao bang ma_led7seg
        mov a,dem
        movc a,@a+dptr
        mov p1,a
        lcall delay

        inc dem
        cjne dem,#10,exit ;so sanh r1 voi 10 neu chua = 10 thi nhay toi exit con neu = 100 thi xoa no voi 0
        sjmp lap
        exit: Reti



        delay:
        Mov r2,#5 ;nap gia tri 5 vao thanh ghi r0
        loop: Mov tmod,#01h ;chon time 0 che do 1
        mov th0,high(-50000) ;nap gia tri -50000 vao byte cao cua time 0
        mov tl0,low(-50000) ;nap gia tri -50000 vao byte thap cua time 0
        setb tr0 ;cho bo dinh thoi 0 hoat dong
        jnb tf0,$ ;nhay tai cho de cho co tran tf0
        clr tf0
        clr tr0
        djnz r2,loop
        ret

        ma_led7seg: Db 0c0h,0f9h,0a4h,0b0h,99h,82h,0f8h,80h,90h

        end
        Mình nghĩ bạn đặt chỗ reset biến đếm chưa hợp lý. Vì như anh kia nói khi ngắt biến đếm sẽ bị xóa và không lưu vị trí được với lại không ai sài chung biến với delay cả. Mình sửa giúp giùm bạn rồi đó. Test thử xem được k nhé.

        Comment


        • #5
          Cũng không được bạn à, khi tác động INT0 thì nó vẫn vậy như lúc đầu



          code sữa lại không chạy:

          DEM EQU R1

          ORG 0000H
          LJMP MAIN
          ORG 0003H
          LJMP EX0_ISR
          ORG 0030H

          MAIN: SETB TCON.2
          MOV IE,#81H ;10000001B
          SJMP $
          MOV DEM,#00 ;NAP CHO DEM GIA TRI BAN DAU (DEM CHUA SO DEM)


          EX0_ISR: MOV DPTR,#MA_LED7SEG ;CHI CON TRO DPTR VAO BANG MA_LED7SEG
          MOV A,DEM
          MOVC A,@A+DPTR
          MOV P1,A
          LCALL DELAY
          INC DEM
          CJNE DEM,#10,EXIT ;SO SANH R1 VOI 10 NEU CHUA = 10 THI NHAY TOI EXIT CON NEU = 100 THI XOA NO VOI 0
          SJMP EX0_ISR
          EXIT: RETI



          DELAY:
          MOV R2,#5 ;NAP GIA TRI 5 VAO THANH GHI R0
          LOOP: MOV TMOD,#01H ;CHON TIME 0 CHE DO 1
          MOV TH0,HIGH(-50000) ;NAP GIA TRI -50000 VAO BYTE CAO CUA TIME 0
          MOV TL0,LOW(-50000) ;NAP GIA TRI -50000 VAO BYTE THAP CUA TIME 0
          SETB TR0 ;CHO BO DINH THOI 0 HOAT DONG
          JNB TF0,$ ;NHAY TAI CHO DE CHO CO TRAN TF0
          CLR TF0
          CLR TR0
          DJNZ R2,LOOP
          RET

          MA_LED7SEG: DB 0C0H,0F9H,0A4H,0B0H,99H,82H,0F8H,80H,90H

          END
          Last edited by minhthanh29; 10-08-2012, 01:41.
          Nhận vẽ mạch in ^_^
          TEL: 0167 4500 365
          Mail:

          Comment


          • #6
            Bạn Jimmyli cho mình hỏi code bạn sửa giúp mình thì lệnh sjmp lap nhảy đến đâu vậy bạn
            Last edited by minhthanh29; 10-08-2012, 02:12.
            Nhận vẽ mạch in ^_^
            TEL: 0167 4500 365
            Mail:

            Comment


            • #7
              Mình sửa được rồi, thanks các bạn nhiều. Các bạn giải thích giúp mình dòng code màu đỏ; mình vẫn chưa hiểu chỗ đó lắm


              code đã chạy:

              DEM EQU R1
              LED EQU P1

              ORG 0000H
              LJMP MAIN
              ORG 0003H
              LJMP EX0_ISR
              ORG 0030H

              MAIN: SETB TCON.2
              MOV IE,#81H ;10000001B
              MOV LED,#0C0H
              SJMP $
              MOV DEM,#00 ;NAP CHO DEM GIA TRI BAN DAU (DEM CHUA SO DEM)


              EX0_ISR: MOV DPTR,#MA_LED7SEG ;CHI CON TRO DPTR VAO BANG MA_LED7SEG
              MOV A,DEM
              MOVC A,@A+DPTR
              MOV LED,A
              LCALL DELAY
              INC DEM
              LAP: CJNE DEM,#9,EXIT ;SO SANH R1 VOI 10 NEU CHUA = 10 THI NHAY TOI EXIT CON NEU = 100 THI XOA NO VOI 0
              SJMP LAP
              EXIT: RETI





              DELAY:
              MOV R2,#5 ;NAP GIA TRI 5 VAO THANH GHI R0
              LOOP: MOV TMOD,#01H ;CHON TIME 0 CHE DO 1
              MOV TH0,HIGH(-50000) ;NAP GIA TRI -50000 VAO BYTE CAO CUA TIME 0
              MOV TL0,LOW(-50000) ;NAP GIA TRI -50000 VAO BYTE THAP CUA TIME 0
              SETB TR0 ;CHO BO DINH THOI 0 HOAT DONG
              JNB TF0,$ ;NHAY TAI CHO DE CHO CO TRAN TF0
              CLR TF0
              CLR TR0
              DJNZ R2,LOOP
              RET

              MA_LED7SEG: DB 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

              END
              Nhận vẽ mạch in ^_^
              TEL: 0167 4500 365
              Mail:

              Comment


              • #8
                Bắt đầu tính từ lúc kết thúc ngắt lần đầu tiên nhé: Khi có xung tác động vào chân INT0 thì bắt đầu xảy ra ngắt và sẽ nhảy đến nhãn EX0_ISR sau khi thực hiện chương trình ngắt nếu Dem < 10 thì sẽ quay về chờ ngắt ở SJMP $ mình để xóa biến Dem ở sau lệnh SJMP $ thay vì để trong chương trình ngắt vì lý dó khi có ngắt thứ 2 và các ngắt tiếp theo sẽ làm cho biến Dem bị xóa như bạn viết lúc đầu đó, nên mình thay đổi để khi ngắt nó không bị xóa vậy thôi. Còn khi biến Dem > 10 thì sẽ nhảy tới nhãn Lap và xóa Dem và lúc này sẽ hiển thị số 0 thôi. Còn bạn thêm lệnh
                MOV LED,#0C0H
                thì cũng không biết có tác dụng gì nữa.
                Lúc tối mình quên tạo nhãn Lap.
                LAP: MOV DEM,#00 ;NAP CHO DEM GIA TRI BAN DAU (DEM CHUA SO DEM)
                Nó nằm ở đây nè, hihi sorry nha.

                Comment


                • #9
                  Quái lạ! Nhớ không nhầm thì ông bạn này còn post cả bài đồng hồ số, từ mạch nguyên lý đến mạch in và code, chẳng lẽ có mỗi cái ngắt ngoài này mà lại phải đi hỏi, đúng là lạ.

                  Comment


                  • #10
                    JNB TF0,$ ;NHAY TAI CHO DE CHO CO TRAN TF0
                    vậy cái kí hiệu $ là cái gì vậy em mới học lên ko biết nhờ các bác chỉ bảo
                    Tổng thống + điện = Ăn mày + điện = die => Tổng thống = ăn mày

                    Comment


                    • #11
                      Kí hiệu $ ( đô la) là kí hiệu : cho con trỏ nhảy tại chổ, không cần nhãn. Với câu lệnh JNB TF0,$ : có nghĩa là : kiểm tra bit TF0 xem có bằng 1 chưa, nếu chưa bằng 1 thì "ngồi" đợi tiếp, nếu bằng 1( cờ TF0 =1 , khi đếm đủ sự kiện Timer) rồi thì con trỏ nhảy xuống hàng tiếp theo. Thế thôi!

                      Comment


                      • #12
                        thế muk em ko biêt hihi
                        Tổng thống + điện = Ăn mày + điện = die => Tổng thống = ăn mày

                        Comment


                        • #13
                          Nguyên văn bởi Ck33spkt Xem bài viết
                          Quái lạ! Nhớ không nhầm thì ông bạn này còn post cả bài đồng hồ số, từ mạch nguyên lý đến mạch in và code, chẳng lẽ có mỗi cái ngắt ngoài này mà lại phải đi hỏi, đúng là lạ.
                          Mình không rành asm
                          Nhận vẽ mạch in ^_^
                          TEL: 0167 4500 365
                          Mail:

                          Comment


                          • #14
                            Nguyên văn bởi Pamkin Xem bài viết
                            Kí hiệu $ ( đô la) là kí hiệu : cho con trỏ nhảy tại chổ, không cần nhãn. Với câu lệnh JNB TF0,$ : có nghĩa là : kiểm tra bit TF0 xem có bằng 1 chưa, nếu chưa bằng 1 thì "ngồi" đợi tiếp, nếu bằng 1( cờ TF0 =1 , khi đếm đủ sự kiện Timer) rồi thì con trỏ nhảy xuống hàng tiếp theo. Thế thôi!
                            Thanks, bạn giải thích mình đoạn này, mình vẫn chưa hiểu lắm


                            EX0_ISR: MOV DPTR,#MA_LED7SEG ;CHI CON TRO DPTR VAO BANG MA_LED7SEG
                            MOV A,DEM
                            MOVC A,@A+DPTR
                            MOV LED,A
                            LCALL DELAY
                            INC DEM
                            LAP: CJNE DEM,#9,EXIT ;SO SANH R1 VOI 10 NEU CHUA = 10 THI NHAY TOI EXIT CON NEU = 100 THI XOA NO VOI 0
                            SJMP LAP
                            EXIT: RET
                            Nhận vẽ mạch in ^_^
                            TEL: 0167 4500 365
                            Mail:

                            Comment


                            • #15
                              Nguyên văn bởi minhthanh29 Xem bài viết
                              Thanks, bạn giải thích mình đoạn này, mình vẫn chưa hiểu lắm

                              LAP: CJNE DEM,#9,EXIT ;SO SANH R1 VOI 10 NEU CHUA = 10 THI NHAY TOI EXIT CON NEU = 100 THI XOA NO VOI 0
                              SJMP LAP
                              Mình đoán là đoạn này thực hiện công việc so sánh số hàng chục với 10. Nếu số hàng chục chưa bằng 10 (tức là số đếm chưa đạt tới 100) thì nhảy tới nhãn EXIT để tiếp tục việc hiển thị. Còn nếu số hàng chục bằng 10 (tương đương với số đếm băng 100) thì hiển thị lại từ đầu (hiện số 00).

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X