Thông báo

Collapse
No announcement yet.

Help me !!!

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

  • Help me !!!

    E đang làm đồ án hiển thị Loadcell, viết dc cái chương trình sau, nhưng nó chỉ hiện dc số nguyên như 0, 1, 2... e mún hiện số thập phân như 1.25, 2.55 ... thì sửa như thế nào. C/tr viết bằng phần mềm WinAVR. Mọi ng` làm ơn chỉ dùm e, cảm ơn.

    #include <avr/io.h>
    #include <util/delay.h>
    #include "myLCD.h"

    #define AREF_MODE 0
    #define AVCC_MODE (1<<REFS0)
    #define INT_MODE (1<<REFS1)|(1<<REFS0)
    #define ADC_VREF_TYPE AREF_MODE

    uint16_t ADC_val;
    unsigned int val;
    uint16_t read_adc(unsigned char adc_channel){
    ADMUX|=adc_channel;
    _delay_ms(200);
    ADCSRA|=(1<<ADSC);
    loop_until_bit_is_set(ADCSRA,ADIF);
    return ADCW;
    }

    int main(void)
    {
    ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0);
    ADMUX=ADC_VREF_TYPE;
    init_LCD();
    while (1)
    {
    ADC_val=read_adc(0);
    val= ADC_val*(4.88/249)/0.4;

    clr_LCD();

    uint8_t dis[5];
    sprintf(dis,"%i",val);
    move_LCD(1,1);
    print_LCD(dis);
    _delay_ms(300);
    }
    }

  • #2
    Bạn muốn hiển thị ra số thập phân sử dụng WinAVR thì có thể sử dụng 1 trong 2 cách sau:
    Cách 1: Đơn giản nhất là bạn nhân kết quả thêm bội số của 10 và hiển thị ra theo cách của mình để đạt kết quả như mong muốn.
    Cách 2: Bạn hiển thị sử dụng hàm printf("%f", float) kết hợp với việc kết nối linker với thử viện float trong AVRstudio + WinAVR. Để biết nên làm thế nào, bạn dùng Google tra từ khóa "float + WINAVR" trong trang của Winavr có hướng dẫn cụ thể rồil

    Comment


    • #3
      Xin hỏi có ai còn cách nào cụ thể hơn ko, cụ thể nhất xin sửa trong đoạn code mình đã đưa lên. Cảm ơn.

      Comment


      • #4
        Nguyên văn bởi yeunhan777 Xem bài viết

        #include <avr/io.h>
        #include <util/delay.h>
        #include "myLCD.h"

        #define AREF_MODE 0
        #define AVCC_MODE (1<<REFS0)
        #define INT_MODE (1<<REFS1)|(1<<REFS0)
        #define ADC_VREF_TYPE AREF_MODE

        uint16_t ADC_val;
        unsigned int val;
        uint16_t read_adc(unsigned char adc_channel){
        ADMUX|=adc_channel;
        _delay_ms(200);
        ADCSRA|=(1<<ADSC);
        loop_until_bit_is_set(ADCSRA,ADIF);
        return ADCW;
        }

        int main(void)
        {
        ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0);
        ADMUX=ADC_VREF_TYPE;
        init_LCD();
        while (1)
        {
        ADC_val=read_adc(0);
        val= ADC_val*(4.88/249)/0.4;

        clr_LCD();

        uint8_t dis[5];
        sprintf(dis,"%i",val);
        move_LCD(1,1);
        print_LCD(dis);
        _delay_ms(300);
        }
        }
        Với đoạn code trên, biến Val bạn để là integer do đó khi tính toán, kết quả sẽ trả về số nguyên là bình thường. Phương án sửa trực tiếp vào code của bạn mà ko phải tác động nhiều tới là chuyển điện áp từ Vol sang MiliVol.

        Khi đó công thức có thể đổi như sau:
        Val = ADC_val*(4880/249)/0.4;
        Tuy nhiên nếu viết như thế này có thể xảy ra tràn nếu ADC_val lớn, khi đó bạn sửa lại 1 chút kết thành
        Val = ADC_val/249*12200;

        Nếu phương pháp trên không thỏa mãn yêu cầu của bạn, mình khuyên bạn nên sử dụng sprintf và float
        khi đó chỉ cần khai báo val thành dạng biến float
        và chỉnh WinAVR để in được biến float theo link sau:
        HTML Code:
        http://winavr.scienceprog.com/comment/28

        Comment


        • #5
          cảm ơn Auto_engine rất nhiều, mình sẽ thử xem sao

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X