Thông báo

Collapse
No announcement yet.

Adc_voi_pic_16f877a

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

  • Adc_voi_pic_16f877a

    Chào các bác!
    các bác cho em hỏi ti!
    em dùng pic16f877a nhưng em gặp vấn đề là!
    khi đọc ADC một kênh thì làm được!
    nhưng khi em muốn đọc nhiều hơn 1 kênh (2,3 kênh hoặc nhiều hơn) thì em không làm được!
    mong các bác chỉ giúp!
    các bác có đoạn code nào thì porst lên cho em với!
    thanks!@

  • #2
    PIC16F877 chỉ có 1 Modul ADC. Khi bạn cần chuyển đổi các chân tín hiệu vào cần đo ( Kênh ) thì bạn cần chú ý đến mấy thanh ghi cơ bản sau là ổn : Thanh ghi TRISx tương ứng với chân mà bạn chọn chân đó là tín hiệu Analog cần đo. Giá trị TRISx này cần phải set lên 1. Tiếp đến là các thanh ghi ADCON0 và ADCON1. khi bạn đọc kênh khác thì bạn phải chắc chắn là các thanh ghi trên đã được xác lập với giá trị thích hợp.
    Tốt nhất bạn nên Post code lên thì sẽ rõ hơn.

    Kích từ, điều tốc, nhiệt độ , mức dầu, bảo vệ, đo mực nước, thông báo lũ...cho nhà máy Thủy Điện

    Comment


    • #3
      Nguyên văn bởi tran truong Xem bài viết
      Chào các bác!
      các bác cho em hỏi ti!
      em dùng pic16f877a nhưng em gặp vấn đề là!
      khi đọc ADC một kênh thì làm được!
      nhưng khi em muốn đọc nhiều hơn 1 kênh (2,3 kênh hoặc nhiều hơn) thì em không làm được!
      mong các bác chỉ giúp!
      các bác có đoạn code nào thì porst lên cho em với!
      thanks!@
      Đã trả lời một câu hỏi tương tự ở picvietnam rồi, bạn xem ở đây nhé (post #7 và #8):
      http://www.picvietnam.com/forum//showthread.php?p=18426

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

      Comment


      • #4
        Đoạn code sau khi thay đổi trị CHANEL bạn sẽ thay đổi kênh ADC


        HTML Code:
        ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        	;CAC BIEN DUNG CHO ADC
        ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        
        CHANEL				;BIEN LUU TRI SO CHANEL :	.0	.1	.2	.3	.4	
        TEMP_ISR			;Bien trung gian
        ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        .
        .
        .
        .
        .
        .
        
        ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        							;CHUONG TRINH DOC ADC : READ_ANALOG
        ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        
        READ_ANALOG
        
        					MOVLW	.4
        					MOVWF	PCLATH
        					MOVF	CHANEL, W				;THIET LAP CHANEL TREN ADCON0
        					CALL	TABLE_CHANEL
        
        					MOVWF	ADCON0		
        					BSF		ADCON0,ADON				;DAT ADC O CHE DO : ON
        					MOVLW	.70
        					MOVWF	TEMP_ISR
        ACQUILOOP			DECFSZ	TEMP_ISR,F
        					GOTO	ACQUILOOP
        					BSF		ADCON0,GO				;SET BIT COLAYMAU : GO =1
        CONVERTLOOP			BTFSC	ADCON0,GO				;CHO DEN KHI PHAN CUNG XOA BIT COLAYMAU : GO =0
        					GOTO	CONVERTLOOP
        					BSF		STATUS,RP0				;QUA BANK1
        					MOVF	ADRESL,W				;LAY GIA TRI KET QUA BYTE THAP VAO W
        					BCF		STATUS,RP0				;TRO VE BANK0
        					MOVWF	L_BYTE					;LUU W VAO L_BYTE
        					MOVF	ADRESH,W
        					MOVWF	H_BYTE					;LUU GIA TRI BYTE CAO VAO H_BYTE
        					BCF		ADCON0,ADON				;DAT ADC VE CHE DO : OFF
        
        
        EXIT_ANALOG			RETURN
        
        
        
        				ORG	400
        ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        ;									PHU LUC
        ;	CAC BANG DUNG TRONG TINH TOAN:
        ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        TABLE_CHANEL
        					ADDWF	PCL, F
        					RETLW	B'10000000'		;CHANEL=0
        					RETLW	B'10001000'		;CHANEL=1
        					RETLW	B'10010000'		;CHANEL=2
        					RETLW	B'10100000'		;CHANEL=3
        					RETLW	B'10101000'		;CHANEL=4

        Comment


        • #5
          Vâng cảm ơn các bác!
          em thử làm xem sao????

          Comment


          • #6
            setup_adc_ports(AN0_AN1_AN3);
            setup_adc(ADC_CLOCK_INTERNAL);

            Nếu muốn đọc toàn bộ, thì dùng lệnh setup_adc(ALL_ANALOG).
            Lệnh trên cho CCS sẽ setup Adc đọc 3 kênh.
            Đọc giá trị từng kênh:
            Code:
            set_adc_channel(0);  // chọn kênh 0
            delay_us(10);
            adc0 = read_adc();
            
            set_adc_channel(1);  // chọn kênh 1
            delay_us(10);
            adc1 = read_adc();
            Bám vào phần Help của CCS để nắm hết các lệnh, hàm.
            Ethernet-RS232, PIC Webserver, RFID Reader
            CallerID, Cảnh báo BTS, ...
            0988006696
            linhnc308@gmail.com
            http://linhnc308.blogspot.com

            Comment


            • #7
              Vâng!
              nhưng em có đoạn code thế này! Em dùng 6 kênh analog còn chân ra2 làm vref-, ra3 làm vref+; không biết sai ở đâu mà không sao đọc được! khi hiển thị lên lcd thì chỉ thấy hiện các số cố định. khi thay đổi biến trở đê thay đổi điện áp đầu vào thì vẫn không có hiện tượng gì????
              các bác giúp em với!
              thanks!
              Code:
              #include <16f877a.h>
              #include <def_877a.h>
              #device *16ADC =8
              #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
              #use delay(clock=8000000)
              #include <lcd_lib_4bit.c>
              #include <math.h> 
              
              float value1,value2;
              int16 a,b;
              int8 a1,a2,a3,a4,b1,b2,b3,b4;
              void main()
              {
              trisa=0x3f;
              trise=0x07;
              
                setup_adc_ports(AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF );
              //  setup_adc(ADC_CLOCK_INTERNAL);
               setup_adc(ADC_CLOCK_DIV_2); 
              while(1)
              {
               set_adc_channel(0);
                 delay_ms(1);
               value1 = (float)read_adc();
               delay_ms(1);
               a=(int16)(value1*5000)/255;
               a1= a/1000+48;
               a2=(a-a1*1000)/100+48;
               a3=(a-a1*1000-a2*100)/10+48;
               a4= (int8)a%10+48;
               lcd_putcmd(0x80);
                  lcd_putchar(a1);
                  lcd_putchar(a2);
                  lcd_putchar(a3);
                  lcd_putchar(a4);
               set_adc_channel(2);
                 delay_ms(1);
              value2 = (float)read_adc();
                delay_ms(1);
               b=(int16)(value2*5000)/255; 
               b1= b/1000+48;
               b2=(b-b1*1000)/100+48;
               b3=(int8)(b-b1*1000-b2*100)/10+48;
               b4= (int8)b%10+48;
                lcd_putcmd(0xC0);
                  lcd_putchar(b1);
                  lcd_putchar(b2);
                  lcd_putchar(b3);
                  lcd_putchar(b4);
                  delay_ms(300);
               lcd_putcmd(0x01); 
              }
              }
              Last edited by tran truong; 29-08-2008, 23:20.

              Comment

              Về tác giả

              Collapse

              tran truong Tìm hiểu thêm về tran truong

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

              Collapse

              Đang tải...
              X