NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3399 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 10 از 10

موضوع: خطا در برنامه تایمر(مشکل با lcd کاراکتری)

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض خطا در برنامه تایمر(مشکل با lcd کاراکتری)

    سلام دوستان

    من از یکی از تاپیک ها یک برنامه تایمر دانلود کردم که به این صورت هستش که هر یک ثانیه وقفه ایجاد میشه و هر 5 ثانیه یکی از پایه ها رو تاگل میکنه .این برنامه رو تست کردم به درستی جواب داد .حالا میخوام به برنامه lcd کاراکتری اضافه کنم و مقدار cnt رو روش نمایش بدم.ولی وقتی lcd رو اضافه میکنم خطای زیر رو میگیره هرچی سعی کردم نتونستم ایرادش رو بفهمم.

    برنامه رو پیوست کردم ممنون میشم بگین چطوری خطا رو برطرف کنم .

    خطا:
    prj.axf: Error: L6200E: Symbol GPIO_InitStructure multiply defined (by lcd4bit.o and main.o).
    فايل هاي پيوست شده فايل هاي پيوست شده

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    کاربر فعال rozeh آواتار ها
    تاریخ عضویت
    Mar 2013
    نوشته ها
    198
    تشکر
    27
    تشکر شده 176 بار در 104 پست

    پیش فرض

    به نظر شما دوبار متغیر ساختار GPIO_InitStructure رو تعریف کردید. یکیشو پاک کنید.

  4. تشکرها از این نوشته :


  5. #3
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    ممنون بابت پاسختون.
    بله اشتباه شده پاک کردم ولی مشکل به این خاطر نیست خطا همچنان همون قبلی هستش .

  6. #4
    کاربر فعال rozeh آواتار ها
    تاریخ عضویت
    Mar 2013
    نوشته ها
    198
    تشکر
    27
    تشکر شده 176 بار در 104 پست

    پیش فرض

    من برنامه شما رو از لحاظ کار کردن چک نکردم ولی چند مورد اشتباه دیدم که فکر میکنم اگه اینجوری فایل main.c شما باشه درست کار کنه:
    کد:
    #include "stm32f10x.h"
    #include <stdio.h>
    //#include "lcd4bit.h"
    
    GPIO_InitTypeDef GPIO_InitStructure;
    
    int a=0;
    //int timerValue;
    //char s[16];
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    int main(void){
        
    /********************** GPIO configuration*********************************/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB1Periph_TIM2, ENABLE);
    
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     
    GPIO_Init(GPIOA, &GPIO_InitStructure);            
        
        //**************config NVIC************************
        
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
        //**************timer config*****************
        
    TIM_TimeBaseStructure.TIM_Period = 1000; // 
    TIM_TimeBaseStructure.TIM_Prescaler = 36000 - 1; // 
    TIM_TimeBaseStructure.TIM_ClockDivision = 1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    
    /* TIM IT enable: for overflow  */
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    
    /* TIM2 enable  */
    TIM_Cmd(TIM2, ENABLE);
    while(1);//loop : when we dont have any intrrupt , thise code runing !
    
    }
        
            /***************** Timing ovf function********************* */
    
    
    
        
    void TIM2_IRQHandler(void)
    {
        a++;// with each interrupt , a=a +1
    //     timerValue = TIM_GetCounter(TIM2);
    //     sprintf(s,"input:%d",timerValue);
    //     set_cursor(1,1);
    //     lcd_putsf(s);
    
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//reset timer flag
    
    }
    if (a>=5)// each 5 second , pinD1 toggled !
    {
                GPIOA->ODR ^= GPIO_Pin_2;}// toggle code
    if (a>5){
    a=0;}
    
    
    }

  7. تشکرها از این نوشته :


  8. #5
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    برنامه شما رو کپی کردم ولی همچنان خطا وجود داره :

    .\prj.axf: Error: L6200E: Symbol GPIO_InitStructure multiply defined (by lcd4bit.o and main.o).
    Not enough information to list image symbols.
    Not enough information to list the image map.
    Finished: 2 information, 0 warning and 1 error messages.

  9. #6
    کاربر فعال rozeh آواتار ها
    تاریخ عضویت
    Mar 2013
    نوشته ها
    198
    تشکر
    27
    تشکر شده 176 بار در 104 پست

    پیش فرض

    عجیبه. مال من کامپایل میشه. البته فایل lcd4bit.c که سمت چپ توی قسمت فایل ها هستش(زیر مجموعه Source) رو هم حذف کردم. اینم فایل هگزه.
    برید جایی که برنامه تون رو سیو کردید. دو فایل lcd4bit.o و main.o رو حذف کنید و دوباره کامپایل کنید. ببینید درست میشه.


    http://upload.tehran98.com/upme/uplo...0b263bcbd1.zip

  10. تشکرها از این نوشته :


  11. #7
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    خیلی خیلی ممنونم بابت راهنماییتون.
    کد ها رو یکم مرتب کردم خطا برطرف شد خودم نمیدونم چیکار کردم !!!و خطا برای چی بود !
    کد:
    #include "stm32f10x.h"
    #include "stdio.h"
    #include "lcd4bit.h"
    int a=0;
    int timerValue,timerValue1;
    char s[16];
    void GPIO_Configuration(void);
    void TIM_Configuration(void);
    void NVIC_Configuration(void);
    int main(void){
    GPIO_Configuration();
    TIM_Configuration();
    NVIC_Configuration();
    while(1);//loop : when we dont have any intrrupt , thise code runing !
    }
        
            
    /********************** GPIO configuration*********************************/    
    void GPIO_Configuration(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
     
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //ͨÓÃÍÆÍìÊä³öģʽ
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //Êä³ö×î´óƵÂÊΪ50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    /**************timer config*****************/
    void TIM_Configuration(void)
    {
    TIM_TimeBaseInitTypeDef TIM_BaseInitStructure; 
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE);
    TIM_BaseInitStructure.TIM_Period = 1000; // 
    TIM_BaseInitStructure.TIM_Prescaler = 36000 - 1; // 
    TIM_BaseInitStructure.TIM_ClockDivision = 1;
    TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_BaseInitStructure);
    /* TIM IT enable: for overflow  */
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    /* TIM2 enable  */
    TIM_Cmd(TIM2, ENABLE);
    }
    /**************config NVIC************************/
    void NVIC_Configuration(void)
    {
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    }
    /***************** Timing ovf function********************* */   
    void TIM2_IRQHandler(void)
    {
        a++;// with each interrupt , a=a +1
    
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//reset timer flag
    }
    if (a>=5)// each 5 second , pinD1 toggled !
    {
                GPIOA->ODR ^= GPIO_Pin_2;// toggle code
                timerValue = TIM_GetCounter(TIM2);
          timerValue1 = TIM2->CNT;
                sprintf(s,"input:%d",timerValue);
                set_cursor(1,1);
                lcd_putsf(s);
          sprintf(s,"input:%d",timerValue1);
                set_cursor(2,1);
                lcd_putsf(s);
    }
    if (a>5){
    a=0;}
    
    }
    
    
    ولی الان السیدی کار نمیکنه
    به نظرتون به خاطر اینه که مدت زمان کوتاهی a>=5 هست؟
    ویرایش توسط paradox7 : 05-01-2015 در ساعت 20:42

  12. #8
    کاربر فعال
    تاریخ عضویت
    Dec 2007
    نوشته ها
    113
    تشکر
    92
    تشکر شده 78 بار در 59 پست

    پیش فرض

    سلام
    سعی کنید حجم محاسبات رو توی توابع وقفه کم کنید(نقل قول: مرحوم آقازاده سایت همسایه)
    بهتره کل کد داخل وقفه تایمر رو به تابع اصلی انتقال بدین و اونجا فقط متغییر a رو افزایش بدین...
    راستی یادتون باشه اگر متغییر تعریف کنید که توی نرم افزار تغییر نکنه (وقفه ها نیاز به فعال ساز غیر نرم افزاری دارند و ممکن است در روال معمولی اتفاق نیافتد) به احتمال 80 درصد این متغییر حذف میشود (به خاطر مسائل بهینه سازی کد...) احتمال داره a کلا حذف بشه، بهتره متغییر رو اینجوری تعریف کنید:
    volatile int a;

  13. تشکرها از این نوشته :


  14. #9
    کاربر علاقه مند
    تاریخ عضویت
    Jun 2013
    نوشته ها
    63
    تشکر
    52
    تشکر شده 3 بار در 3 پست

    پیش فرض

    نقل قول نوشته اصلی توسط dostajn نمایش پست ها
    سلام
    سعی کنید حجم محاسبات رو توی توابع وقفه کم کنید(نقل قول: مرحوم آقازاده سایت همسایه)
    بهتره کل کد داخل وقفه تایمر رو به تابع اصلی انتقال بدین و اونجا فقط متغییر a رو افزایش بدین...
    راستی یادتون باشه اگر متغییر تعریف کنید که توی نرم افزار تغییر نکنه (وقفه ها نیاز به فعال ساز غیر نرم افزاری دارند و ممکن است در روال معمولی اتفاق نیافتد) به احتمال 80 درصد این متغییر حذف میشود (به خاطر مسائل بهینه سازی کد...) احتمال داره a کلا حذف بشه، بهتره متغییر رو اینجوری تعریف کنید:
    volatile int a;
    سلام
    شاهکارم رو ساعت 11 شب فهمیدم پس از یک روز درگیری !!lcd_init رو فراموش کرده بودم
    ممنون بابت راهنماییتون ولی من اصلا متوجه منظور شما نشدم میشه زیر دیپلم حرف بزنین ببخشیدا

  15. #10
    کاربر فعال rozeh آواتار ها
    تاریخ عضویت
    Mar 2013
    نوشته ها
    198
    تشکر
    27
    تشکر شده 176 بار در 104 پست

    پیش فرض

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

    ممنون بابت راهنماییتون ولی من اصلا متوجه منظور شما نشدم میشه زیر دیپلم حرف بزنین ببخشیدا
    منظورشون اینه که:
    همیشه بخاطر عدم تداخل در کار وقفه ها بهتره روتین وقفه رو سبک بنویسید. یکی از راه های ساده اینه که برنامه روتین وقفه رو توی همون حلقه نا-محدود بنویسید و براش یه متغیر فعال کننده بذارید و هر وقت وقفه اتفاق افتاد توی وقفه اون متغییر رو 1 کنید تا روتین وقفه توی برنامه اصلی اجرا بشه. البته این فقط یه راهه و راه های دیگه هم هست(با توجه به برنامه تون). شما همیشه باید روتین وقفه ها رو سبک بنویسید.
    کامپایلر بخاطر همین همیشه بیشتر اوپتیمایز رو روی روتین وقفه ها انجام میده. به همین دلیل ممکنه قسمت هایی از برنامه شما حذف بشه و درست کار نکنه. خصوصا متغییرها. پس بهتره volatile تعریف بشن. با قرار دادن این عبارت پشت تعریف متغیرتون، دیگه کامپایلر بهش دست نمیزنه.
    بجای volatile شما می تونید __IO هم استفاده کنید. هر دو یکی هستن.

    یه کتاب C هم بخونید بد نیست. فکر کنم لازمتون باشه.

  16. تشکرها از این نوشته :


مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •