نويسنده موضوع: مشکل در نمایش اعداد اعشاری در AVRStudio - ADCxmega  (دفعات بازديد: 889 بار)

0 کاربر و 1 مهمان درحال ديدن موضوع.

آفلاين ARM-mohsen-AVR

  • کاربر ساده سطح اول
  • *
  • تشکر
  • -اهدايي: 43
  • -دريافتي: 23
  • ارسال: 83
  • عاشق الکترونیکم
    • دانشجوی کارشناسی الکترونیک
با سلام
وقتی که از ADC مقادیر رو می خونم اون رو در یک متغیر float قرار می دم و بعد با استفاده از تابع sprintf مقادی رو روی lcd نماش می دهم ولی اعشاری را نشون نمیده...به صورت 212.00000
اگه میشه راهنمایی کنید. در ضمن با تغییر متغییر به double بازهم تغییری در خروجی ایجاد نشد.میکرو هم xmega32a4
این هم برنامه :
#include <avr/io.h>
#include "lcd.h"
#include <avr/delay.h>
#include <stdio.h>
#include "avr_compiler.h"
#include "adc_driver.h"
#define ADC_INPUT ADC_CH_MUXPOS_PIN1_gc

int main(void)
{
    float ADC_result;
    char lcd_buff[20];
    lcd_init(LCD_DISP_ON);
    ADC_CalibrationValues_Load(&ADCA);
    ADC_ConvMode_and_Resolution_Config(&ADCA, ADC_ConvMode_Unsigned, ADC_RESOLUTION_12BIT_gc);
    ADC_Reference_Config(&ADCA, ADC_REFSEL_VCC_gc);
    ADC_Prescaler_Config(&ADCA, ADC_PRESCALER_DIV8_gc);
    ADC_Ch_InputMode_and_Gain_Config(&ADCA.CH1,ADC_CH_INPUTMODE_SINGLEENDED_gc,ADC_CH_GAIN_1X_gc);                           
    ADC_Ch_InputMux_Config(&ADCA.CH1, ADC_INPUT, 0);
    ADC_Enable(&ADCA);
    ADC_Wait_32MHz(&ADCA);
    lcd_home();
    lcd_puts("ADC0.1 LCD XMEGA");
    _delay_ms(3000);
    lcd_clrscr();
    while(1)
    {
        ADC_Ch_Conversion_Start(&ADCA.CH1);
        while(!ADC_Ch_Conversion_Complete(&ADCA.CH1));
        ADC_result = ADC_ResultCh_GetWord(&ADCA.CH1);   
        sprintf(lcd_buff,"ADC=%4.4f",ADC_result);
        lcd_gotoxy(0,1);
        lcd_puts(lcd_buff);
        _delay_ms(500);
        lcd_clrscr();
    }

آفلاين رضا بابایی

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 516
  • -دريافتي: 180
  • ارسال: 342
  • mrh سابق
داخل OPTION برنامه ای که داری مینویسی برو و تنظیمات مربوط به تابع Sprintf رو روی float بزار.
بگذارعشق خاصیت تو باشد نه رابطه خاص تو باکسی
موفقيت پيش رفتن است نه به نقطه ي پايان رسيدن
نلسون ماندلا

آفلاين ARM-mohsen-AVR

  • کاربر ساده سطح اول
  • *
  • تشکر
  • -اهدايي: 43
  • -دريافتي: 23
  • ارسال: 83
  • عاشق الکترونیکم
    • دانشجوی کارشناسی الکترونیک
با سلام
این تنظیمات رو واسه sprintf تو avrstudio انجام دادم ولی بازم جواب نمیده . درضمن تو avrstudio جایی نیست مانند کدویژن که می رفتیم روی FLOAT قرار می دادیم

آفلاين مجتبي-

  • کاربر حرفه ای سطح اول
  • *
  • تشکر
  • -اهدايي: 1103
  • -دريافتي: 1491
  • ارسال: 1482
با سلام
اگه از AVRSTUDIO 5 استفاده میکنید من تو این جا توضیح دادم :
کاربران مهمان مجاز به مشاهده لینک ها نیستند. لطفا ثبت نام نمایید. ثبت نام -- ورود
5. استفاده از تابع sprintf برای تبدیل مقادیر اعشاری(flaot) به رشته :
خوب اگر قبلا با avr studio کار کردید حتما میدونید که باید چیکار کنید ، اما من رو که خیلی سرکار گزاشت تا اینکه با کمک یکی از دوستان در انجمن ایران میکرو به نام " صادق محمدي "تونستم مشکلم رو حل کنم گفتم بد نیست که این مسئله رو توی این تایپیک هم عنوان کنم .
به جزئیات اشاره نمیکنم چون خودمم زیاد نمیدونم ؛
فرض کنید می خواهیم عدد 13.2634124 رو که در یک متغیر از نوع float هست رو با استفاده از دستور sprintf تبدیل به رشته و در ادامه بر روی lcd نمایش بدیم ، برای این کار برنامه زیر رو در نظر بگیرید :
 
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <stdio.h>
#include "lcd.h"

void main(void)
{
   char buffer[7];
    float  num=13.2634124;
   
   
   lcd_init(LCD_DISP_ON);
   lcd_clrscr();
   lcd_home();         
   sprintf(buffer,"%6.3f", num);
   lcd_puts(buffer);
    _delay_ms(4000);
             
   while(1);         
}
خوب برنامه که کاملا مشخصه چی به چیه ، اما یکسری تنظیمات رو باید مثل codvision و iar انجام بدیم تا بتونیم متغیر های از نوع float رو تبدیل به رشته کنیم ، کار هایی که باید انجام بدیم به ترتیب زیر هست :

1. alt+f7  رو بزنید تا وارد سند تنظیمات برنامه بشید .
2. برید به برگه toolchain
3. حالا از  شاخه avr/gnu c linker برید به زیر شاخه  libraries  بعد با کلیک بر روی add در قسمت بالایی و به ترتیب موارد libprintf_flt.a  و libm.a اضافه کنید ،به ترتیبی که در شکل زیر مشاهده می کنید :


4.  حالا از  شاخه avr/gnu c linker برید به زیر شاخه miscellaneous و سپس در فیلد other linker flags فلگ های : -Wl,-u,vfprintf -lprintf_flt به ترتیبی که در شکل زیر مشاهده میکنید وارد کنید :


5. تغییرات انجام شده رو سیو کنید و برنامه رو دوباره کامپایل کنید .


پایان قسمت چهارم

آفلاين ARM-mohsen-AVR

  • کاربر ساده سطح اول
  • *
  • تشکر
  • -اهدايي: 43
  • -دريافتي: 23
  • ارسال: 83
  • عاشق الکترونیکم
    • دانشجوی کارشناسی الکترونیک
با تشکر از دوست عزیز این کارو قبلا انجلام دادم برنامه کامپایل میشه و روی LCD مقادیر اعشاری را نشون نمیده مثل : 234.00000 اعشاری را جدا می کنه ولی به صورت صفر  نمایش می ده ...

آفلاين رضا بابایی

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 516
  • -دريافتي: 180
  • ارسال: 342
  • mrh سابق
این تیکه رو :
sprintf(lcd_buff,"ADC=%4.4f",ADC_result);
به این صورت بنویس:
sprintf(lcd_buff,"ADC=%4.4f",ADC_result*1.0);
بگذارعشق خاصیت تو باشد نه رابطه خاص تو باکسی
موفقيت پيش رفتن است نه به نقطه ي پايان رسيدن
نلسون ماندلا

آفلاين ARM-mohsen-AVR

  • کاربر ساده سطح اول
  • *
  • تشکر
  • -اهدايي: 43
  • -دريافتي: 23
  • ارسال: 83
  • عاشق الکترونیکم
    • دانشجوی کارشناسی الکترونیک
با سلام به دوستان
کسی نمی دونه مشکل از کجاست ؟
من فکر می کنم چون تابعی که خروجی رو می گیریم word هستش و نمیشه به اعشاری تبدیل کرد ...
ایا راهی است که به اعشاری تبدیل بشه ؟
 :angry: :angry: :angry: :angry:

آفلاين ARM-mohsen-AVR

  • کاربر ساده سطح اول
  • *
  • تشکر
  • -اهدايي: 43
  • -دريافتي: 23
  • ارسال: 83
  • عاشق الکترونیکم
    • دانشجوی کارشناسی الکترونیک
کسی نیست یه راهنمایی کنه ///////

آفلاين رضا بابایی

  • کاربر کامل سطح اول
  • *
  • تشکر
  • -اهدايي: 516
  • -دريافتي: 180
  • ارسال: 342
  • mrh سابق
ضرب در 1.0 کن. بالاتر گفته بودم.
بگذارعشق خاصیت تو باشد نه رابطه خاص تو باکسی
موفقيت پيش رفتن است نه به نقطه ي پايان رسيدن
نلسون ماندلا