اطلاعیه

Collapse
No announcement yet.

جداسازی اعداد از متن در C یا c++ برای میکرو AVR

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    سلام
    بالاخره موفق شدم حتما تو ساخت هم مشکلات فراوانی پیش خواهد امد یه نمونه کوچک خواهم ساخت مثلا من از کریستال داخلی استفاده می کنم ولی توصیه شده از کریستال بیرونی استفاده بشه تو پروژه usart ولی من باهاش مشکل تنظیم دارم

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    از تمامی دوستان در کانال کد ویژن هم سپاسگزارم
    ممنون
    جدیدترین ویرایش توسط flightsazan; 2021/08/31, 03:20.

    یک دیدگاه بنویسید:


  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    سلام
    در نمایش روی سون سگمنت دچار مشکل شدم البته در محیط پروتئوس نمی دونم در دنیای واقعی هم اینطور خواهد بود
    وقتی مثلا در سگمنت3 از سمت راست می خواهم ممیز را روشن کنم عدد نمایش داده شده بهم می زیزه

    یک دیدگاه بنویسید:


  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    با پیشنهاد بالا تونستم عدد رو نشان بدم فقط مثلا تو دو رقم می خواهم نقطه ممیز رو نشون بدم با روشن کردن ممیز هر سونسگمنت در پروتئوس ان سون سگمنت عددش بهم می ریزه

    یک دیدگاه بنویسید:


  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    دوستان پیشنهادی که دادند نادیده گرفتن اعشار هست

    یک دیدگاه بنویسید:


  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    با سلام
    اگر رشته ارسالی را بررسی کردی و محل شروع و پایان کاراکتری وزن در صفر و ماکزیمم یکسانه اینقدر خودت را درگیر اعشار نکن. اون قسمت رشته که وزن را شامل میشه از رشته جدا کن
    سلام
    مهندس جان منظور من هم همین هست جدا کردن عددهام با توجه به اعشاری بودن از رشته این پست برای همین شروع کردم (عددها رو می خواهم رو سون سگمنت نمایش بدم)ممنون


    دلیل: ادغام دو پست برای جلوگیری از اسپم

    توجه شما رو جلب کنم در حالت صفر هم عدد خروجی اعشار هست بدین صورت:
    کد:
    0.00
    دلیل: ادغام دو پست برای جلوگیری از اسپم

    برای نمایش با سونسگمنت این نوشتم برای اینتجر ها ولی اعشار رو نمی تونم نمایش بدم:
    کد:
    [FONT=Yekan]#include <mega32.h>[/FONT]#include <stdio.h>
    #include <string.h>
    #include <delay.h>
      flash char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
      int num_p2[8];
      long int num_p=[SIZE=4][COLOR=#00ffff]123456789[/COLOR][/SIZE]; ///akar adad in tor bashad khta midahad--012345678
         //float fn =1234.567;
    
    
    void cal(void);
    void main(void)
    {
    int i=0;
    //long int num_p=12345678;
    char refreshing=0x01;
    DDRA=0xff;   // output port A&B
    DDRB=0xff;
    //PORTC=num[0];       
        
    //UCSRA=0x00;
    UCSRB=0x18; // USART Receiver: On
    UCSRC=0x86; //8 Data, 1 Stop, No Parity
    UBRRH=0x00;
    UBRRL=0x33; // USART Baud rate: 9600
    
    
    
    
    
    
    
    
    while (1)
          {
          // Place your code here 
          cal();
          PORTB =~ refreshing;
          refreshing = refreshing<<1;
          PORTA=num[num_p2[i]];
          i++;      
          if (i==8)
          i=0;
          
          if (refreshing == 0x00)
          refreshing= 0x01;
          delay_ms(5);
          } 
    }
        
       
     void cal(void) {
        num_p2[7]=(num_p%10);
        num_p2[6]=(num_p/10)%10;
        num_p2[5]=(num_p/100)%10;
        num_p2[4]=(num_p/1000)%10;
        num_p2[3]=(num_p/10000)%10;
        num_p2[2]=(num_p/100000)%10;
        num_p2[1]=(num_p/1000000)%10;
        num_p2[0]=(num_p/10000000)%10;
        
    }
    دلیل: ادغام دو پست برای جلوگیری از اسپم

    اگر در همین حالت صفر در سمت چپ باشد کامپایلر خطا می دهد
    01234567

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    تو اینترنت این و دیدم:
    کد:
    [FONT=Yekan]void cal(float input) {[/FONT]input*=10;
    a=(int)input%10;
    b=(int)input/10%10;
    c=(int)input/100%10;
    d=(int)input/1000;
    }
    اینها که اینتجر هستند چطور اعشار رو نمایش خواهند داد الان باید قسمت اعشار حذف بشه!
    جدیدترین ویرایش توسط flightsazan; 2021/07/19, 02:48.

    یک دیدگاه بنویسید:


  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    سلام مهندس جان کاملا درسته ولی علت امر اینه که کد ویژن برای دستورات دیگه عمل نمی کنه و یا خطا میگیره مثل fgets
    ممنون

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    راستی یادم رفت منظور من بیشتر فقط تست دریافت و نمایش بود

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    راستی چطور همین دریافت ها بصورت آنلاین چطور تو یک رشته بیارم که در سونسگمنت نمایش بدم عددها از صفر تا نه و ممیز هم هست از همراهیتون سپاسگزارم

    یک دیدگاه بنویسید:


  • A.I.E
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    نوشته اصلی توسط flightsazan نمایش پست ها
    از دستور زیر استفاده می کنم ولی کار نمی کند:
    کد:
    [FONT=Yekan] while (1)[/FONT]    {               
        char str[];///= "sd      0.45g";
        
         data= getchar();
         
         sscanf(str,"%c", data );
         // gets(*str);  
         puts(str);  
          putchar(0X0d);          
    [FONT=Yekan]      printf("your data input%s: ",str);
    [/FONT]
    ,ولی در عمل اتفاقی نمی افتد
    ممنون

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    راستی امروز ترازو رو بررسی کردم در وزن صفر و ماکزیمم گرمی است و روش نمایش همانطور هست که قبلا ذکر کردم

    باسلام.
    ;کد شما به نظر نباید درست کار کنه، چون اول آوردید یک رشته تعریف کردید به نام str و بعد با استفاده ازgetchar اومدید یک کاراکتر دریافت کردید و در متغیر دیتا که تعریف نشده ریختید!
    تا اینجای کار چند تا اشکال وجود داره:اولا متغیر بهتره داخل سوپرلوپ تعریف نشه دوما با استفاده از getchar میشه فقط یک کاراکتر دریافت کرد همچنین این سری توابه به دلیل مشکلات بافر اورفلو به کل غیراستاندارد هستن و به جای اونها باید از fgets یا fputs استفاده کرد.سوما کاراکتر دریافتی در str ذخیره نشده.
    در بخش sscanf شما فرمت رو به کل اشتباه نوشتید و %c به معای کاراکتر هست و فرمت باید به این شکل میبود:

    sscanf(str,"%*s%f%*s",&data)
    فرمت %s به معنای رشته هست و ستاره قرار گرفته در پشت اون یعنی اون رشته رو نادیده بگیر.برای g بعد عدد داخل دیتای شما میشه از %*c استفاده کرد.
    جدیدترین ویرایش توسط A.I.E; 2021/07/18, 13:30.

    یک دیدگاه بنویسید:


  • znasim
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    - اعشار رو باید جدا کنید از رشته
    جدیدترین ویرایش توسط znasim; 2021/07/18, 09:55.

    یک دیدگاه بنویسید:


  • evergreen
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    نوشته اصلی توسط flightsazan نمایش پست ها

    راستی امروز ترازو رو بررسی کردم در وزن صفر و ماکزیمم گرمی است و روش نمایش همانطور هست که قبلا ذکر کردم
    با سلام
    اگر رشته ارسالی را بررسی کردی و محل شروع و پایان کاراکتری وزن در صفر و ماکزیمم یکسانه اینقدر خودت را درگیر اعشار نکن. اون قسمت رشته که وزن را شامل میشه از رشته جدا کن.

    یک دیدگاه بنویسید:


  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    از دستور زیر استفاده می کنم ولی کار نمی کند:
    کد:
    [FONT=Yekan] while (1)[/FONT]    {               
        char str[];///= "sd      0.45g";
        
         data= getchar();
         
         sscanf(str,"%c", data );
         // gets(*str);  
         puts(str);  
          putchar(0X0d);          
    [FONT=Yekan]      printf("your data input%s: ",str);
    [/FONT]
    ,ولی در عمل اتفاقی نمی افتد
    ممنون

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    راستی امروز ترازو رو بررسی کردم در وزن صفر و ماکزیمم گرمی است و روش نمایش همانطور هست که قبلا ذکر کردم

    یک دیدگاه بنویسید:


  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    الان یه موضوع جالب دیدم ولی کار نمی کنه:
    سایت کد ویژن:
    اعلام کرده :
    V3.16 Commercial Release
    • Compiler
      • Added floating point support in (s)scanf. It can be enabled in the Project|Configure|C Compiler|Code Generation|(s)scanf options menu.
      • Added support for the SSD1306 OLED display controller, with code examples.
      • Added a new enhanced function parameter passing Mode 2 that allocates the 1 or 2 byte function parameter(s) to register(s) inside the function, allowing further code size reduction and increasing program execution speed. It can be enabled in the Project|Configure|C Compiler|Code Generation|Enhanced Parameter menu. If this option is enabled for older projects, that use C functions written using inline assembly, these functions must be enclosed between #pragma dstack_par+ and #pragma dstack_par- directives, in order to force using the old parameter storage Mode 1 in the data stack.
      • Improved the code generation for inline functions.
      • Made various improvements in the code generator.
      • Added support for generating ELF production files for device programming in Atmel Studio.
      • Added the #pragma fuses and #pragma lock_bits directives to enable setting the fuses and lock bits from the source file and storing them in the ELF file.
      • Added support for programming the Moteino boards from www.lowpowerlab.com/Moteino.
      • Fixed: an exception occured in the Atmel Studio extension if programming errors occured during program uploading to an Arduino board.

    • CodeWizardAVR
    • Fixed: in the code generated for ATtiny441/841 chips, the REMAP register must be initialized before enabling the USART0. Otherwise it will not have any effect.
    • Fixed: in the CodeWizardAVR generated code for ATtiny441/841 chips, the REMAP register must be initialized before enabling the SPI. Otherwise it will not have any effect.
    • Added PRR register initialization in the code generated for the ATtiny441/841 chips.
    • Fixed: The CodeWizardAVR for Xmega chips dind't place the _ALTERNATE_GETCHAR_ and _ALTERNATE_PUTCHAR_ macro definitions before #include <stdio.h> when alternate versions of the getchar and putchar functions were defined.
    • Added the possibility to load and save ELF production files.
    • Chip Programmer
    دلیل: ادغام دو پست برای جلوگیری از اسپم

    تو این ورژن sscanf اعشار رو میشناسه

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    کد:
    http://www.hpinfotech.ro/cvavr-revision3.html
    دلیل: ادغام دو پست برای جلوگیری از اسپم

    کرک نسخه جدیدش نیست
    3.45

    یک دیدگاه بنویسید:


  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    درسته:
    کد:
    data = getchar();
    حال می خواهم بریزم تو این مجددا:
    کد:
    char data[] = data;
    نمیشه-
    ممنون

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    مشکل اینه که برای ورود دیتا گزینه تعریف شده این دستور است:
    بالای بلوک یابالای تابع اصلی:
    کد:
    unsigned char data=0;
    دلیل: ادغام دو پست برای جلوگیری از اسپم

    ولی انچه من می خواهم این است:
    کد:
    char data[] = "ss     2345.56g";
    جدیدترین ویرایش توسط flightsazan; 2021/07/15, 03:10.

    یک دیدگاه بنویسید:


  • evergreen
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    نوشته اصلی توسط flightsazan نمایش پست ها
    سلام
    ...
    نمی دونم با این روش میشه دیتا رو درون گیومه قرار داد
    با سلام
    وقتی متغیری میخواهید تعریف کنید که از نوع رشته یا به عبارتی آرایه کاراکتری باشه برای اینکه کامپایلر متوجه بشه باید در دو طرف اون گیومه بگذارید. ولی وقتی شما دیتا را از پورت سریال میخوانید طبیعتا باید قبلا برای آن بافری از نوع char تعریف کرده باشید که دیتای دریافتی درون آن قرار بگیرد. در اینحالت دیگر نیازی نیست که خودتان گیومه به آن اضافه کنید.

    یک دیدگاه بنویسید:


  • flightsazan
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    سلام
    اول ممنون در حال یادگیری اتمل هستم.
    دوم منظورم یه تابع نوشتم دارای وایل بود بعد چون تابه اصلی هم وایل داره اجراش دوتا یکی متوقف میشه
    سوم چطور می تونم رشته دریافتی از پورت سریال رو داخل گیمه قرار بدم
    علت:
    کد:
    char str[] =  "sd       2234.453g";
    بخودی خود صحیح هست ولی وقتی می خواهم عدد ثابت بهش ندم و از ترمینال که من تایپ می کنم دیتا بگیره مشکل دار میشه
    مثلا له این شکل:
    کد:
    char str[] = getchar();
    دلیل: ادغام دو پست برای جلوگیری از اسپم

    ظاهرا هر دو تا char هستند

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    (data type) expression
    حال برای آنکه نقش اپراتور cast را بهتر متوجه شوید، به نتیجه و عملکرد دو مجموعه دستورهای زیر توجه کنید.
    مثال اول مثال دوم
    float x ; short int x ;
    printf ("%d\n",(int)x) ; printf ("%s\n",(char)x) ;

    در مثال اول برای متغیر x که از نوع float اعلان شده است، 4 بایت حافظه پیش*بینی می*شود. ولی در نتیجه اجرای دستور printf سطر دوم، به دلیل دستور (int)x مقدار آن به نوع int تبدیل می*گردد و نمایش داده می*شود. بنابراین، اگر برای مثال محتوای حافظه به*صورت
    0.26 E+7
    باشد، مقدار 2600000 نمایش داده خواهد شد.
    همین*طور در مثال دوم برای متغیر x که از نوع short int اعلان شده است، 2 بایت حافظه پیش*بینی می*شود، ولی درنتیجه اجرای دستور printf سطر دوم، به دلیل (char)x مقدار آن به نوع کاراکتر تبدیل می*گردد و محتوای دو بایت حافظه مزبور به*صورت یک رشته دوبایتی نمایش داده می*شود. به همین دلیل است که در فرمت چاپ مقدار متغیر مزبور، از فرمت "%s" که برای رشته است استفاده شده است. حال اگر برای مثال محتوای حافظه مربوط به متغیر x به صورت 1 2 3 4 باشد، موقع نوشتن به صورت رشته "1 2 3 4" چاپ می*شود.
    در اینجا به اختصار یادآور می*شویم که فرمتهای "%s", "%c", "%f", "%d" به ترتیب برای متغیرهای از نوع مقادیر صحیح، اعشار، کاراکتر و رشته به کار می*روند.
    این تو اینترنت دیدم

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    نمی دونم با این روش میشه دیتا رو درون گیومه قرار داد

    یک دیدگاه بنویسید:


  • hossein.m98
    replied
    پاسخ : جداسازی اعداد از متن در C یا c++ برای میکرو AVR

    نوشته اصلی توسط flightsazan نمایش پست ها
    سلام مهندس جان تو کد ویژن وقتی %f هست هیچکاری اتفاق نمی افته حتی خطا هم نمی گیره.

    دلیل: ادغام دو پست برای جلوگیری از اسپم

    راستی سوالی دارم:
    همزمان تو نرم افزار دوتا while باشه با اجرا شدن اولی دومی از کار می افته این راحلش چیه ایا باید از اینتراپت خارجی استفاده کرد
    خطا نمیگیره چون از نظر قواعد نحوی مشکلی وجود نداره. اگر قرار به خطا باشه هم خطای هنگام اجراس که توی میکروکنترلر نمیشه دیدش.
    بعدشم من و دوستان بارها گفتیم کدویژن کلا به درد نمیخوره و انتظاری ازش نباید داشت. خوبه خودتم دیدی scanf کدویژن اعشاری نداره؛ دیگه چه اصراری داری از این شبه کمپایلر بیمار استفاده کنی؟؟؟ یا دنبال راه دیگه باش، یا اگر میخوای حتما scanf استفاده کنی برو روی یک کمپایلر درست حسابی.
    در مورد دوتا while هم، دوتا while داریم تا دوتا while! دوتا while چه شکلی منظورته؟؟؟ میکروکنترلر AVR تک هسته ایه و این معنیش اینه در هر لحظه تنها یک خط برنامه اجرا میشه. نباید انتظار داشته باشی هیچ دو خطی که حتی کنار هم هستن در یک لحظه با هم اجرا بشن.

    یک دیدگاه بنویسید:

لطفا صبر کنید...
X