• Webdien.com - Cầu nối dân điện


    1. [HOT] - Webdien đang tuyển các vị trí quản lý cao cấp

      ntech.com.vn

  • Trang 1 của 2 12 CuốiCuối
    Kết quả 1 đến 10 của 14
    1. #1
      Tham gia
      06-03-2011
      Bài viết
      30
      Cảm ơn
      10
      Được cảm ơn 5 lần, trong 5 bài

      Mặc định adc trong của con Pic 18f4620 lập trình bằng C18

      e đang học con 18f4620,có làm mạch đo nhiệt độ dùng adc trong của pic hiển thị ra led 7 thanh hoặc lcd.Mọi người xem hộ xem lỗi ở đâu mà nó k hiển thị đc.E nghĩ là dữ liệu k truyền đc từ adc ra nhưng k hiểu vì sao.(E lập trình bằng C18)

      phần code hiển thị ra led 7 thanh:
      Code:
      #include "p18f4620.h"
      #include "delays.h"
      #include "adc.h"
      #pragma config OSC=HS, WDT=OFF
      
      const unsigned char dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
      int a,b,n,doC,dvi,chuc,tram;
      void convert(int a)
      {
      tram=a/100;
      a=a%100;
      chuc=a/10;
      dvi=a%10;
      }
      void hienthi() // quet led
      {
      for(n=0;n<10;n++)
      {
      PORTB=dig[dvi];
      PORTD=0x01;       //bat led 1
      Delay100TCYx(20);  // tre 100us
      PORTB=dig[chuc];
      PORTD=0x02;        // bat led 2
      Delay100TCYx(20);
      PORTB=dig[tram];
      PORTD=0x04;         // bat led 3
      Delay100TCYx(20);
      }
      }
       void main(void)
      {
      TRISB=0;  // chon cong B la cong ra
      TRISD=0;   // chon cong D la cong ra
      TRISAbits.TRISA0=1;  // chon cong A la cong vao
      ADCON0=0x00;                //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
      ADCON1=0x0E;                //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
      ADCON2bits.ACQT2=0;         //
      ADCON2bits.ACQT1=0;         //
      ADCON2bits.ACQT0=1;         //3 bits lua chon thoi gian thu thap du lieu TAD
      ADCON2bits.ADCS2=1;         //
      ADCON2bits.ADCS1=0;         //
      ADCON2bits.ADCS0=0;         //3 bits lua chon tan so chuyen doi
      Delay10TCY();
      
      ADCON0bits.ADON=1;
      while(1)
      {
      ADCON0bits.GO=1;
      Delay10TCYx(2);
      ADCON0bits.GO=0;
      
      
      b = ReadADC();
      doC = (b-558.558)/2.048;  //tùy ADC 8bit hay 10 bit  tính toán giá tri
      a = doC;
      convert((int)a);
      Delay10TCY();
      
      convert((int)a);
      hienthi(tram,chuc,dvi);
      }
      }

      và phần ra LCD:
      Code:
      #include "p18f4620.h"
      #include "delays.h"
      #include "adc.h"
      #pragma config OSC=HS, WDT=OFF
      
      char adc;
      long s; float doC;
      unsigned char li,lj;
      
      #define rs LATDbits.LATD0
      #define rw LATDbits.LATD1
      #define en LATDbits.LATD2
      
      void delay (unsigned char time )             // ham co tac dung delay thoi gian lon
      	{
      	    for ( li=0 ; li<80; li++ )
      		for ( lj=0 ; lj<time; lj++)
      		{}
      	}
      
      
      	void lenh_LCD (unsigned char s)				// ham dua 1 lenh ra ngoai LCD
      	{
      		LATC=s;
      		rs=0;			                        // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
      		rw=0;
      		en=1;
      		delay(1);
      		en=0;
      		delay(1); 
      	} 
      
      
      	void data_LCD (unsigned char s)				// ham dua 1 lenh ra ngoai LCD
      	{
      		LATC=s;
      		TRISD=0xF8 ;		   					// cho 3 bit thap nhat duoc lam cong ra
      		rs=1;			            // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
      		rw=0;
      		en=1;
      		delay(1);
      		en=0;
      	}
      void main(void)
      {
      int kq;
      INTCON=0x00;
      TRISAbits.TRISA0=1;                      //cong A0 lam dau vao tu cam bien
      TRISC=0x00;                              //cong C lam cong ra du lieu
      TRISD=0xF8;                              //3 bit thap nhat lam cong ra dieu khien
      		lenh_LCD(0x38);					 // dua ra LCD gia tri hang cot la 5*7
      		lenh_LCD(0x0C);		    		 // hien con tro
      	//	lenh_LCD(0x01);					 // xoa man hinh LCD
      ADCON0=0x00;                //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
      ADCON1=0x0E;                //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
      ADCON2bits.ACQT2=0;         //
      ADCON2bits.ACQT1=0;         //
      ADCON2bits.ACQT0=1;         //3 bits lua chon thoi gian thu thap du lieu TAD
      ADCON2bits.ADCS2=1;         //
      ADCON2bits.ADCS1=0;         //
      ADCON2bits.ADCS0=0;         //3 bits lua chon tan so chuyen doi
      Delay10TCY();
      
      ADCON0bits.ADON=1;
      while(1)
      {
      ADCON0bits.GO=1;
      Delay10TCYx(2);
      ADCON0bits.GO=0;
      adc = ReadADC();
      doC=(adc-558.558)/2.048;       // ADC 10 bit  tính toán giá tri
         lenh_LCD(0x01);
         delay(100);
       kq=(int)doC;
      
         data_LCD((int)doC);
         data_LCD('.');
        kq=(doC-kq)*100;
         data_LCD((unsigned char)kq);
         data_LCD('d');
         data_LCD('o');
         data_LCD('C');
         delay(100);
      
      }
      }

      cảm ơn mọi người!

      mạch mô phỏng ở file đính kèm
      http://www.data.webdien.com/free/dow...a5687f667cf9ad

      --------------------------------------------------------------------------------
      Xem bài viết cùng chuyên mục:

      Sửa lần cuối bởi eethn; 04-10-2011 lúc 21:22.

    2. #2
      Tham gia
      03-10-2011
      Bài viết
      12
      Cảm ơn
      0
      Được cảm ơn 6 lần, trong 5 bài

      Mặc định Ðề: adc trong của con Pic 18f4620 lập trình bằng C18

      Không xem được mạch của cậu rồi.
      - Kiểm tra hiển thị LCD 1 dữ liệu bất kỳ trước. Nếu LCD hiển thị được. Thì chuyển sang kiểm tra ADC.
      - Có thể do mạch hoặc do phần mềm. Bạn thử lấy 1 biến trở để đọc ADC về xem cấu hình đúng chưa? Nếu đọc đúng giá trị đưa về thì do mạch của cảm biến của bạn rồi.

      Chuyển file sang PDF mình xem mạch cho. Phần mềm thì tự cậu sửa nhé.

    3. Những thành viên đã cảm ơn achut vì bài viết hữu ích:


    4. #3
      Tham gia
      06-03-2011
      Bài viết
      30
      Cảm ơn
      10
      Được cảm ơn 5 lần, trong 5 bài

      Mặc định Ðề: adc trong của con Pic 18f4620 lập trình bằng C18

      e sửa lại code 1 tý rồi, file pdf mạch đây mọi người xem hộ e
      http://www.data.webdien.com/free/dow...7c4d85ce61f33b

      phần cấu hình adc e xem xét thấy cũng ổn,có lẽ tại code có vấn đề gì đó thôi

    5. #4
      Tham gia
      03-10-2011
      Bài viết
      12
      Cảm ơn
      0
      Được cảm ơn 6 lần, trong 5 bài

      Mặc định Ðề: adc trong của con Pic 18f4620 lập trình bằng C18

      Cái mạch này mình làm với Atmega8, bạn tham khảo nhé. Mình làm và chạy thật lâu rồi. Bạn thay bằng Pic18F là phần cứng ok đó.
      http://www.data.webdien.com/free/dow...0c7783dd00e1af

      Mạch có ít linh kiện thì mua về cắm test board làm thật luôn cho thick. Còn lại là kiểm tra code, bây giờ mà test lại mình pải cài MpLab nên hơi ngại. Microchip có 1 kho code demo, bạn kiếm cái ADC cho PIC18F đảm bảo chạy đó.

    6. #5
      Tham gia
      18-05-2010
      Địa chỉ
      Long Hải
      Bài viết
      1,565
      Cảm ơn
      226
      Được cảm ơn 907 lần, trong 605 bài

      Mặc định Ðề: adc trong của con Pic 18f4620 lập trình bằng C18

      Trích dẫn Gửi bởi eethn Xem bài viết
      e đang học con 18f4620,có làm mạch đo nhiệt độ dùng adc trong của pic hiển thị ra led 7 thanh hoặc lcd.Mọi người xem hộ xem lỗi ở đâu mà nó k hiển thị đc.E nghĩ là dữ liệu k truyền đc từ adc ra nhưng k hiểu vì sao.(E lập trình bằng C18)

      phần code hiển thị ra led 7 thanh:
      Code:
      #include "p18f4620.h"
      #include "delays.h"
      #include "adc.h"
      #pragma config OSC=HS, WDT=OFF
       
      const unsigned char dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
      int a,b,n,doC,dvi,chuc,tram;
      void convert(int a)
      {
      tram=a/100;
      a=a%100;
      chuc=a/10;
      dvi=a%10;
      }
      void hienthi() // quet led
      {
      for(n=0;n<10;n++)
      {
      PORTB=dig[dvi];
      PORTD=0x01;       //bat led 1
      Delay100TCYx(20);  // tre 100us
      PORTB=dig[chuc];
      PORTD=0x02;        // bat led 2
      Delay100TCYx(20);
      PORTB=dig[tram];
      PORTD=0x04;         // bat led 3
      Delay100TCYx(20);
      }
      }
       void main(void)
      {
      TRISB=0;  // chon cong B la cong ra
      TRISD=0;   // chon cong D la cong ra
      TRISAbits.TRISA0=1;  // chon cong A la cong vao
      ADCON0=0x00;                //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
      ADCON1=0x0E;                //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
      ADCON2bits.ACQT2=0;         //
      ADCON2bits.ACQT1=0;         //
      ADCON2bits.ACQT0=1;         //3 bits lua chon thoi gian thu thap du lieu TAD
      ADCON2bits.ADCS2=1;         //
      ADCON2bits.ADCS1=0;         //
      ADCON2bits.ADCS0=0;         //3 bits lua chon tan so chuyen doi
      Delay10TCY();
       
      ADCON0bits.ADON=1;
      while(1)
      {
      ADCON0bits.GO=1;
      Delay10TCYx(2);
      ADCON0bits.GO=0;
       
       
      b = ReadADC();
      doC = (b-558.558)/2.048;  //tùy ADC 8bit hay 10 bit  tính toán giá tri
      a = doC;
      convert((int)a);
      Delay10TCY();
       
      convert((int)a);
      hienthi(tram,chuc,dvi);
      }
      }

      và phần ra LCD:
      Code:
      #include "p18f4620.h"
      #include "delays.h"
      #include "adc.h"
      #pragma config OSC=HS, WDT=OFF
       
      char adc;
      long s; float doC;
      unsigned char li,lj;
       
      #define rs LATDbits.LATD0
      #define rw LATDbits.LATD1
      #define en LATDbits.LATD2
       
      void delay (unsigned char time )             // ham co tac dung delay thoi gian lon
          {
              for ( li=0 ; li<80; li++ )
              for ( lj=0 ; lj<time; lj++)
              {}
          }
       
       
          void lenh_LCD (unsigned char s)                // ham dua 1 lenh ra ngoai LCD
          {
              LATC=s;
              rs=0;                                    // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
              rw=0;
              en=1;
              delay(1);
              en=0;
              delay(1); 
          } 
       
       
          void data_LCD (unsigned char s)                // ham dua 1 lenh ra ngoai LCD
          {
              LATC=s;
              TRISD=0xF8 ;                               // cho 3 bit thap nhat duoc lam cong ra
              rs=1;                        // rs=0 thong bao rang gia tri truyen len ghi vao thanh ghi lenh
              rw=0;
              en=1;
              delay(1);
              en=0;
          }
      void main(void)
      {
      int kq;
      INTCON=0x00;
      TRISAbits.TRISA0=1;                      //cong A0 lam dau vao tu cam bien
      TRISC=0x00;                              //cong C lam cong ra du lieu
      TRISD=0xF8;                              //3 bit thap nhat lam cong ra dieu khien
              lenh_LCD(0x38);                     // dua ra LCD gia tri hang cot la 5*7
              lenh_LCD(0x0C);                     // hien con tro
          //    lenh_LCD(0x01);                     // xoa man hinh LCD
      ADCON0=0x00;                //bit0 cho phep chuyen doi,bit1 trang thai,bit2-5 chon kenh
      ADCON1=0x0E;                //bit0-3 chon che do analog hay digital,bit4-5 chon Vref+ va Vref-
      ADCON2bits.ACQT2=0;         //
      ADCON2bits.ACQT1=0;         //
      ADCON2bits.ACQT0=1;         //3 bits lua chon thoi gian thu thap du lieu TAD
      ADCON2bits.ADCS2=1;         //
      ADCON2bits.ADCS1=0;         //
      ADCON2bits.ADCS0=0;         //3 bits lua chon tan so chuyen doi
      Delay10TCY();
       
      ADCON0bits.ADON=1;
      while(1)
      {
      ADCON0bits.GO=1;
      Delay10TCYx(2);
      ADCON0bits.GO=0;
      adc = ReadADC();
      doC=(adc-558.558)/2.048;       // ADC 10 bit  tính toán giá tri
         lenh_LCD(0x01);
         delay(100);
       kq=(int)doC;
       
         data_LCD((int)doC);
         data_LCD('.');
        kq=(doC-kq)*100;
         data_LCD((unsigned char)kq);
         data_LCD('d');
         data_LCD('o');
         data_LCD('C');
         delay(100);
       
      }
      }

      cảm ơn mọi người!

      mạch mô phỏng ở file đính kèm
      http://www.data.webdien.com/free/dow...a5687f667cf9ad
      không biết bạn học trường nào mà học tới PIC18 rồi vậy và ngôn ngữ C18 nữa. thường thì các trường chỉ học PIC16 và ngôn ngữ CCS vì CCS rất dễ sử dụng. mình thỉ chỉ biết CCS nên không thể giúp bạn được rồi.
      Cao Văn Hưởng
      Email: vanhuongcao@gmail.com

    7. #6
      Tham gia
      06-03-2011
      Bài viết
      30
      Cảm ơn
      10
      Được cảm ơn 5 lần, trong 5 bài

      Mặc định Ðề: adc trong của con Pic 18f4620 lập trình bằng C18

      k có mạch nạp bác ạ, với lại mô phỏng có chút thành công thì mới làm mạch thật chứ.
      cái này chắc chắn là sẽ làm mạch thật nhưng chờ hoàn thiện cho tốt phần code cái đã.Đây là đề tài đồ án vi xử lý của bọn e ấy mà.Tổng thể nó là đo nhiệt độ hiển thị LCD lưu vào thẻ nhớ và truyền dữ liệu lên máy tính(tất nhiên có phần giao diện trên máy tính) sử dụng Pic 18f4620 ,lập trình bằng C18
      +++---o0o---+++
      Trích dẫn Gửi bởi caovanhuong Xem bài viết
      không biết bạn học trường nào mà học tới PIC18 rồi vậy và ngôn ngữ C18 nữa. thường thì các trường chỉ học PIC16 và ngôn ngữ CCS vì CCS rất dễ sử dụng. mình thỉ chỉ biết CCS nên không thể giúp bạn được rồi.
      e học bkhn ,học môn vi xử lý 2 .vi xử lý 1 học mcs 51 rồi.hì.
      Em cũng có tham khảo các bài về pic 16 và CCS nhưng cách viết trong CCS nói chung là khác c18

    8. #7
      Tham gia
      18-05-2010
      Địa chỉ
      Long Hải
      Bài viết
      1,565
      Cảm ơn
      226
      Được cảm ơn 907 lần, trong 605 bài

      Mặc định Ðề: adc trong của con Pic 18f4620 lập trình bằng C18

      Trích dẫn Gửi bởi eethn Xem bài viết
      k có mạch nạp bác ạ, với lại mô phỏng có chút thành công thì mới làm mạch thật chứ.
      cái này chắc chắn là sẽ làm mạch thật nhưng chờ hoàn thiện cho tốt phần code cái đã.Đây là đề tài đồ án vi xử lý của bọn e ấy mà.Tổng thể nó là đo nhiệt độ hiển thị LCD lưu vào thẻ nhớ và truyền dữ liệu lên máy tính(tất nhiên có phần giao diện trên máy tính) sử dụng Pic 18f4620 ,lập trình bằng C18
      +++---o0o---+++


      e học bkhn ,học môn vi xử lý 2 .vi xử lý 1 học mcs 51 rồi.hì.
      Em cũng có tham khảo các bài về pic 16 và CCS nhưng cách viết trong CCS nói chung là khác c18
      2 cách viết này là hoàn toàn khác nhau nên mình mới không giúp bạn được.
      cái này là đồ án môn vxl2 hay là đồ án tốt nghiệp vậy bạn. cái đề tài này chỉ khó cái giao tiếp với thể nhớ thôi còn lại hiển thị LCD, gửi dữ liệu lên máy tính thì quá bình thường.
      - cái mà hiển thị không được vì bạn nghĩ nó sai ở phần ADC thì bạn có thể gán cho a= 1 giá trị nào đó rồi cho hiển thị ra led 7 đoạn hoạc ADC, nếu hiển thị tốt thì bạn xem cấu hình lại ADC, cái C18 này nhìn vào không hiểu nên cũng chỉ gợi ý bạn sửa từng phần thôi.
      Cao Văn Hưởng
      Email: vanhuongcao@gmail.com

    9. Những thành viên đã cảm ơn caovanhuong vì bài viết hữu ích:


    10. #8
      Tham gia
      06-03-2011
      Bài viết
      30
      Cảm ơn
      10
      Được cảm ơn 5 lần, trong 5 bài

      Mặc định Ðề: adc trong của con Pic 18f4620 lập trình bằng C18

      đồ án môn học thôi bác ạ!
      sau khi xem xét kỹ datasheet thì e thấy cấu hình ADC k(hoặc chưa) có gì sai.Một số chân pic mặc định là analog cũng đã chọn lại là digital,chỉ cho chân ANA0 làm đầu vào từ cảm biến.Phần tính toán chuyển đổi từ ADC ra độ C như thế này:
      lm335 xuất ra điện áp 2.73V ở 0 độ C --> phải trừ đi nó.Giá trị của adc ở 2.73V là:(2.73*1023)/5=558.558
      suy ra doC=(adc-558.558)/2.048
      giá trị 2.048 có đc là do ADC 10 bit,Vref=5V, mỗi mức lượng tử = 5V/1024 = 4.883mV ==> mỗi độ C sẽ thay đổi 10mV/4.883mV=2.048 mức lượng tử.
      Hình như lỗi do thuật toán,lập trình C cũng mới học nên còn yếu .Hì

    11. #9
      Tham gia
      01-11-2009
      Bài viết
      9
      Cảm ơn
      4
      Được cảm ơn 2 lần, trong 2 bài

      Mặc định Ðề: adc trong của con Pic 18f4620 lập trình bằng C18

      kiểm tra lại phần hiển thị led nhé
      đẩy dữ liệu=> cho led 1 sang =>delay=> day du lieu=> cho led 2 sáng
      chu trình này sẽ làm led bị bóng ma.Trước khi đẩy dữ liệu lần 2 thì phải tắt led 1 trước.Tại sao cứ nghĩ thử đi.thôi giờ đi làm đã tối về online chém gió tiếp :))

    12. Những thành viên đã cảm ơn dangtuandat vì bài viết hữu ích:


    13. #10
      Tham gia
      06-03-2011
      Bài viết
      30
      Cảm ơn
      10
      Được cảm ơn 5 lần, trong 5 bài

      Mặc định Ðề: adc trong của con Pic 18f4620 lập trình bằng C18

      đúng rồi bác, khi chưa tắt led này mà đã truyền dữ liệu ra led kia nó sẽ bị chồng lên nhau,thanh nào bị trùng là nó k sáng cả mấy đèn luôn.E sửa rồi

    Trang 1 của 2 12 CuốiCuối

    Trả lời với tài khoản Facebook

    Các Chủ đề tương tự

    1. Thảo luận - Những vấn đề trong sử dụng năng lượng trong sinh hoạt dân dụng
      Bởi manh89 trong diễn đàn HỆ THỐNG NĂNG LƯỢNG MỚI
      Trả lời: 1
      Bài cuối: 20-08-2015, 09:59
    2. Trợ giúp - Phối hợp đóng lặp lại giữa 02 máy cắt trong sơ đồ 3/2 trong trạm biến áp 500kV
      Bởi agent007 trong diễn đàn Nhà máy điện - Trạm biến áp
      Trả lời: 1
      Bài cuối: 07-04-2014, 11:24
    3. Structure Tag trong Wincc và Supper Tag trong Intouch Wonderware
      Bởi khongbaogio trong diễn đàn SCADA - HMI
      Trả lời: 8
      Bài cuối: 08-06-2013, 16:04
    4. Trợ giúp - Xin bảng tra R và S trong phần kiểm tra thiết kế chiếu sáng trong nhà
      Bởi dcdien90 trong diễn đàn Hệ thống chiếu sáng
      Trả lời: 0
      Bài cuối: 28-09-2011, 09:29
    5. Lỗi trong graphic desiger trong wincc
      Bởi bichhien082008 trong diễn đàn SCADA - HMI
      Trả lời: 1
      Bài cuối: 18-04-2011, 22:52
    Văn Võ Trạng Nguyên
    Hắc Hiệp Đại Chiến Thánh Bài 2
    Đặc Cảnh Diệt Ma
    Khử Ma Đạo Trưởng
    Cương Thi Diệt Tà
    Sự Hình Thành Của Đế Chế Mông Cổ
    NHỮNG KHOẢNH KHẮC ĐÁNG NHỚ CỦA GIẢI GOLF PHÚ MỸ HƯNG 2016