PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کمک uart وv-usb



hsoft_project
09-04-2012, 21:28
با سلام خدمته تمامی اساتید. بنده با یک مشکل مواجه شدم و اینه که من با 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;
}

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

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


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