Thông báo

Collapse
No announcement yet.

Kỹ Thuật Bảng Trong Pic ?

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

  • Kỹ Thuật Bảng Trong Pic ?

    nhờ các bạn giúp đở
    nếu 1 bảng được viết như sau nó có chạy được không

    KEY_VAL có giá trị từ 0 tới 16




    Code:
                            ........
                            GOTO  TABLE_ENTRY
                            ........
    
    		TABLE_ENTRY		
    				MOVF	KEY_VAL, W
    				ADDWF	PCL, F
    				GOTO	ROUTINE_PRESET		;0
    				GOTO	ROUTINE_NEXT		;1
    				GOTO	ROUTINE_ONOFF		;2
    				GOTO	ROUTINE_SAVE		;3
    				GOTO	ROUTINE_NUMBER		;4
    				GOTO	ROUTINE_NUMBER		;5			
    				GOTO	ROUTINE_NUMBER		;6
    				GOTO	ROUTINE_UNDO		;7
    				GOTO	ROUTINE_NUMBER		;8
    				GOTO	ROUTINE_NUMBER		;9
    				GOTO	ROUTINE_NUMBER		;10
    				GOTO	ROUTINE_NUMBER		;11
    				GOTO	ROUTINE_NUMBER		;12
    				GOTO	ROUTINE_NUMBER		;13
    				GOTO	ROUTINE_NUMBER		;14
    				GOTO	ROUTINE_CLEAR		;15
    				RETURN						;16

  • #2
    Nguyên văn bởi phamkhuyen Xem bài viết
    nhờ các bạn giúp đở
    nếu 1 bảng được viết như sau nó có chạy được không

    KEY_VAL có giá trị từ 0 tới 16




    Code:
                            ........
                            GOTO  TABLE_ENTRY
                            ........
    
    		TABLE_ENTRY		
    				MOVF	KEY_VAL, W
    				ADDWF	PCL, F
    				GOTO	ROUTINE_PRESET		;0
    				GOTO	ROUTINE_NEXT		;1
    				GOTO	ROUTINE_ONOFF		;2
    				GOTO	ROUTINE_SAVE		;3
    				GOTO	ROUTINE_NUMBER		;4
    				GOTO	ROUTINE_NUMBER		;5			
    				GOTO	ROUTINE_NUMBER		;6
    				GOTO	ROUTINE_UNDO		;7
    				GOTO	ROUTINE_NUMBER		;8
    				GOTO	ROUTINE_NUMBER		;9
    				GOTO	ROUTINE_NUMBER		;10
    				GOTO	ROUTINE_NUMBER		;11
    				GOTO	ROUTINE_NUMBER		;12
    				GOTO	ROUTINE_NUMBER		;13
    				GOTO	ROUTINE_NUMBER		;14
    				GOTO	ROUTINE_CLEAR		;15
    				RETURN						;16
    bảng tra phải được viết như mọt chương trình con.
    bạn tham khảo bảng sau:
    call TEXT
    TEXT addwf PCL, f
    retlw 0x00
    retlw 0x01
    retlw 0x02
    retlw 0x03
    retlw 0x04
    retlw 0x05
    retlw 0x06
    retlw 0x07
    Last edited by tdm; 30-06-2007, 00:28.
    |

    Comment


    • #3
      bài test1

      chương trình này tôi thử trên PROTEUS nó chạy nhưng nạp vào ic thi nó không chạy, (ic mạch nạp đã kiểm tra tốt)
      các bạn có thể giải thích tại sao không ?
      Code:
      ;CHUONG TRINH TEST1
      ;MASO : KP16ADC
      ;Nguoi thuc hien : PHAM THANH KHUYEN
      ;Ngay thuc hien :29/06/2007
      ;----------------------------------------------------------------
      ;processor	:	PIC 16F877
      ;OSC		:	XT20MHz
      ;
      ;-----------------------------------------------------------------
      
      			LIST P=16F877
      			INCLUDE <P16F877.INC>
      			__CONFIG _XT_OSC &_WDT_OFF&_LVP_OFF
      
      ;CAC BIEN
      			CBLOCK
      	KEY_VAL
      			ENDC
      
      
      ;CHUONG TRINH BAT DAU TU DAY
      
      			ORG 0
      			GOTO	START	
      
      START
      	INI_PORT
      			BANKSEL		TRISB
      			CLRF		TRISB
      			BANKSEL		PORTB
      			CLRF		PORTB
      			MOVLW		.4
      			MOVWF		KEY_VAL
      			GOTO		TABLE_ENTRY
      	
      ROUTINE_PRESET
      
      			MOVLW	B'00000001'
      			MOVWF	PORTB
      			RETURN
      
      ROUTINE_NEXT
      			MOVLW	B'00000001'
      			MOVWF	PORTB
      			RETURN
      
      ROUTINE_ONOFF
      			MOVLW	B'00000011'
      			MOVWF	PORTB
      			RETURN
      
      ROUTINE_NUMBER
      			MOVLW	B'00000111'
      			MOVWF	PORTB
      			RETURN
      
      ROUTINE_UNDO
      			MOVLW	B'00001111'
      			MOVWF	PORTB
      			RETURN
      
      ROUTINE_CLEAR
      			MOVLW	B'00011111'
      			MOVWF	PORTB
      			RETURN
      ROUTINE_SAVE
      			MOVLW	B'00111111'
      			MOVWF	PORTB
      			RETURN
      
      	TABLE_ENTRY		;KHI PRESET_FLAG=1
      				MOVF	KEY_VAL, W
      				ADDWF	PCL, F
      				GOTO	ROUTINE_PRESET		;0
      				GOTO	ROUTINE_NEXT		;1
      				GOTO	ROUTINE_ONOFF		;2
      				GOTO	ROUTINE_SAVE		;3
      				GOTO	ROUTINE_NUMBER		;4
      				GOTO	ROUTINE_NUMBER		;5			
      				GOTO	ROUTINE_NUMBER		;6
      				GOTO	ROUTINE_UNDO		;7
      				GOTO	ROUTINE_NUMBER		;8
      				GOTO	ROUTINE_NUMBER		;9
      				GOTO	ROUTINE_NUMBER		;10
      				GOTO	ROUTINE_NUMBER		;11
      				GOTO	ROUTINE_NUMBER		;12
      				GOTO	ROUTINE_NUMBER		;13
      				GOTO	ROUTINE_NUMBER		;14
      				GOTO	ROUTINE_CLEAR		;15
      				RETURN						;16
      			END

      Comment


      • #4
        Nếu GOTO đến các đoạn code khác thì các đoạn code đó không được dùng RETURN. RETURN là lệnh sẽ lấy nội dung của ngăn xếp đặt vào thanh ghi đếm chương trình PC. Chỉ khi gọi bằng CALL thì mới dùng RETURN để trở về lệnh nằm sau CALL, sau khi đã thực hiện xong chương trình con được gọi bằng CALL.

        Chương trình của bạn chạy 1 lượt đến khi gặp lệnh GOTO nào đó trong bảng, và chạy đến đoạn code tương ứng, khi thực hiện xong đoạn code đó thì sẽ gặp lệnh RETURN. Lúc này trong ngăn xếp không hề có địa chỉ trở về hợp lệ, nội dung của ngăn xếp là không xác định. Do đó, chương trình của bạn không chạy trên chip thực, nhưng có thể chạy trên phần mềm mô phỏng, vì phần mềm có thể giả định nội dung cho ngăn xếp, và việc giả định này là nhất quán.

        Thân,
        Biển học mênh mông, sức người có hạn

        Comment


        • #5
          __CONFIG _XT_OSC &_WDT_OFF&_LVP_OFF

          bạn xem lại phần khai báo này, ở chế độ dao động bạn chon xt a!
          bạn muốn dùng 20 Mhz thì phải config HS mới đúng
          chùc bạn thành công!

          Comment


          • #6
            Tại sao lại dùng kỹ thuật bảng như thế này?

            Chúc vui
            Falleaf
            Công ty TNHH Thương mại và Giao nhận R&P
            58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
            mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

            Comment


            • #7
              vâng. sao lại không dùng cách viết bảng chuẩn như ở các TUT đã viết ạ

              Comment


              • #8
                em biết 1 TUT về cái này nhừng bên trang www.picvietnam.com ban wa đó tìm nha mình ko nhớ nó nằm ở đâu

                Comment


                • #9
                  có phải cái này không ?
                  nó nằm trong File kèm theo

                  Code:
                  ;;;;;;;;;
                  ;;; TRANSLATE THE CURRENT KEYSTROKE INTO AN EQUIVALENT BINARY VALUE.
                  ;;;;;;;;;;
                  
                  KEY_XLATE:
                  			; TRANSLATE THE HARDWARE BIT PATTERN INDICATING
                  			; WHICH ROW WAS SELECTED INTO AN EQUIVALENT BINARY
                  			; ROW NUMBER.  THIS WILL BE USED TO INDEX INTO
                  			; THE TRANSLATION TABLE FOR THE CURRENT COLUMN TO
                  			; GET THE FINAL BINARY VALUE FOR THAT KEY.
                  
                  			COMF	KEY_VAL,W	; COMPLEMENT SO ONLY BIT ON CORRESPONDS
                  			ANDLW	0FH		; TO ROW SELECTED - MASK UNUSED OFF
                  			CALL	BIT2ROW		; TRANSLATE IT INTO A ROW NUMBER
                  			MOVWF	KEY_VAL		; SAVE FOR USE BELOW
                  
                  			; TRANSLATE KEY VALUE INTO EQUIVALENT BINARY VALUE
                  			; USING THE APPROPRIATE TRANSLATION TABLE FOR THE
                  			; CURRENT COLUMN
                  
                  			MOVFW	CURRENT_COL	; GET CURRENT COLUMN
                  			ADDLW	-1		; CONVERT INTO AN 0-RELATIVE OFFSET
                  			ADDWF	PCL,F		; DISPATCH INTO THE FOLLOWING JUMP TABLE
                  			GOTO	COL1_XLATE
                  			GOTO	COL2_XLATE
                  			GOTO	COL3_XLATE
                  			GOTO	COL4_XLATE
                  
                  COL1_XLATE:
                  			MOVFW	KEY_VAL
                  			CALL	COL1_KEYS
                  			MOVWF	KEY_VAL
                  			RETURN
                  
                  COL2_XLATE:
                  			MOVFW	KEY_VAL
                  			CALL	COL2_KEYS
                  			MOVWF	KEY_VAL
                  			RETURN
                  
                  COL3_XLATE:
                  			MOVFW	KEY_VAL
                  			CALL	COL3_KEYS
                  			MOVWF	KEY_VAL
                  			RETURN
                  
                  COL4_XLATE:
                  			MOVFW	KEY_VAL
                  			CALL	COL4_KEYS
                  			MOVWF	KEY_VAL
                  			RETURN
                  
                  
                  ;;; END OF 'KEY_XLATE'
                  Attached Files

                  Comment


                  • #10
                    http://www.picvietnam.com/forum//showthread.php?t=5

                    Bạn đọc bài số 27 của F viết trong luồng trên. Đây mới là tài liệu hướng dẫn của picvietnam.

                    Chúc vui
                    Falleaf
                    Công ty TNHH Thương mại và Giao nhận R&P
                    58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                    mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                    Comment


                    • #11
                      to namqn
                      đúng là ở lệnh GOTO khi dùng lệnh RETURN thì nội dung lấy từ ngăn xếp không phải là địa chỉ tại dòng lệnh GOTO , nhưng khi lệnh RETURN thì nó sẽ lấy nội dung từ ngăn xếp ra và nó là địa chỉ tại dòng lệnh CALL gần nhất ,trong trường hợp này nếu lệnh RETURN nằm ở đoạn chương trình của GOTO thì lúc đó nó sẽ trở về tại dòng lệnh CALL trước GOTO cho nên có thể dùng bảng với lệnh GOTO như trên, nhưng đoạn chương trình trên được viết lại như sau :


                      Code:
                      ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      ;CHUONG TRINH TEST1
                      ;MASO : KP16ADC
                      ;Nguoi thuc hien : PHAM THANH KHUYEN
                      ;Ngay thuc hien :01/07/2007
                      ;processor	:	PIC 16F877A
                      ;OSC		:	XT20MHz
                      ;
                      ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-
                      ;KHAI BAO CHO THIET BI :
                      
                      			LIST P=16F877A
                      			INCLUDE <P16F877A.INC>
                      			__CONFIG _HT_OSC &_WDT_OFF&_LVP_OFF
                      ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      ;KHAI BAO CAC BIEN CUA CHUONG TRINH
                      
                      			CBLOCK 0x20
                      KEY_VAL
                      			ENDC
                      
                      ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      ;CHUONG TRINH BAT DAU TU DAY
                      
                      			ORG 0
                      			GOTO	START	
                      
                      START
                      	;KHAI BAO BAN DAU CHO CHUONG TRINH:
                      	INI_PORT
                      			BANKSEL		TRISB
                      			CLRF		TRISB
                      			BANKSEL		PORTB
                      			CLRF		PORTB
                      
                      	;CHUONG TRINH CHINH O DAY:
                      	MAIN
                      			;GIA TRI TEST
                      			MOVLW	.4
                      			;
                      			CALL	TEST_CHUONGTRINH
                      			GOTO	MAIN
                      ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      ;CAC CHUONG TRINH CON:
                      
                      
                      TEST_CHUONGTRINH
                      			
                      			MOVWF	KEY_VAL
                      TABLE_ENTRY		;KHI PRESET_FLAG=1
                      				MOVF	KEY_VAL, W
                      				ADDWF	PCL, F
                      				GOTO	ROUTINE_PRESET		;0
                      				GOTO	ROUTINE_NEXT		;1
                      				GOTO	ROUTINE_ONOFF		;2
                      				GOTO	ROUTINE_SAVE		;3
                      				GOTO	ROUTINE_NUMBER		;4
                      				GOTO	ROUTINE_NUMBER		;5			
                      				GOTO	ROUTINE_NUMBER		;6
                      				GOTO	ROUTINE_UNDO		;7
                      				GOTO	ROUTINE_NUMBER		;8
                      				GOTO	ROUTINE_NUMBER		;9
                      				GOTO	ROUTINE_NUMBER		;10
                      				GOTO	ROUTINE_NUMBER		;11
                      				GOTO	ROUTINE_NUMBER		;12
                      				GOTO	ROUTINE_NUMBER		;13
                      				GOTO	ROUTINE_NUMBER		;14
                      				GOTO	ROUTINE_CLEAR		;15
                      				RETURN						;16
                      ROUTINE_PRESET
                      
                      			MOVLW	B'00000001'
                      			MOVWF	PORTB
                      			RETURN
                      
                      ROUTINE_NEXT
                      			MOVLW	B'00000001'
                      			MOVWF	PORTB
                      			RETURN
                      
                      ROUTINE_ONOFF
                      			MOVLW	B'00000011'
                      			MOVWF	PORTB
                      			RETURN
                      
                      ROUTINE_NUMBER
                      			MOVLW	B'00000111'
                      			MOVWF	PORTB
                      			RETURN
                      
                      ROUTINE_UNDO
                      			MOVLW	B'00001111'
                      			MOVWF	PORTB
                      			RETURN
                      
                      ROUTINE_CLEAR
                      			MOVLW	B'00011111'
                      			MOVWF	PORTB
                      			RETURN
                      ROUTINE_SAVE
                      			MOVLW	B'00111111'
                      			MOVWF	PORTB
                      			RETURN
                      
                      			END

                      Comment


                      • #12
                        Như vậy là bạn đồng ý rằng code trước đây mà bạn đã post lên ở post #3 là không ổn, vì bạn phải sửa lại để có 1 lệnh CALL thì cái bảng đó mới chạy được.

                        Bây giờ bạn thử so sánh cách của bạn vừa mới post lên và cách mà tdm đã nêu ở post #2 xem cách nào hiệu quả hơn (ngắn gọn, rõ ràng hơn).

                        Thân,
                        Biển học mênh mông, sức người có hạn

                        Comment


                        • #13
                          đúng là trong ví dụ trên thì dùng bảng theo cách thông thường sẽ ngắn gọn hơn, nhưng đặc trường hợp các chương trình gọi ROUTINE_PRESET, ROUTINE_NEXT... nó không phải là hằng số mà nó là 1 chương trình con thì rỏ ràng không thể dùng bảng kiểu thông thường được
                          thân

                          Comment


                          • #14
                            Nếu mà việc nhảy như thế tới một chương trình con thì không ai viết như bạn cả. Cách viết của bạn nói chung OK (mình chưa xem kỹ chương trình, nhưng xem về ý tưởng).

                            Call HAMGIDO
                            >> Chạy cái gì đó
                            >> GOTO Label nào đó
                            >>>> RETURN

                            Cái return này nó thay cho cái RETURN của CALL, nhưng bạn lại viết nó trong cái GOTO, nhưng kệ, không sao cả, đại ý thì vẫn đúng.

                            Thường thì người ta sẽ đặt chỗ kết thúc quay về vị trí trong hàm gọi CALL và viết cấu trúc theo CALL ... RETURN.

                            Viết theo cấu trúc GOTO bên trong bảng ở đây là đúng rồi, không có gì sai cả. Vì nếu đưa CALL thay cho GOTO thì nó sẽ tuần tự thực hiện hết tất cả các nút nhấn >> Sai.

                            Do vậy các bạn làm, nếu muốn gọi một hàm, như thế hoàn toàn ổn.
                            Code:
                            ........
                                                    GOTO  TABLE_ENTRY
                                                    ........
                            
                            		TABLE_ENTRY
                            Nhưng ở cái bài đầu tiên này, bạn dùng GOTO TABLE_ENTRY thì hoàn toàn bậy. Cái này bắt buộc phải là CALL.

                            Chúc vui
                            Falleaf
                            Công ty TNHH Thương mại và Giao nhận R&P
                            58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                            mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                            Comment


                            • #15
                              F viết cái code này hơi mắc cừoi một chút, nhưng mà chắc bạn sẽ hiểu rõ hơn.

                              Code:
                              		CALL	TEST_CHUONGTRINH
                              			GOTO	MAIN
                              ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                              ;CAC CHUONG TRINH CON:
                              
                              
                              TEST_CHUONGTRINH
                              			
                              			MOVWF	KEY_VAL
                              TABLE_ENTRY		;KHI PRESET_FLAG=1
                              				MOVF	KEY_VAL, W
                              				ADDWF	PCL, F
                              				GOTO	ROUTINE_PRESET		;0
                              				GOTO	ROUTINE_NEXT		;1
                              				GOTO	ROUTINE_ONOFF		;2
                              				GOTO	ROUTINE_SAVE		;3
                              				GOTO	ROUTINE_NUMBER		;4
                              				GOTO	ROUTINE_NUMBER		;5			
                              				GOTO	ROUTINE_NUMBER		;6
                              				GOTO	ROUTINE_UNDO		;7
                              				GOTO	ROUTINE_NUMBER		;8
                              				GOTO	ROUTINE_NUMBER		;9
                              				GOTO	ROUTINE_NUMBER		;10
                              				GOTO	ROUTINE_NUMBER		;11
                              				GOTO	ROUTINE_NUMBER		;12
                              				GOTO	ROUTINE_NUMBER		;13
                              				GOTO	ROUTINE_NUMBER		;14
                              				GOTO	ROUTINE_CLEAR		;15
                              	TRAVEDAY		RETURN						;16
                              
                              ROUTINE_PRESET
                              
                              			MOVLW	B'00000001'
                              			MOVWF	PORTB
                              			GOTO TRAVEDAY
                              
                              ROUTINE_NEXT
                              			MOVLW	B'00000001'
                              			MOVWF	PORTB
                              			GOTO TRAVEDAY (tương tự mấy cái ở dưới)
                              
                              ROUTINE_ONOFF
                              			MOVLW	B'00000011'
                              			MOVWF	PORTB
                              			RETURN
                              
                              ROUTINE_NUMBER
                              			MOVLW	B'00000111'
                              			MOVWF	PORTB
                              			RETURN
                              
                              ROUTINE_UNDO
                              			MOVLW	B'00001111'
                              			MOVWF	PORTB
                              			RETURN
                              
                              ROUTINE_CLEAR
                              			MOVLW	B'00011111'
                              			MOVWF	PORTB
                              			RETURN
                              ROUTINE_SAVE
                              			MOVLW	B'00111111'
                              			MOVWF	PORTB
                              			RETURN
                              
                              			END
                              Falleaf
                              Công ty TNHH Thương mại và Giao nhận R&P
                              58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                              mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X