اطلاعیه

Collapse
No announcement yet.

ارسال و دریافت آرایه ای شامل چند متغیر از طریق usart

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

    ارسال و دریافت آرایه ای شامل چند متغیر از طریق usart

    برای ساخت یه کنترل برا روبات با دو میکرو atmega8 تحت نرم افزار کدویژن احتیاج دارم سه تا مقدار متغیر خوانده شده توسط ADC میکرو و وضعیت های چند پین رو رو از طریق USART برای یه میکرو ثانویه ارسال کنم.
    میخوام این مقادیر رو به صورت یه آرایه ارسال و از طریق اینتراپت در میکرو دوم دریافت کنم.
    این کار شدنیه؟ اگه هست چجور باید دستور بنویسم.
    آرایه ای که می خوام ارسال بشه به این شکل هست:
    char adc[]={100,0,100,0,100,0};
    و متغیر ها هم به صورت

    adc[1]=read_adc(0);
    adc[3]=read_adc(1);
    adc[5]=read_adc(2);
    برای این کار از دستورات printf و scanf میشه استفاده کرد؟


    #2
    پاسخ : ارسال و دریافت آرایه ای شامل چند متغیر از طریق usart

    نوشته اصلی توسط mtdehghan
    برای ساخت یه کنترل برا روبات با دو میکرو atmega8 تحت نرم افزار کدویژن احتیاج دارم سه تا مقدار متغیر خوانده شده توسط ADC میکرو و وضعیت های چند پین رو رو از طریق USART برای یه میکرو ثانویه ارسال کنم.
    میخوام این مقادیر رو به صورت یه آرایه ارسال و از طریق اینتراپت در میکرو دوم دریافت کنم.
    این کار شدنیه؟ اگه هست چجور باید دستور بنویسم.
    آرایه ای که می خوام ارسال بشه به این شکل هست:
    char adc[]={100,0,100,0,100,0};
    و متغیر ها هم به صورت

    adc[1]=read_adc(0);
    adc[3]=read_adc(1);
    adc[5]=read_adc(2);
    برای این کار از دستورات printf و scanf میشه استفاده کرد؟
    دستورات print و scan از طریق polling کار میکنند که وقت میکرو رو خیلی اشغال میکنه بهتره از اینتراپت استفاده کنید که کتابخونه های زیادی واسه ش توی اینترنت پیدا میشه...
    موفق باشید
    تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

    www.intelart.ir


    ساخت کنترلر دما PID فازي با AVR [آموزشی]

    دیدگاه


      #3
      پاسخ : ارسال و دریافت آرایه ای شامل چند متغیر

      نوشته اصلی توسط mtdehghan
      برای ساخت یه کنترل برا روبات با دو میکرو atmega8 تحت نرم افزار کدویژن احتیاج دارم سه تا مقدار متغیر خوانده شده توسط ADC میکرو و وضعیت های چند پین رو رو از طریق USART برای یه میکرو ثانویه ارسال کنم.
      میخوام این مقادیر رو به صورت یه آرایه ارسال و از طریق اینتراپت در میکرو دوم دریافت کنم.
      این کار شدنیه؟ اگه هست چجور باید دستور بنویسم.
      آرایه ای که می خوام ارسال بشه به این شکل هست:
      char adc[]={100,0,100,0,100,0};
      و متغیر ها هم به صورت

      adc[1]=read_adc(0);
      adc[3]=read_adc(1);
      adc[5]=read_adc(2);
      برای این کار از دستورات printf و scanf میشه استفاده کرد؟
      سلام
      ببین از هدر usart میکرو استفاده کن
      stdlib.h
      تو میکرو فرستنده یه متغیر تعریف کن که شماره داده تو آرایتو بشماره
      مقدار اولیش صفر باشه.مثلا اسمشو بذار count
      بعد بریزش تو یه متغیر موقتی که آرایه نباشه
      مثلا اسمشو بذار temp
      بعد با این دستور بفرستش
      کد:
      temp=adc[count];
      putchar(temp);
      وقفه ارسال هم تو فرستندت فعال کن و تو زیر برنامش بنویس که هر بار وقفه انجام شه یکی به count اضافه کنه
      هر بار که count به 5 رسید دوباره صفرش کنه

      از اونطرف تو گیرنده هم یه شمارنده تعریف کن و یه متغیر موقت
      وقفه دریافت رو هم فعال کن
      هر بار که دریافت انجام میشه
      اول بریزش تو متغیر موقت
      بعد اونو بریز تو آرایت متناسب با شماره شمارندت
      بعد دوباره شمارندتو وقتی به 5 رسید صفرش کن
      یه مثال از برنامه ها خودم برات میذارم امیدوارم کمکت کنه
      این زیر برنامه وقفه دریافته
      اینجا من یه آرایه 13تایی میگیرم و تو یه آرایه ذخیرش میکنم که تو برنامه اصلی ازش استفاده میکنم
      کد:
      interrupt [USART0_RXC] void usart_rx_isr(void){
        dt=getchar();
        dade[rx_count]=dt;
        ++rx_count;
        if(rx_count==13)  rx_count=0;
        }
      مشخصات usart رو هم از wizard کپی کن تو برنامت

      دیدگاه


        #4
        پاسخ : پاسخ : ارسال و دریافت آرایه ای شامل چند متغیر

        نوشته اصلی توسط ameen.kh
        سلام
        ببین از هدر usart میکرو استفاده کن
        stdlib.h
        تو میکرو فرستنده یه متغیر تعریف کن که شماره داده تو آرایتو بشماره
        مقدار اولیش صفر باشه.مثلا اسمشو بذار count
        بعد بریزش تو یه متغیر موقتی که آرایه نباشه
        مثلا اسمشو بذار temp
        بعد با این دستور بفرستش
        کد:
        temp=adc[count];
        putchar(temp);
        وقفه ارسال هم تو فرستندت فعال کن و تو زیر برنامش بنویس که هر بار وقفه انجام شه یکی به count اضافه کنه
        هر بار که count به 5 رسید دوباره صفرش کنه

        از اونطرف تو گیرنده هم یه شمارنده تعریف کن و یه متغیر موقت
        وقفه دریافت رو هم فعال کن
        هر بار که دریافت انجام میشه
        اول بریزش تو متغیر موقت
        بعد اونو بریز تو آرایت متناسب با شماره شمارندت
        بعد دوباره شمارندتو وقتی به 5 رسید صفرش کن
        یه مثال از برنامه ها خودم برات میذارم امیدوارم کمکت کنه
        این زیر برنامه وقفه دریافته
        اینجا من یه آرایه 13تایی میگیرم و تو یه آرایه ذخیرش میکنم که تو برنامه اصلی ازش استفاده میکنم
        کد:
        interrupt [USART0_RXC] void usart_rx_isr(void){
          dt=getchar();
          dade[rx_count]=dt;
          ++rx_count;
          if(rx_count==13)  rx_count=0;
          }
        مشخصات usart رو هم از wizard کپی کن تو برنامت
        ممنون بابت پاسختون.
        توی فرستنده کد رو با یه حلقه for بدون اینتراپت نوشتم به این صورت (نتونستم مستقیما با اینتراپت یوزارت کار کنم)

        آرایه اولیه رو به صورت زیر دارم:
        کد:
        char data[]={0xf0,0,0,0,100,0x0f};

        کد:
        while (1)
           {
           // Place your code here
            data[1]=read_adc(0);
            data[2]=read_adc(1);
            data[3]=read_adc(2);
        
            for (count=0;count<6;++count)
            {
            temp=data[count];
            putchar(temp);
            delay_ms(100);
            }
           }
        و توی گیرنده با این دستورات

        کد:
        while (1)
           {
              if(rx_buffer_overflow)
              {
              rx_buffer_overflow =0;
              temp=getchar();
              data[count]=temp;
              if (data[0]==0xf0)
              ++count;
              if (count>=6)
                {
                count=0;
                data[0]=0;
                }
        
              }
        فک کنم منظورتون رو درست متوجه نشدم !!! میشه لطفا بیشتر توضیح بدین؟.

        دیدگاه


          #5
          پاسخ : پاسخ : ارسال و دریافت آرایه ای شامل چند &#16

          نوشته اصلی توسط mtdehghan
          ممنون بابت پاسختون.
          توی فرستنده کد رو با یه حلقه for بدون اینتراپت نوشتم به این صورت (نتونستم مستقیما با اینتراپت یوزارت کار کنم)

          آرایه اولیه رو به صورت زیر دارم:
          کد:
          char data[]={0xf0,0,0,0,100,0x0f};

          کد:
          while (1)
             {
             // Place your code here
              data[1]=read_adc(0);
              data[2]=read_adc(1);
              data[3]=read_adc(2);
          
              for (count=0;count<6;++count)
              {
              temp=data[count];
              putchar(temp);
              delay_ms(100);
              }
             }
          و توی گیرنده با این دستورات

          کد:
          while (1)
             {
                if(rx_buffer_overflow)
                {
                rx_buffer_overflow =0;
                temp=getchar();
                data[count]=temp;
                if (data[0]==0xf0)
                ++count;
                if (count>=6)
                  {
                  count=0;
                  data[0]=0;
                  }
          
                }
          فک کنم منظورتون رو درست متوجه نشدم !!! میشه لطفا بیشتر توضیح بدین؟.
          ببین تو فرستنده نمیدونم چرا اون read_adcها رو نوشتی احتیاجی بشون نیست!
          برنامه فرستندت باید درست کار کنه
          این مقادیر رو برای رجیسترهای ارسال فرستندت استفاده کن
          کد:
          // USART initialization
          // Communication Parameters: 8 Data, 1 Stop, No Parity
          // USART Receiver: Off
          // USART Transmitter: On
          // USART Mode: Asynchronous
          // USART Baud rate: 9600
          UCSRA=0x00;
          UCSRB=0x08;
          UCSRC=0x86;
          UBRRH=0x00;
          UBRRL=0x67;
          تو گیرنده باید از وقفه استفاده کنی
          وقفتو فعال کن و تو زیر برنامش هر دریافتی انجام میدی رو بریز تو آرایت و شمارندتو یکی زیاد کن
          رجیسترای گیرندت میشه اینا
          کد:
          // USART initialization
          // Communication Parameters: 8 Data, 1 Stop, No Parity
          // USART Receiver: On
          // USART Transmitter: Off
          // USART Mode: Asynchronous
          // USART Baud rate: 9600
          UCSRA=0x00;
          UCSRB=0x90;
          UCSRC=0x86;
          UBRRH=0x00;
          UBRRL=0x67;
          و زیر برنامه وقفه هم دقیقا همینو کپی کن تو برنامت
          کد:
          interrupt [USART0_RXC] void usart_rx_isr(void){
            temp=getchar();
            data[rx_count]=temp;
            ++rx_count;
            if(rx_count==6)  rx_count=0;
            }
          و داخل main برنامت از مقادیر data استفاده کن
          احتیاجی نیست موقعی که هدر usart رو استفاده میکنی از اون برنامه ای که wizard میده استفاده کنی!!! فقط مقدار رجیسترها رو از wizard بردار

          تو برنامه اصلیت هم قبل از while(1) این دستور رو بنویس :
          کد:
          #asm("sei")
          این دستور به میکرو میگه وقفه ها رو انجام بده
          تا اینو ننویسی وقفه هات اجرا نمیشه

          دیدگاه

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