RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

ADC 8bit, 10bit, 12bit bằng MPASM

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • falleaf
    PIC Bang chủ
    • May 2005
    • 2627

    #1

    ADC 8bit, 10bit, 12bit bằng MPASM

    Mở ra luồng này để chuẩn bị cho cái tutorial về ADC. Chờ người viết cho cái này vậy, vì vấn đề này ai cũng làm được đơn giản, nhưng hình như chưa có cái tutorial chuẩn của picvietnam. Để đây chờ tác giả.

    Chúc vui
    Công ty TNHH Thương mại và Giao nhận R&P
    store.hn@rpc.vn - store.hcm@rpc.vn

    Học PIC như thế nào?
  • falleaf
    PIC Bang chủ
    • May 2005
    • 2627

    #2
    Vấn đề viết code cho ADC thì hoàn toàn không có vấn đề gì là khó khăn.

    Lưu ý phần code này, được trích trong một chương trình đã chạy ngon, nhưng vì trích dẫn ra, có thể nó không chạy được, hoặc có trục trặc gì, F không chịu trách nhiệm về việc sử dụng nó.

    Ngoài ra, F cũng không nói ứng dụng nó là ứng dụng gì, vì lý do nó được dùng cho một sản phẩm thương mại, chỉ trích phần ADC ra xem chơi thôi. Các bạn chủ yếu nắm ý tưởng một trong những cách viết ADC, còn lại, không cần quan tâm đến nội dung code. Đã 2 năm rưỡi nay F không đụng tới code của PIC, vì vậy, nếu có vấn đề gì, các bạn feedback lại để sửa nhé.

    Đoạn này khởi tạo các biến để sử dụng ADC.

    Code:
    		ORG	0x020
    ;==============================================
    ADCDATA		RES	1
    REGAD1		RES	1
    REGAD2		RES	1
    REGAD3		RES	1
    REGAD4		RES	1
    REGAD5		RES	1
    Code:
    ;----------------------
    ;Khoi tao cac ngo vao
    ;----------------------
    
    ADC		MOVLW	B'00000000'				; Tat ca portA la ngo vao ADC
    		MOVWF	ADCON1					; chon Vref = VDD
    Code:
    ;=============================
    ; Doc ADC
    ; Khong dung ngat de doc ADC
    ; Su dung thanh ghi GO/DONE
    ;=============================
    
    AD1		MOVLW	B'00000001'
    		CALL	ADSTART
    		MOVWF	REGAD1
    
    AD2		MOVLW	B'00010001'
    		CALL	ADSTART
    		MOVWF	REGAD2
    
    AD3		MOVLW	B'00100001'
    		CALL	ADSTART
    		MOVWF	REGAD3
    
    AD4		MOVLW	B'00011001'
    		CALL	ADSTART
    		MOVWF	REGAD4
    
    AD5		MOVLW	B'00100001'
    		CALL	ADSTART
    		MOVWF	REGAD5
    Đoạn trên gọi ADSTART, thì đây là chương trình ADSTART
    Code:
    ADSTART		MOVWF	ADCON0					
    DELAY12		DECFSZ	DLY12,	F				; 2 x DLY12 x 0.2 us
    		GOTO	DELAY12					; 2 x 30 x 0.2 = 12us
    		BSF	ADCON0,	2
    GODONE		BTFSC	ADCON0,	2
    		GOTO	GODONE					; Cho den khi convert xong
    		MOVF	ADRES,	W
    
    		RETURN
    Đại loại là đọc ADC 8 bit đơn giản như vậy thôi, nhưng bây giờ thì chúng ta tạm thời chưa phần tích kỹ phần thuật toán, chỉ là mào đầu thôi.

    Cái F muốn nói ở đây, đó là phần thiết kế điện tử cho ADC, hãy phân tích một thiết kế điện tử ADC để thiết kế ngõ vào cho ADC, giả sử nếu chúng ta cần dùng một mạch lọc, sẽ thiết kế thế nào? Vd: lọc thông thấp chẳng hạn (với các cảm biến nhiệt).

    Khi thiết kế xong, thì yêu cầu đi mạch ADC như thế nào?

    Chứ nếu không các bạn đọc 8bit thì chỉ còn tầm 6,7 bit, đọc 12 bit, có khi chỉ còn đúng ở mức 8bit... Lưu ý, bộ ADC của PIC, lên tới 10bit là cũng mệt mỏi lắm rồi.

    Mời các bạn tiếp tục thảo luận.

    Chúc vui
    Công ty TNHH Thương mại và Giao nhận R&P
    store.hn@rpc.vn - store.hcm@rpc.vn

    Học PIC như thế nào?

    Comment

    • nguyendungdt12
      Đệ tử 1 túi
      • Sep 2007
      • 11

      #3
      ai có tut về ADC cho cảm biếnd nhiệt viết bằng ASM giúp tôi với, khong thấy ở đâu nói đến cả

      Comment

      • babyrock
        Nhập môn đệ tử
        • Jan 2008
        • 3

        #4
        Bác viết bằng C đi được không? ASM hơi rắc rối

        Comment

        • tallht
          Đệ tử 5 túi
          • Mar 2008
          • 98

          #5
          Sao Không Ai Viết Tut Về Vấn đề Này Hết Vậy? Huhu
          -------------------------------------------------------------------
          Cung cấp bo mạch thực hành Arduino và các mạch sáng tạo.
          Mời tham quan: https://www.facebook.com/eshop1109

          Cung cấp dịch vụ order hàng từ Aliexpress
          Liên hệ: https://www.facebook.com/Mua-h%E1%BB...5265931515571/

          Comment

          • anmango35
            Nhập môn đệ tử
            • May 2007
            • 1

            #6
            ADC,
            Mình có color sensor để cảm nhận được sự thay đổi màu của đèn LED (Red, Xanh đậm, xanh lợt-RGB). Mình muốn xài con 16F877A để nhận tín hiệu từ sensor (Analog) và đổi thành (digital) để output của con 16F877A có thể gắn đèn LED. Nhưng mình không biết về sơ đồ mạch và code (Hex hay là ASM). Mong các bạn chì giáo cho. Cám ơn nhiều lắm

            Comment

            • tallht
              Đệ tử 5 túi
              • Mar 2008
              • 98

              #7
              Adc 8 bit

              Code:
                                     PROCESSOR PIC16F877A
              	          INCLUDE <P16F877A.INC>
              	    __CONFIG _XT_OSC & _WDT_OFF & _LVP_OFF & _CP_OFF
              ;*************************************************************
              ;CHUONG TRINH THU NGHIEM DUNG ADC CUA PIC 16F877A
              ;*************************************************************
              ;NGUOI THUC HIEN: TALLHT
              ;*************************************************************
              ;*************************************************************	
              		COUNT 	EQU 0X20	;BIEN DELAY
              		COUNT1	EQU 0X21
              ;************************************************************	
              MAIN	
              		BANKSEL TRISB
              		CLRF TRISB		;PORTB XUAT LED
              		MOVLW 0XFF
              		MOVWF TRISA		;PORT A LA INPUT
              LOOP	
              		BANKSEL ADCON1
              		MOVLW 0X00		;NGO VAO ANALOG,Fosc/2
              		MOVWF ADCON1
              		BANKSEL ADCON0
              		MOVLW	0X01		;CHON RA0 LAM NGO VAO,ADON=1,BAT ADC
              		MOVWF ADCON0
              		CALL DELAY		;CHO 1 KHOANG THOI GIAN TRUOC KHI BAT DAU
              		BSF ADCON0,GO		;SET BIT "GO",BAT DAU CONVERT
              ;***************************************
              ;KIEM TRA KET QUA
              		BTFSC ADCON0,GO			;KIEM TRA BIT "DONE" CUA ADCON0
              		GOTO $-1			;NEU BANG 1 THI CHO TIEP TUC
              		MOVF ADRES,W                              ;LAY KẾT QUẢ VÀO W
              		MOVWF PORTB			;XUAT RA PORTB
              		GOTO LOOP
              ;*******************************************************
              DELAY
              		MOVLW D'10'
              		MOVWF COUNT
              BACK
              		MOVLW D'4'
              		MOVWF COUNT1
              		DECFSZ COUNT1,F
              		GOTO $-1
              		DECFSZ COUNT,F
              		GOTO BACK
              		RETURN
              END
              Last edited by tallht; 20-08-2008, 05:02 PM.
              -------------------------------------------------------------------
              Cung cấp bo mạch thực hành Arduino và các mạch sáng tạo.
              Mời tham quan: https://www.facebook.com/eshop1109

              Cung cấp dịch vụ order hàng từ Aliexpress
              Liên hệ: https://www.facebook.com/Mua-h%E1%BB...5265931515571/

              Comment

              • tallht
                Đệ tử 5 túi
                • Mar 2008
                • 98

                #8
                Adc 8 bit

                Code cùng sơ đồ mạch kèm theo!
                Attached Files
                -------------------------------------------------------------------
                Cung cấp bo mạch thực hành Arduino và các mạch sáng tạo.
                Mời tham quan: https://www.facebook.com/eshop1109

                Cung cấp dịch vụ order hàng từ Aliexpress
                Liên hệ: https://www.facebook.com/Mua-h%E1%BB...5265931515571/

                Comment

                • tallht
                  Đệ tử 5 túi
                  • Mar 2008
                  • 98

                  #9
                  Về phần adc 8 bit của 16f877a có 3 thanh ghi liên quan đến: Adcon0,adcon1,adres
                  trước khi bắt đầu ta phải config các thanh ghi này đã !
                  **thanh ghi adcon0:
                  -bit7,6 chọn tần số chuyển đổi
                  -bit 5,4,3 chọn ngõ vào của tín hiệu analog
                  -bit 2 la bit"go/done*": Khi muốn bắt đầu convert thì set bit này lên,khi convert xong thì bit này tự động clear bởi phần cứng (ta có thể kiểm tra bit này để xem phần chuyển đổi xong chưa trong chương trình!)
                  -bit 1:=0
                  -bit 0: Adon,bật chế độ ad nếu bằng 1
                  **thanh ghi adcon1:
                  -bit 7,6,5,4,3=0
                  -bit 2,1,0 cho phép thiết lập ngõ vào là analog/digital (000: Tất cả các cổng là analog)
                  **thanh ghi adres:
                  Chứa 8 bit kết quả
                  **ngoài ra ta có thể thêm vào phần interrupt khi convert xong bằng cách tác động lên thanh ghi intcon,..

                  Tham khảo thêm phần appnote của microchip
                  MÌNH CHỈ CUNG CẤP BAO NHIÊU ĐÓ THÔNG TIN THÔI,NẾU CÓ GÌ SƠ SÓT THÌ MONG MẤY PÁC CHỈNH SỬA THÊM!
                  THANKS
                  Attached Files
                  -------------------------------------------------------------------
                  Cung cấp bo mạch thực hành Arduino và các mạch sáng tạo.
                  Mời tham quan: https://www.facebook.com/eshop1109

                  Cung cấp dịch vụ order hàng từ Aliexpress
                  Liên hệ: https://www.facebook.com/Mua-h%E1%BB...5265931515571/

                  Comment

                  • tallht
                    Đệ tử 5 túi
                    • Mar 2008
                    • 98

                    #10
                    à trước khi bắt đầu convert thì cần chờ 1 khoảng thời gian ( thường là khoảng 40 micro giây,ta cứ dùng delay là được ) gọi là acquisition time
                    -------------------------------------------------------------------
                    Cung cấp bo mạch thực hành Arduino và các mạch sáng tạo.
                    Mời tham quan: https://www.facebook.com/eshop1109

                    Cung cấp dịch vụ order hàng từ Aliexpress
                    Liên hệ: https://www.facebook.com/Mua-h%E1%BB...5265931515571/

                    Comment

                    • cancel
                      Nhập môn đệ tử
                      • Jul 2008
                      • 3

                      #11
                      Dùng ngắt điều khiển bộ ADC 10bit của pic16f877a

                      tui đã test code này rồi. tui hơi bối rối chổ banksel. Mỗi lần tui viết lệnh cho một thanh ghi phải coi nó thuộc bank nào rất vất vả. Vậy xin hỏi có một nguyên tắc nào để xài cái lệnh banksel không?
                      ;################################################# #########
                      TITLE "SU DUNG ADC"
                      PROCESSOR P16F877A
                      INCLUDE <P16F877A.INC>
                      __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF & _LVP_OFF & _CPD_OFF
                      ;#######################################
                      ;dung Vdd lam Vref
                      ;ket qua 10 bit xuat ra PORTB va
                      ;2 bit cao la RC0, RC1
                      ;lay mau o chan RA0
                      ;khi qua trinh chuyen doi hoan tat thi co ngat duoc bat len
                      ;va bit GO/DONE' duoc tu dong xoa ve 0
                      ;cancel
                      ;######################################
                      ORG 0x0000
                      goto MAIN
                      ORG 0x0004
                      goto IRS
                      ORG 0x0005
                      MAIN
                      ;configure I/O ports
                      banksel TRISA ;bank1
                      movlw B'111111'
                      movwf TRISA
                      movlw 0x00
                      movwf TRISB
                      movlw 0x00
                      movwf TRISC
                      movlw TRISC
                      ;configure A/D module

                      movlw B'10000000' ;luu ket qua ve ben phai hai thanh ghi ADRESH:ADRESL
                      ;chon 8 kenh analog vdd lam Vref
                      movwf ADCON1
                      bsf PIE1,ADIE ;cho phep ngat AD; trong bank1

                      banksel ADCON0 ;bank0
                      movlw B'01000001' ;clock conversion=Fosc/8
                      ;select AN0
                      ;clear GO/DONE'
                      ;turn on A/D

                      movwf ADCON0
                      ;configure A/D interrup
                      ;bcf PIR1,ADIF
                      bsf INTCON,PEIE
                      bsf INTCON,GIE
                      ;bsf PIE1,ADIE PIE1 o bank1

                      ;wait the required acquisition time; ko cho chuyen doi trong chuong trinh nay

                      ;start convertion: set bit GO/DONE' & ep ngat AD

                      bsf ADCON0,GO
                      bsf PIR1,ADIF
                      ;
                      goto $

                      IRS
                      btfss PIR1,ADIF
                      goto EXIT_ADC_INTERRUP
                      ADC_INTERRUP
                      ; display the result

                      movfw ADRESH
                      movwf PORTC
                      banksel ADRESL ;bank1
                      movfw ADRESL
                      banksel PORTB ;bank0
                      movwf PORTB

                      ;prepare for the next INTERRUP

                      bsf ADCON0,GO
                      bcf PIR1,ADIF
                      EXIT_ADC_INTERRUP

                      RETFIE
                      END

                      Comment

                      • lehung883
                        Nhập môn đệ tử
                        • Mar 2006
                        • 2

                        #12
                        gần 3 năm

                        Nguyên văn bởi falleaf View Post
                        Mở ra luồng này để chuẩn bị cho cái tutorial về ADC. Chờ người viết cho cái này vậy, vì vấn đề này ai cũng làm được đơn giản, nhưng hình như chưa có cái tutorial chuẩn của picvietnam. Để đây chờ tác giả.

                        Chúc vui
                        gần 3 năm sau cái luồng này vẫn chửa có tut hoàn chỉnh.

                        Comment

                        • JohnnyNguyen
                          Đệ tử 3 túi
                          • Jul 2009
                          • 46

                          #13
                          các bác cho em hỏi ý tưởng của phương pháp điểu chỉnh độ rộng xung nhờ khối ADC ko ah.có thêm mạch ví dụ nữa cho dễ hiểu

                          Comment

                          • Longfet53
                            Nhập môn đệ tử
                            • Feb 2011
                            • 9

                            #14
                            Nguyên văn bởi cancel View Post
                            tui đã test code này rồi. tui hơi bối rối chổ banksel. Mỗi lần tui viết lệnh cho một thanh ghi phải coi nó thuộc bank nào rất vất vả. Vậy xin hỏi có một nguyên tắc nào để xài cái lệnh banksel không?
                            ;################################################# #########
                            TITLE "SU DUNG ADC"
                            PROCESSOR P16F877A
                            INCLUDE <P16F877A.INC>
                            __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF & _LVP_OFF & _CPD_OFF
                            ;#######################################
                            ;dung Vdd lam Vref
                            ;ket qua 10 bit xuat ra PORTB va
                            ;2 bit cao la RC0, RC1
                            ;lay mau o chan RA0
                            ;khi qua trinh chuyen doi hoan tat thi co ngat duoc bat len
                            ;va bit GO/DONE' duoc tu dong xoa ve 0
                            ;cancel
                            ;######################################
                            ORG 0x0000
                            goto MAIN
                            ORG 0x0004
                            goto IRS
                            ORG 0x0005
                            MAIN
                            ;configure I/O ports
                            banksel TRISA ;bank1
                            movlw B'111111'
                            movwf TRISA
                            movlw 0x00
                            movwf TRISB
                            movlw 0x00
                            movwf TRISC
                            movlw TRISC
                            ;configure A/D module

                            movlw B'10000000' ;luu ket qua ve ben phai hai thanh ghi ADRESH:ADRESL
                            ;chon 8 kenh analog vdd lam Vref
                            movwf ADCON1
                            bsf PIE1,ADIE ;cho phep ngat AD; trong bank1

                            banksel ADCON0 ;bank0
                            movlw B'01000001' ;clock conversion=Fosc/8
                            ;select AN0
                            ;clear GO/DONE'
                            ;turn on A/D

                            movwf ADCON0
                            ;configure A/D interrup
                            ;bcf PIR1,ADIF
                            bsf INTCON,PEIE
                            bsf INTCON,GIE
                            ;bsf PIE1,ADIE PIE1 o bank1

                            ;wait the required acquisition time; ko cho chuyen doi trong chuong trinh nay

                            ;start convertion: set bit GO/DONE' & ep ngat AD

                            bsf ADCON0,GO
                            bsf PIR1,ADIF
                            ;
                            goto $

                            IRS
                            btfss PIR1,ADIF
                            goto EXIT_ADC_INTERRUP
                            ADC_INTERRUP
                            ; display the result

                            movfw ADRESH
                            movwf PORTC
                            banksel ADRESL ;bank1
                            movfw ADRESL
                            banksel PORTB ;bank0
                            movwf PORTB

                            ;prepare for the next INTERRUP

                            bsf ADCON0,GO
                            bcf PIR1,ADIF
                            EXIT_ADC_INTERRUP

                            RETFIE
                            END
                            Mình không hiểu ở chỗ cái dòng
                            bsf ADCON0,GO
                            bsf PIR1,ADIF
                            bạn set ADIF dể làm gì? bạn giải thích chút được không.

                            Comment

                            • bombon18
                              Nhập môn đệ tử
                              • Feb 2011
                              • 1

                              #15
                              Nguyên văn bởi Longfet53 View Post
                              Mình không hiểu ở chỗ cái dòng
                              bsf ADCON0,GO
                              bsf PIR1,ADIF
                              bạn set ADIF dể làm gì? bạn giải thích chút được không.
                              Mình nghĩ chỗ đó phải là BCF PIR1,ADIF mới đúng. Bới vì bit ADIF chỉ được set khi hoàn thành xong quá trình chuyển đổi AD thôi.

                              Comment

                              Working...