اطلاعیه

Collapse
No announcement yet.

یک مشکل عجیب در اتمل استادیو

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

    یک مشکل عجیب در اتمل استادیو

    سلام دوستان
    ی مشکل خیلی عجیب پیش اومده اصلا متوجه نمیشم از دوستان میخوام راهنمایی کنن تشکر

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

    برنامه بنده :
    کد:
    /*
     * RX.c
     *
     * Created: 11/01/2016 2:33:14 AM
     * Author : 
     */ 
    
    #include <avr/io.h>
    #include <util/delay.h>
    
    #ifndef F_CPU
    #define F_CPU 11059200UL
    #endif
    #include "lcd.h"
    
    #include <stdio.h>
    
    #define FOSC 11059200
    #define BAUD 9600
    #define MYUBRR FOSC/16/BAUD-1
    unsigned char USART_Receive( void ) ; 
    void USART_Init( unsigned int );
    /*
    int strcmp(char *s1, char *s2)
    {
    	int i;
    	for (i = 0; s1[i] == s2[i]; i++)
    	if (s1[i] == '\0')
    	return 0;
    	return s1[i] - s2[i];
    }
    */
    int main(void)
    {
    	DDRB|= ((1<<1) | (1<<2));
    	
    	LCDInit(LS_NONE);
    	LCDClear();
    	LCDWriteStringXY(0,0,"RFID Reader");
    	_delay_ms(2000); 
      USART_Init ( MYUBRR );
    
    char str[11]={'0','0','0','0','0'
    	   ,'0','0','0','0','0'};
    	
    char key[11] ={'0','0','0','8','3',
    		  '2','3','1','4','8'};
    		
    		int i = 1 ; 
    	while (1)
    	{
    	LCDClear();	
    	LCDWriteStringXY(0,0,"Insert Card");
    	
    i = 1 ; 
    UCSRB = (1<<RXEN) | UCSRB ; 
    while(1)
    {
    	
    	str[i] = USART_Receive();
    	if (i >= 10) {i = 1 ; break ; }
    	i++;
    	
    }
    
    char st2[11];
    for (int n = 0 ; n <10;n++)
    {
    	st2[n] = str[n];
    }
    LCDClear();
    LCDWriteStringXY(0,0,"ID:"); 
    LCDWriteStringXY(0,1,st2);
    UCSRB &=~(1<<RXEN) ; 
    _delay_ms(2000);
    int z = 0 ;
    
    for ( int n = 0 ; n < 10 ; n++)
    {
    	if (key[n] ==st2[n]) z++;
    }
    if (z>=9)
    {
    	LCDClear();
    	LCDWriteStringXY(0,0,"Correct!");
    	_delay_ms(1500);
    }
    
    
    /*
    if (strcmp(str,key)==0)
    {
    	PORTB |= 1<< 1 ; 
    	PORTB &=~(1<<2) ; 
    	LCDClear();
    	LCDWriteStringXY(0,0,"Correct!");
    }
    else if (strcmp(str,key)!=0)
    {
    	PORTB |= 1<<2 ; 
    	PORTB &=~(1<<1) ; 
    	LCDClear();
    	LCDWriteStringXY(0,0,"Invalid!");
    	
    }
    
    _delay_ms(1000);
    PORTB &=~((1<<1) | (1<<2));
    */
    
    for(int j = 0 ; j <=sizeof(str);j++) str[j] = '0' ; 
    	}
    }
    
    unsigned char USART_Receive( void )
    {
    
    	while ( !(UCSRA & (1<<RXC)) )
    	;
    
    	return UDR;
    }
    
    void USART_Init( unsigned int ubrr)
    {
    	
    	UBRRH = (unsigned char)(ubrr>>8);
    	UBRRL = (unsigned char)ubrr;
    
    	UCSRB = (1<<RXEN)|(1<<TXEN);
    
    	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }

    آرایه های زیر رو ببینید :
    کد:
    
    char str[11]={'0','0','0','0','0'
    	   ,'0','0','0','0','0'};
    	
    char key[11] ={'0','0','0','8','3',
    		  '2','3','1','4','8'};
    str بافر دریافت اطلاعات و دیگری هم کد کارت مورد نظر ما هست
    باید باهم مقایسه بشن



    راه هایی که جهت مقایسه این دو ارایه استفاده کردم :


    1- در ابتدا با استفاده از دستور strcmp(key,str)==0 برای یکسان بودنشون اقدام کردم
    2-
    تابع strcmp رو خودم نوشتم
    کد:
    int strcmp(char *s1, char *s2)
    {
    	int i;
    	for (i = 0; s1[i] == s2[i]; i++)
    	if (s1[i] == '\0')
    	return 0;
    	return s1[i] - s2[i];
    }
    3-
    استفاده از ی روش مقایسه ساده
    کد:
    for ( int n = 0 ; n < 10 ; n++)
    {
    	if (key[n] ==st2[n]) z++;
    }
    if (z>=10)
    {
    	LCDClear();
    	LCDWriteStringXY(0,0,"Correct!");
    	_delay_ms(1500);
    }
    و اما مشکل ؟

    با هر روشی آرایه های بالا رو مقایسه میکنم مقدار دریافتی اصلیم از پورت سریال تغییر میکنه!!! هیچ ربطی نداره من حتی بعد از دریافت مقادیر و ریختنش در آرایه str یک کپی از این مقادیر رو در st2 ریختم و st2 و key رو باهم مقایسه کردم ! باز هم اطلاعات دریافتی که داخل str ریخته میشه عوض میشه !! و فقط هم کم ارزش ترین بایت عوض میشه
    مثلا اگه شماره سریال کارت 12345 باشه مقدار دریافتی┼ 1234 اینجوری میشه

    اصلا نمیفهمم به چی ربط داره مقایسه شدن دو تا آرایه به درهم ریختن ورودی سریال :| اصلا قبل مقایسه کردن این دوتا آرایه مقدار str دریافت میشه و نمایش داده میشه من نمیفهمم وقتی هنوز مقایسه ای صورت نگرفته مقدارش چرا بهم ریخته اصلا !

    ممنون میشم دوستان کمک کنن
    اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

    #2
    پاسخ : یک مشکل عجیب در اتمل استادیو

    دوستان انگار عجیب ترین مشکلات برا منه !

    تموم کاری که بنده کردم خلاصه میشه در این :
    1-خوندن اطلاعات رجیستر UDR ( سریال برا دریافت کد کارت از ماژول )
    2-ریختنش در یک ارایه
    3-نمایش کل این آرایه بر روی ال سی دی :

    وقتی نمایش میدم کد پشت کارت و کد نمایش داده شده کاملا یکی هست

    حالا اگه بیام تک تک آرایه هاشو بخونم و روی صفحه نشون بدم منطق میگه باید شماره سریال کارت که : 12345 بوده به ترتیب 1 و 2 و 3 و 4 و 5 نشون داده بشه غیر اینه ؟
    ولی آرایه ای که نشون بدم کاراکتر های درهم نشون میده :|

    آیا در اتمل استادیو برای کار با کاراکتر مثل کار با اعداد اعشاری فلگی چیزی وجود داره باید ادد بشه ؟ !!!!؟!
    اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

    دیدگاه


      #3
      پاسخ : یک مشکل عجیب در اتمل استادیو

      کدتو بررسی نکردم اما اینجور مشکلات زمانی پیش میاد که باوود ریت درستی انتخاب نکرده باشی و یا پریتی ارورر داشته باشی و یا پایه های ارسال و دریافت رو پول پ نکرده باشی...
      اینارو چک کن شاید ازینا باشه
      یه نگاهی هم به ترتیب چیدن داده ها تو متغیر بنداز
      مثلا کد دریافتی از کارت 12 عدد هستش که شما به نظرم 10 کاراکتر دریافت داری

      دیدگاه


        #4
        پاسخ : پاسخ : یک مشکل عجیب در اتمل استادیو

        نوشته اصلی توسط Rezash86
        کدتو بررسی نکردم اما اینجور مشکلات زمانی پیش میاد که باوود ریت درستی انتخاب نکرده باشی و یا پریتی ارورر داشته باشی و یا پایه های ارسال و دریافت رو پول پ نکرده باشی...
        اینارو چک کن شاید ازینا باشه
        یه نگاهی هم به ترتیب چیدن داده ها تو متغیر بنداز
        مثلا کد دریافتی از کارت 12 عدد هستش که شما به نظرم 10 کاراکتر دریافت داری
        ممنون از پاسختون

        کد مشکلی نداره
        باود ریت 9600 و کریستال خارجی 11059200 گذاشته شده اطلاعات رو کامل از ماژول میخونم و کد رشته ای 10 رقمی پشت کارت و روی ال سی دی میبینم کامل
        پول آب هم هست خط سریال

        مشکل ی چیز دیگس
        مشکل اینه کدو که من میخونم ریخته میشه تو این آرایه که تعریف کردم :
        کد:
        char str[]={'0','0','0','0','0'
        	   ,'0','0','0','0','0'};
        این آرایه رو وقتی رو ال سی دی نشون میدم کد کامل پشت کارت نشون داده میشه
        ولی وقتی با ی حلقه تک تک سلول هاشو میخونم که مثلا با ی ارایه دیگه مقایسش کنم اگه کارت درست بود فلان کارو بکنه ،میبینم مقادیر سیو شده تو هر سلولش متفاوته

        مثلا ببینید :

        این آرایه اطلاعات کارتو گرفته حالا نمایشش میدم رو ال سی دی مینویسه 12345 که کاملا درسته سریال کارتم همینه
        حالا درایه صفرشو میخونم str[0] توش بجای 1 مثلا ی کد ناخوانا هست
        اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

        دیدگاه


          #5
          پاسخ : یک مشکل عجیب در اتمل استادیو

          اما تا اونجایی که من اطلاعات دارم اطلاعاتی که یک کارت ارائه میده 12 عدد هگز هستش و 2 عدد اول اون مشترکه که باید توسط کد نویسی برداشته بشه
          ببین ه کاری کن
          با 1234 چک کن ببین عملیات درست انجام میشه؟
          ینی با 4 رقم

          دیدگاه


            #6
            پاسخ : یک مشکل عجیب در اتمل استادیو

            نوشته اصلی توسط Rezash86
            اما تا اونجایی که من اطلاعات دارم اطلاعاتی که یک کارت ارائه میده 12 عدد هگز هستش و 2 عدد اول اون مشترکه که باید توسط کد نویسی برداشته بشه
            ببین ه کاری کن
            با 1234 چک کن ببین عملیات درست انجام میشه؟
            ینی با 4 رقم
            کل اطلاعات 14 بایت هست 1 بایت اولش و 3 بایت آخرش جز اطلاعات نیست و 10 بایت اطلاعات میفرسته که به تنظیم پایه 6 و 7 میشه فرمت ارسالشو مشخص کرد ک من تنظیم کردم رشته بفرسته

            اره اگه بافرو خودم مقدار دهی کنم هر کدوم از خونه های آرایه درسته ولی وقتی با باس سریال پر بشه هرکدوم از خونه های آرایه متفاوته از چیزی ک از کل ارایه میبینیم !

            تشکر از شما

            واقعا عجیب ترین مشکلی بوده ک بش برخوردم
            اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

            دیدگاه


              #7
              پاسخ : یک مشکل عجیب در اتمل استادیو

              دوستان دیگه نظری ندارن ؟ :sad: :cry:
              اشک هایی که پس از هر شکست ریخته میشوند همان عرق هاییست که برای پیروزی ریخته نشده است

              دیدگاه


                #8
                پاسخ : یک مشکل عجیب در اتمل استادیو

                نوشته اصلی توسط mehran901
                دوستان دیگه نظری ندارن ؟ :sad: :cry:
                سلام
                من تا حالا با این نوع پروژه کار نکردم ولی چندتا نکته رو میگم
                1- مقدار فرکانس F_CPU 11059200UL رو قبل از delay.h قرار بده چون باعث بهم خوردگی در زمان میشه دلیلش اینه که داری از delay_ms استفاده میکنی
                2- دقت کن پایه های دیتا ویا کنترل که به السی دی میره با پایه های سریال تداخل نداشته باشه که باعث بهم خوردگی محتوای عدد در نمایش میشه
                3-مقدار اولیه ارایه ها رو قبل از دریافت اطلاعات 0 کن
                امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                دیدگاه


                  #9
                  پاسخ : یک مشکل عجیب در اتمل استادیو

                  نکته بعدی
                  4- سعی کن با وقفه خود سریال کارکنی تا با دریافت اطلاعاتی وارد وقفه شی و محتوای اطلاعاتت رو داخل ارایه ها بریزی
                  دلیلش اینه که تا دوباره کارت رو جلوی ماژول نگرفتی اطلاعات بعدی نمیاد
                  و اعداد ناخواسته وارد ارایه هات نمیشه

                  5- اینه که میتونی 14 بایت رو کلا بگیری و از ارایه 2 تا ارایه 11 هم رو کپی کنی در ارایه 10 بایتی و بلافاصله ارایه 10 بایتی رو در حافظه eeprom کپی کنی تا اطلاعات از دست نره
                  امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                  دیدگاه

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