اطلاعیه

Collapse
No announcement yet.

سوال در مورد usart

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

    سوال در مورد usart

    در ارسال usart آیا امکان مقدار دهی به رجیستر UDR در حلقه WHILE وجود نداره؟!

    با توجه به اموزش های سایت یک برنامه نوشتم (و کپی کردم :rolleyes که در اون کد گرفته شده از صفحه کلید از طریق USART انتقال داده میشه

    در ابتدا در این برنامه مقدار دهی به رجیستر UDR در حلقه اصلی برنامه انجام میشد اما ارسال انجام نمیشد این بود که فکر کردم حتما UDR امکان مقدار دهی در حلقه اصلی رونداره :eek: این بود که یک تابع تعریف کردم و در تابع مقدار دهی کردم اما باز هم نشد

    این رو هم بگم که از طریق وقفه های ارسال UDR مقدار میگیره و ارسال چند عدد به سادگی انجام میشه اما برای ارسال کد های صفحه کلید ترجیح دادم از حلقه اصلی استفاده کنم اگر دوستان که تجربه بیشتری دارن کمک کنن ممنون میشم
    کد های برنامه MASTER:


    کد:
    #include <mega32.h>
    #include <delay.h>
    #define nokey_code 12
    
    
    flash unsigned char keyboard_codes[]={0x76,0x6E,0x5E,0x3E,0x75,0x6D,0x5D,0x3D,0x73,0x6B,0x5B,0x3B};
    
    volatile unsigned char data[];
    volatile unsigned char temp_key_code,key_code=nokey_code;
    unsigned char tempo;
    
     void function()
     {
     static unsigned char j=5;
     data[j]=temp_key_code;
     UDR=data[j];
     if(--j==0xff)j=5;
     }
    
    void main()
     { 
     unsigned char old_key_code=nokey_code;
     PORTD=(1<<PORTD1)|(1<<PORTD0); 
     DDRD=(1<<DDD2)|(1<<DDD1); 
    
    
     UBRRH=0;
     UBRRL=25; 
     UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
     UCSRC=(1<<UCSZ1)|(1<<UCSZ0);
    
    
     OCR0=124;
     TCCR0=(1<<WGM01)|(1<< CS01);
     TIMSK=(1<<OCIE0);
     #asm("sei");
    
     while(1);
     {
     temp_key_code=key_code;
     if (temp_key_code!=nokey_code)
      { 
      if (temp_key_code!= old_key_code)
      {
       old_key_code=temp_key_code;
       if (temp_key_code!=nokey_code)function(); 
      }
      }
     }
     }
    
    //------------------------------------------------------------------------------------------------------------------
    
    
    interrupt [USART_TXC] void USART_TX_Complete(void)
    {
     PORTD^=(1<<PORTD2);
     delay_ms(500);
     PORTD^=(1<<PORTD2);
    }
    
    interrupt [USART_RXC] void USART_RX_Complete(void)
    {
     tempo=UDR;
    }
    
    //-----------------------------------------------------------------------
    
    interrupt [TIM0_COMP] void timer0_compare_isr(void)
    {
    
     static unsigned char x20=0;
     unsigned char temp , i;
     if (++x20==20)
     {
     x20=0;
     DDRB=(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
     PORTB=(1<<PORTB6)|(1<<PORTB5)|(1<<PORTB4)|(1<<PORTB3);
     delay_us(5); // delay for signal stablization
     temp=(PINB & 0X78);
     DDRB=(1<<DDB6)|(1<<DDB5)|(1<<DDB4)|(1<<DDB3);
     PORTB=(1<<PORTB2)|(1<<PORTB1)|(1<<PORTB0);
     delay_us(5); // delay for signal stablization
     temp |=(PINB & 0X07);
     for(i=0;i<12;i++)
     {
      if(temp==keyboard_codes[i])
      {
      key_code=i;
      break;
      }
      else key_code=nokey_code;
     }
     }
    }

    لینک دانلود برنامه برای کسایی که مثل من عمرا" این کد ها رو بخونن :smile:

    master2.rar

    #2
    پاسخ : سوال در مورد usart

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

    دیدگاه


      #3
      پاسخ : سوال در مورد usart

      به طور کلی اگر به جای مدت ها منتظر ماندن برای اینکه یک نفر اشکال برنامه شما را پیدا کند، کمی بیشتر روی آن وقت بگذارید و به جزئیات دقت کنید، احتمالا زودتر به نتیجه می رسید.
      در مورد اجرا نشدن آنچه که در while نوشته اید، دلیل آن قرار دادن ";" بعد از while است که باعث می شود هیچ یک از دستوراتی که درون while نوشته اید اجرا نشود.
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


        #4
        پاسخ : سوال در مورد usart

        جناب طراح ضمن تشکر از شما من برنامه نویسی زبان c رو در حد دستورات معمول برای avr میشناسم (جزئی) اما در مورد این برنامه واقعا" فکر نمیکردم این یک اشکال باشه ( شاید زیاد روی خطا یابی کدویژن حساب کرده بودم) از اونجایی که تنها منبع آموزش من اینترنت هست با توجه به مثال های موجود علامت";" گذاشتم که الان دیگه مشخصه که اشتباه بوده

        دیدگاه

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