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

موضوع: کمک uart وv-usb

  1. #1
    عضو جدید
    تاریخ عضویت
    Sep 2010
    نوشته ها
    15
    تشکر
    1
    تشکر شده 4 بار در 3 پست

    پیش فرض کمک uart وv-usb

    با سلام خدمته تمامی اساتید. بنده با یک مشکل مواجه شدم و اینه که من با atmega 32 یک ارتباطه usb راه انداختم که موفق به راه اندازی uasbasp شدم با این میکرو ولی در کنارش میخوام از uart اطلاعات بگیرمو به usb ارسال کنم و من uart رو با scanf و printf پیکر بندی کردم وبا ارساله اطلاعات هیچ مشکلی ندارم ولی در هنگامی که میخواهم اطلاعات را دریافت کنم با استفاده از scanf تا زمانی که به rx داده نرسه در این تابع میمونه و چون من هر یک ثانیه اطلاعاتم میاد usb من remove میشه چون usbpll باید هر 50 میلی ثانیه فراخوانی بشه ولی من تا یک ثانیه در scanf میمونم لطفا یه راهی پیشنهاد بدبد منو نجات بدید

    #include <avr/io.h>
    #include <avr/wdt.h>
    #include <util/delay.h>

    #include "MSProtocol.h"
    #include "usbdrv/usbdrv.h"
    #include "usbdrv/oddebug.h"
    #include "usbdrv/uart.h"

    static void avr_init(void);

    char * b;


    uchar usbFunctionSetup(uchar data[8])
    {



    return USB_NO_MSG;
    }
    int i;
    uchar usbFunctionWrite(uchar *data, uchar len)
    {





    for (i=0;i<=5;i++)
    data[i]=b[i];
    b=0;

    return 6;
    }

    uchar usbFunctionRead(uchar *data, uchar len)
    {



    for (i=0;i<=5;i++)
    data[i]=b[i];
    b=0;
    return 6;
    }

    int main(void)
    {
    avr_init();


    for(;;)
    {
    wdt_reset();
    usbPoll();

    // PORTB |=_BV(0);
    //printf("hamed%c",95);






    }

    return(0);
    }



    static void avr_init(void)
    {
    wdt_enable(WDTO_2S);
    usbDeviceDisconnect();

    int j=0;





    uart_init();

    sei();





    DDRB |=_BV(0);
    MSProtcollInit(PORTB);




    _delay_ms(300);

    usbDeviceConnect();
    usbInit();
    odDebugInit();

    return;
    }
    و این هم کد صفحه ی MSProtocol.h



    #include "MSProtocol.h"

    char MSProtcollInit( int P)
    {
    char * uart_s_data;
    FILE uart_str = FDEV_SETUP_STREAM(uart_putch, uart_getch, _FDEV_SETUP_RW);
    stdout = stdin = &uart_str;
    PORTB|=_BV(0);
    printf("%s","hamed");
    printf("%s","hamed");
    printf("%s","hamed");
    PORTB &=~_BV(0);
    _delay_ms(30);
    scanf("%s",&uart_s_data);
    return -1;
    }
    void uart_init(void)
    {
    UBRRH = (((F_CPU/BAUD_RATE)/16)-1)>>8; // set baud rate
    UBRRL = (((F_CPU/BAUD_RATE)/16)-1);


    UCSRB = (1<<RXEN)|(1<<TXEN);


    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

    }

    int uart_putch(char ch, FILE *stream)
    {
    if (ch == '\n')
    uart_putch('\r', stream);

    while (!(UCSRA & (1<<UDRE)));
    UDR=ch;

    return 0;
    }

    int uart_getch(FILE *stream)
    {
    unsigned char ch;

    while (!(UCSRA & (1<<RXC)));
    ch=UDR;


    uart_putch(ch,stream);

    return ch;
    }
    char getbyte ()
    {

    unsigned char ch;

    while (!(UCSRA & (1<<RXC)));
    ch=UDR;
    return ch;
    }
    ویرایش توسط hsoft_project : 09-04-2012 در ساعت 21:30

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

  3. #2
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام مهندس
    لازم نبود همه برنامه رو اينجا بذارين. فقط كافي بود تو يه فايل زيپ شده آپلودش ميكردين.
    ---------------------------------------------------------------------------------------------------------------
    براي دريافت اطلاعات از وقفه دريافت استفاده كنيد(بيت RXIE رو فعال كنيد). تو اين حالت ديگه لازم نيست از تابع scanf استفاده كنيد.
    براي اينكه USB به حالت قطع شده(Remove) نره. شما به صورت مداوم ديتا به USB ارسال كنيد. اما ديتا رو قالب بندي كنيد يعني مثلااگه تو هر مرحله 30 بايت داده به USB ارسال ميكنيد. اولين بايت داده رو به كد مثلا عدد 1 اختصاص بدين. تو ويندوز هم هر موقع اين 30 بايت داده رو دريافت كردين اگه كد عدد 1 بود صحت داده هاي دريافتي تاييد ميشه.
    _____________________________________
    _____________________________________

  4. #3
    عضو جدید
    تاریخ عضویت
    Sep 2010
    نوشته ها
    15
    تشکر
    1
    تشکر شده 4 بار در 3 پست

    پیش فرض

    سلام مهندس
    لازم نبود همه برنامه رو اينجا بذارين. فقط كافي بود تو يه فايل زيپ شده آپلودش ميكردين.
    ---------------------------------------------------------------------------------------------------------------
    براي دريافت اطلاعات از وقفه دريافت استفاده كنيد(بيت RXIE رو فعال كنيد). تو اين حالت ديگه لازم نيست از تابع scanf استفاده كنيد.
    براي اينكه USB به حالت قطع شده(Remove) نره. شما به صورت مداوم ديتا به USB ارسال كنيد. اما ديتا رو قالب بندي كنيد يعني مثلااگه تو هر مرحله 30 بايت داده به USB ارسال ميكنيد. اولين بايت داده رو به كد مثلا عدد 1 اختصاص بدين. تو ويندوز هم هر موقع اين 30 بايت داده رو دريافت كردين اگه كد عدد 1 بود صحت داده هاي دريافتي تاييد ميشه.

    چی میشد حتما سعی میکردیم جواب نمیدادیم تا یه چیزیو تجربه نکرده بودیم.. شما اصلا میدونید در چه شرایطی میشه به usb داده ارسال کرد؟ من حتی به وقفه هم میرم زمان برای polling یو اس بی کم میاوردم. مشکلم حل شد با استفاده از ارتباط cdc با usb و ایجاد یک وقفه در usb. به هر حال متشکرم از پاسختون

موضوعات مشابه

  1. پردازش داده ها دریافتی از uart
    توسط soodi در انجمن LPC series (NXP)
    پاسخ: 4
    آخرين نوشته: 24-01-2014, 22:26
  2. uart در lpc1768
    توسط majid97 در انجمن میکرو کنترلر های 32 بیتی(arm)
    پاسخ: 4
    آخرين نوشته: 28-12-2013, 12:22
  3. مشکل در فعال شدن وقفه ی uart
    توسط majid97 در انجمن LPC series (NXP)
    پاسخ: 1
    آخرين نوشته: 30-10-2013, 17:33
  4. تبدیل پایه های پورت به uart
    توسط gbg در انجمن AT91 series (ATMEL)
    پاسخ: 6
    آخرين نوشته: 26-09-2013, 22:45
  5. وقفه در uart نرم افزاری ccs
    توسط lpln852 در انجمن PIC
    پاسخ: 2
    آخرين نوشته: 05-03-2011, 21:31

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

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