Thông báo

Collapse
No announcement yet.

đọc nhiều kênh ADC pic16f887

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

  • đọc nhiều kênh ADC pic16f887

    Chào các bạn! Mình viết code đọc 4 kênh ADC hiển thị lên LCD, Trong chương trình con adc_convert() tham số truyền vào là kênh ADC đươc lựa chọn, nhưng mình chỉ đọc được kênh 0 thôi, không đọc được các kênh khác. Các bạn xem giúp mình với

    #include <htc.h>
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word

    #define rs 0
    #define e 1
    #define lcd_data PORTB
    #define rs_1 (PORTC|=(1<<rs))
    #define rs_0 (PORTC&=(~(1<<rs))
    #define pule_e (PORTC|=(1<<e); PORTC&=(~(1<<e))
    //ham chuyen doi adc
    unsigned int adc_convert (unsigned char channel)
    {
    int adc=0;
    ADCON0|= (channel<<3);
    ADCON0|= (1<<1);// bat dau chuyen doi
    while (ADCON0&0x04);// cho chuyen doi xong
    adc=ADRESH;
    adc<<=8;
    adc|=ADRESL;
    return adc;
    }
    //ham xuat lenh ra lcd
    void lcd_command(unsigned char command)
    {
    lcd_data=command;
    rs_0;
    pule_e;
    _delay(10000);
    }
    //ham xuat ki tu ra lcd
    void lcd_char (unsigned char chr)
    {
    lcd_data=chr;
    rs_1;
    pule_e;
    _delay(10000);
    }
    //ham hien thi 1 chuoi tren lcd
    void lcd_display(char row, char col, char*s)
    {
    switch (row)
    {
    case 0: lcd_command(0x80+col);
    break;
    case 1: lcd_command(0xC0+col);
    break;
    }
    while (*s!=0) lcd_char(*s++);
    }
    //ham khoi tao lcd
    void init_lcd()
    {
    lcd_command(0x38);
    lcd_command(0x0C);
    lcd_command(0x38);
    lcd_command(0x01);
    _delay(10000);
    }
    void main(void)
    {
    int temp;
    ANSEL=0xFF;
    ANSELH=0x00;
    TRISB=0x00;
    TRISC=0x00;
    TRISA=0xFF;
    ADCON0=0x01;
    ADCON1=0xB1;// Vref+ = AN3
    init_lcd();


    while(1)
    {
    temp=adc_convert(0);
    lcd_display(0,0,"nhietdo:");
    lcd_char((temp/100)+ 0x30);
    lcd_char(((temp%100)/10) + 0x30);
    lcd_char((temp%10) + 0x30);
    _delay(100000);
    };




    }

  • #2
    Nguyên văn bởi kingsun1991 Xem bài viết
    Chào các bạn! Mình viết code đọc 4 kênh ADC hiển thị lên LCD, Trong chương trình con adc_convert() tham số truyền vào là kênh ADC đươc lựa chọn, nhưng mình chỉ đọc được kênh 0 thôi, không đọc được các kênh khác. Các bạn xem giúp mình với

    #include <htc.h>
    __CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word

    #define rs 0
    #define e 1
    #define lcd_data PORTB
    #define rs_1 (PORTC|=(1<<rs))
    #define rs_0 (PORTC&=(~(1<<rs))
    #define pule_e (PORTC|=(1<<e); PORTC&=(~(1<<e))
    //ham chuyen doi adc
    unsigned int adc_convert (unsigned char channel)
    {
    int adc=0;
    ADCON0|= (channel<<3);
    ADCON0|= (1<<1);// bat dau chuyen doi
    while (ADCON0&0x04);// cho chuyen doi xong
    adc=ADRESH;
    adc<<=8;
    adc|=ADRESL;
    return adc;
    }
    //ham xuat lenh ra lcd
    void lcd_command(unsigned char command)
    {
    lcd_data=command;
    rs_0;
    pule_e;
    _delay(10000);
    }
    //ham xuat ki tu ra lcd
    void lcd_char (unsigned char chr)
    {
    lcd_data=chr;
    rs_1;
    pule_e;
    _delay(10000);
    }
    //ham hien thi 1 chuoi tren lcd
    void lcd_display(char row, char col, char*s)
    {
    switch (row)
    {
    case 0: lcd_command(0x80+col);
    break;
    case 1: lcd_command(0xC0+col);
    break;
    }
    while (*s!=0) lcd_char(*s++);
    }
    //ham khoi tao lcd
    void init_lcd()
    {
    lcd_command(0x38);
    lcd_command(0x0C);
    lcd_command(0x38);
    lcd_command(0x01);
    _delay(10000);
    }
    void main(void)
    {
    int temp;
    ANSEL=0xFF;
    ANSELH=0x00;
    TRISB=0x00;
    TRISC=0x00;
    TRISA=0xFF;
    ADCON0=0x01;
    ADCON1=0xB1;// Vref+ = AN3
    init_lcd();


    while(1)
    {
    temp=adc_convert(0);
    lcd_display(0,0,"nhietdo:");
    lcd_char((temp/100)+ 0x30);
    lcd_char(((temp0)/10) + 0x30);
    lcd_char((temp) + 0x30);
    _delay(100000);
    };




    }
    tôi không hiểu cách viết này. tuy nhiên bạn tham khảo cái này viết cho bằng CCS không biết có thể áp dụng cho bạn được không.
    Code:
       set_ADC_channel(0); // chọn đọc giá trị ADC kênh 0
       delay_us(10); // trì hoãn 10us
       adc1=read_adc(); // gán giá trị ADC vào biến adc1
       set_ADC_channel(1);
       delay_us(10);
       adc2=read_adc();
       set_ADC_channel(2);
       delay_us(10);
       adc3=read_adc();
       set_ADC_channel(3);
       delay_us(10);
       adc4=read_adc();

    Comment


    • #3
      Nguyên văn bởi caovanhuong Xem bài viết
      tôi không hiểu cách viết này. tuy nhiên bạn tham khảo cái này viết cho bằng CCS không biết có thể áp dụng cho bạn được không.
      Code:
         set_ADC_channel(0); // chọn đọc giá trị ADC kênh 0
         delay_us(10); // trì hoãn 10us
         adc1=read_adc(); // gán giá trị ADC vào biến adc1
         set_ADC_channel(1);
         delay_us(10);
         adc2=read_adc();
         set_ADC_channel(2);
         delay_us(10);
         adc3=read_adc();
         set_ADC_channel(3);
         delay_us(10);
         adc4=read_adc();
      Đây là môn học của mình, vài bữa nữa thi rồi, thi người ta không cho sữ dụng bất cứ hàm nào trừ hàm delay(). Vì thế nên dùng trình biên dịch nào cũng vậy hà bạn

      Comment


      • #4
        Nguyên văn bởi kingsun1991 Xem bài viết
        Đây là môn học của mình, vài bữa nữa thi rồi, thi người ta không cho sữ dụng bất cứ hàm nào trừ hàm delay(). Vì thế nên dùng trình biên dịch nào cũng vậy hà bạn
        - ý là tôi muốn nói đến cái thuật toán cho bạn. bạn chọn kệnh để đọc sau đó lưu vào 1 biến, sau đó chọn kênh 2 và lưu vào biến 2 và cuối cùng là chọn kênh thứ 4 và lưu vào biến 4.
        - cái của bạn viết hình như là mới đầu đọc kênh 0 sau đó hiển thị ra LCD, chờ 10s sau lại đọc kênh 1 rồi hiển thị ra LCD và lần lượt là 4 kênh phải không.

        Comment


        • #5
          um đúng, đọc rồi hiển thị luôn, sau đó mới tiếp tục kênh khác

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X