PDA

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



behnam6500
13-01-2009, 02:35
سلام
در پروژه دماسنج، از سرعت پایین استفاده شده و برای ارسال مقدار به کامپیوتر از تابع setup استفاده کرده.
همچنین با وصل کردن یه دیود به D- مدارو واسه سرعت پایین ست کرده.
اگه بخواهیم از سرعت بالا استفاده کنیم، شماتیک مدار به چه صورت میشه؟؟؟ میشه نقشه شماتیکی ازش بزارین؟
همچنین برای انتقال سرعت بالا از توابع read و write استفاده میشه در داخل میکرو. لطفا اگه امکان داره یه مثال از نحوه کد نویسی ای دو تابع در اختیار من بزارین. به یه مثال خیلی ساده نیاز دارم که مثلا از طرف کامپیوتر یه مقداری به میکرو بفرستم و میکرو متناسب با اون مقداری به کامپیوتر بده.
در اصل نحوه کار با این توابع رو میخوام
با تشکر...

kavir
13-01-2009, 02:53
سلام
شماتیک فرقی نمی کنه فقط برنامه کامپیوتری و میکرو
You can see links before reply
این سورس بالا پروگرامر avr هست که آقای منصوری نوشتند به صورت کامل هست و سرعت بالا

برنامه میکرو winavr
برنامه کامپیوترC++builder6 که در فروشگاه هم قرار داده شده
موفق باشید

behnam6500
13-01-2009, 12:49
سلام
کویر جان ممنون بابت سورس برنامه...
با دیدن اون سورس چندتا سوال واسم پیش اومده!!!
1- usbFunctionSetup هم برای ارسال اطلاعات و دریافت اطلاعات استفاده می شود؟
2- حتما باید usbFunctionSetup را در کنار usbFunctionWrite و usbFunctionRead بکار ببریم؟
3- دقیقا طرز کار این 3 تابع چطوریه؟
4- در تابع usbFunctionRead (که میخواهیم اطلاعات را از میکرو به میزبان ارسال کنیم) در آرگومان ورودی len ، طول len از قبل معلوم است؟ چون در یه حلقه از صفر شروع کرده تا به اندازه طول len تکرار بشه و در داخل حلقه بایت بایت خانه های data را مقدار دهی کرده! خوب آیا بعد از خروج از این تابع اطلاعات اتوماتیک فرستاده میشه به میزبان؟؟؟
5- تابع usbFunctionWrite هم همینطوره؟ در یک حلقه اطلاعاتی رو که از میزبان اومده رو میخونه؟ آیا ممکنه که هر کدام از این بایتها در پروتکلهای usb مفهوم خاصی داشته باشه؟؟؟ مثلا در برنامه چک شده که اگه data[1]=1 بود یعنی ارتباط بین مدار و میزبان برقراره! اطلاعات دقیقا چطوری قرار میگیرن در این آرایه ها؟؟؟؟
6- در این برنامه چرا از هر سه تابع usbFunctionSetup و read و write استفاده شده؟!
7- این توابع بصورت اتوماتیک فراخوانی می شوند؟ طرز فراخوانیشون چطوریه؟؟؟؟
من نفهمیدم که اطلاعات دقیقا به چه صورتی ارسال و دریافت می شوند و حجم اطلاعات چقدر هست!!!!!
منتظر راهنمايي هاي شما هستم... :D

kavir
13-01-2009, 13:12
سلام
من خیلی وقت پیش همین سوال رو از دوست خوبم آقای منصوری پرسیدم که به صورت نقل قول براتون می ذارم
در ضمن استفاده از پروگرامر ایشان به صورت تجاری ممنوع است
بسمه تعالی
سلام دوست عزیز
فکر می کنم با مثال قبلی که برات فرستادم مشکلت با پروژه حل بشه ولی برای اینکه انتقال اطلاعات با سرعت بالا و استفاده از بافر را خواسته بودی این توضیحات را می نویسم :
اول اینکه هیچ پروژه ای به یادم نیومد که از بافر استفاده شده باشه و حضور ذهن داشته باشم کامل توضیحش بدم لذا قسمتی از برنامه کامپیوتری و برنامه میکروی اون پروگرمر را برات توضیح میدم . امیدوارم با این توضیحات بتونی برای هر پروژه دیگری که به ذهنت رسید این توابع را بگونه ای تغییر دهی که کارت راه بیفته .
اول برنامه کامپیوتری :
static int usbasp_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
int page_size, int n_bytes)
این تابع برای خواندن یک پیج از روی حافظه میکروست (هم فلش و هم رام){
int n;
unsigned char cmd[4];آدرس شروع پیچ را با این متغیر به میکرو می فرستیم
int address = 0;
int wbytes = n_bytes;
int blocksize;مشخص کننده طول بلوک اطلاعاتی است که باید یکجا از میکرو ارسال شود.
unsigned char * buffer = m->buf;این بافر همون بافری است که حاوی اطلاعاتی است که از روی میکرو خوانده می شود
int function;

if (strcmp(m->desc, "flash") == 0) {
function = USBASP_FUNC_READFLASH;
} else if (strcmp(m->desc, "eeprom") == 0) {
function = USBASP_FUNC_READEEPROM;
} else {
return -2;
این چند خط بالا برای تشخیص اینه که می خواهیم از روی رام بخوانیم یا از روی فلش }

while (wbytes) {
if (wbytes > USBASP_READBLOCKSIZE) {
blocksize = USBASP_READBLOCKSIZE;
wbytes -= USBASP_READBLOCKSIZE;
} else {
blocksize = wbytes;
wbytes = 0;
}
اینجا آدرس را در دوبایت به میکرو میفرستیم
cmd[0] = address & 0xFF;
cmd[1] = address >> 8;
حال که تمامی پارامتر های تابع ارسال تکمیل شده ارسال می کنیم .
n = usbasp_transmit(1, function, cmd, buffer, blocksize);

if (n != blocksize) {
fprintf(stderr, "%s: error: wrong reading bytes %x\n",
progname, n);
exit(1);
}
مقدار بافر و آدرس را با توجه به تعداد بایتهای بلوک آپدیت می کنیم
buffer += blocksize;
address += blocksize;
این تابع برای نمایش نواراست(Progress bar)
report_progress (address, n_bytes, NULL);
}

return n_bytes;
}
این تابع برای نوشتن یک پیج روی میکرو است
static int usbasp_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
int page_size, int n_bytes)
{
int n;
unsigned char cmd[4];این متغیر برای ارسال آدرس و اندازه پیج استفاده می شود
int address = 0;
int wbytes = n_bytes;
int blocksize;
unsigned char * buffer = m->buf;
unsigned char blockflags = USBASP_BLOCKFLAG_FIRST;
int function;

if (strcmp(m->desc, "flash") == 0) {
function = USBASP_FUNC_WRITEFLASH;
} else if (strcmp(m->desc, "eeprom") == 0) {
function = USBASP_FUNC_WRITEEEPROM;
} else {
return -2;
}

while (wbytes) {
if (wbytes > USBASP_WRITEBLOCKSIZE) {
blocksize = USBASP_WRITEBLOCKSIZE;
wbytes -= USBASP_WRITEBLOCKSIZE;
} else {
blocksize = wbytes;
wbytes = 0;
blockflags |= USBASP_BLOCKFLAG_LAST;
}

cmd[0] = address & 0xFF;بایت پایین آدرس
cmd[1] = address >> 8;بایت بالای آدرس
cmd[2] = page_size & 0xFF;بایت پایین اندازه پیج
cmd[3] = (blockflags & 0x0F) + ((page_size & 0xF00) >> 4);
blockflags = 0;
ارسال با تابع مخصوصش
n = usbasp_transmit(0, function, cmd, buffer, blocksize);

if (n != blocksize) {
fprintf(stderr, "%s: error: wrong count at writing %x\n",
progname, n);
exit(1);
}

اصلاح بافر و آدرس برای ارسال بلوک بعدی
buffer += blocksize;
address += blocksize;

report_progress (address, n_bytes, NULL);
}

return n_bytes;
}







و حالا برنامه میکرو :
uchar usbFunctionRead(uchar *data, uchar len}(این تابع برای خواندن اطلاعات فلش یا رام و ارسال به یو اس بی است

uchar i;

/* check if programmer is in correct read state */
if ((prog_state != PROG_STATE_READFLASH) &&
(prog_state != PROG_STATE_READEEPROM)) {
return 0xff;
}
در اینجا بافری را که باید به کامپیوتر بفرستیم پر می کنیم
/* fill packet */
for (i = 0; i < len; i++) {
if (prog_state == PROG_STATE_READFLASH) {
data[i] = ispReadFlash(prog_address);
} else {
data[i] = ispReadEEPROM(prog_address);
}
prog_address++;
}

/* last packet? */
if (len < 8) {
prog_state = PROG_STATE_IDLE;
}
طول بافر پر شده را برمی گردانیم
return len;
}

این تابع برای نوشتن یک پیج روی رام یا فلش میکروست
uchar usbFunctionWrite(uchar *data, uchar len) {

uchar i;

/* check if programmer is in correct write state */
if ((prog_state != PROG_STATE_WRITEFLASH) &&
(prog_state != PROG_STATE_WRITEEEPROM)) {
return 0xff;
}


for (i = 0; i < len; i++) {

if (prog_state == PROG_STATE_WRITEFLASH) {
/* Flash */

if (prog_pagesize == 0) {
/* not paged */
ispWriteFlash(prog_address, data[i], 1);
} else {
/* paged */
ispWriteFlash(prog_address, data[i], 0);
prog_pagecounter --;
if (prog_pagecounter == 0) {
ispFlushPage(prog_address, data[i]);
prog_pagecounter = prog_pagesize;
}
}

} else {
/* EEPROM */
ispWriteEEPROM(prog_address, data[i]);
}

prog_nbytes --;

if (prog_nbytes == 0) {
prog_state = PROG_STATE_IDLE;
if ((prog_blockflags & PROG_BLOCKFLAG_LAST) &&
(prog_pagecounter != prog_pagesize)) {

/* last block and page flush pending, so flush it now */
ispFlushPage(prog_address, data[i]);
}
}

prog_address ++;
}

return 0;

behnam6500
13-01-2009, 16:26
مرسي كوير جان... :lol: aa) aa) aa) :wink: :lol: :lol:

behnam6500
13-01-2009, 16:49
سلام
با دیدن این راهنما به بعضی از جوابهام رسیدم ولی چندتا از سوالاتم رو با اجازتون دوباره مطرح می کنم:
1- آیا تابع setup و دو تابع read و write در هر لحظه در حال اجرا هستند؟ در اصل من با نحوه فراخوانی این توابع مشکل دارم!
2- فکر کنم که setup اول اجرا میشه بعد دو تابع دیگه! درسته؟ چون تو برنامه که دیدم ، اول وضعیت پروگرامر رو واسه اون کاری که میخواد انجام بده ست میکنه (از لحاظ دستوری) بعد مثلا از تابع Write استفاده می کنه؟!
لطفا یه توضیحی به من بدین
راستي برنامه نويسي كامپيوتر من با وي بي دات نت و سي شارژ كار مي كنم. سورسي يا راهنمايي دارين كه بتونم ازش استفاده كنم تو دات نت؟
ممنونم

behnam6500
13-01-2009, 19:25
سلام
در این مثال خواستم که اگه مقدار 5 به میکرو فرستاده شد وضعیت 1 فعال بشه و در تابع read مقدار آرایه مربوطه به کامپیوتر ارسال بشه. همینطور واسه عدد 6
ولی در تست، هیچ چیزی میکرو برنمیگردونه!!!!! انگار تابع read کار نمیکنه!
به وسیله replybuffer در تابع setup میتونم مقدار رو بخونم ولی میخوام با استفاده از تابع read این کارو کنم!
به نظر شما اشکال کار من کجاست؟؟؟؟؟

#include <avr>
#include <avr>
#include <avr>
#include <avr>
#include <avr>
#include <avr>

#include "usbdrv.h"

static char replyBuffer[8];

static unsigned int myStatus;

uchar MyName1[15]="ThisisTest1";
uchar MyName2[15]="ForALongT";
static unsigned int myAdd;

uchar usbFunctionSetup(uchar data[8]) {
uchar len = 1;

if (data[1]==5)
{
myAdd=0;
myStatus=1;
len=0xff;
}
else if(data[1]==6)
{
myAdd=0;
myStatus=2;
len=0xff;
}


usbMsgPtr = replyBuffer;
return len;
}


uchar usbFunctionRead(uchar *data, uchar len) {

uchar i;

/* fill packet */
for (i = 0; i < len; i++)
{

if (myStatus==1)
data[i] = MyName1[myAdd];
else if(myStatus==2)
data[i] = MyName2[myAdd];
myAdd++;
} // for



/* last packet? */
if (len < 8) {

}

return len;
//return 0xff;
}


uchar usbFunctionWrite(uchar *data, uchar len) {

return 0xff;
}


int main(void)
{
PORTD = 0;
PORTB = 0; /* no pullups on USB and ISP pins */
DDRD = ~(1 << 2); /* all outputs except PD2 = INT0 */
DDRB = 0; /* all USB and ISP pins inputs */

DDRC = 0b101111; /* all output except PC4 */
PORTC = 0b001000;

usbInit();
sei();
for(;;){ /* main event loop */
usbPoll();
}
return 0;
}

behnam6500
14-01-2009, 00:43
كسي نيست جوابه منو بده؟؟؟؟

kavir
14-01-2009, 00:56
دوست عزیز منم با این توابع کار نکردم یعنی تا حالا مورد نیازم نبوده وفقط از همون setup استفاده کردم
خوب یک مثال جامع و کامل با سورس کامل در اختیارتون گذاشتم بررسی کنید و یک مثال ساده در همین تاپیک بذارید

behnam6500
14-01-2009, 01:35
سلام
من خیلی وقت پیش همین سوال رو از دوست خوبم آقای منصوری پرسیدم که به صورت نقل قول براتون می ذارم
در ضمن استفاده از پروگرامر ایشان به صورت تجاری ممنوع است
بسمه تعالی
سلام دوست عزیز
فکر می کنم با مثال قبلی که برات فرستادم مشکلت با پروژه حل بشه ولی برای اینکه انتقال اطلاعات با سرعت بالا و استفاده از بافر را خواسته بودی این توضیحات را می نویسم :
اول اینکه هیچ پروژه ای به یادم نیومد که از بافر استفاده شده باشه و حضور ذهن داشته باشم کامل توضیحش بدم لذا قسمتی از برنامه کامپیوتری و برنامه میکروی اون پروگرمر را برات توضیح میدم . امیدوارم با این توضیحات بتونی برای هر پروژه دیگری که به ذهنت رسید این توابع را بگونه ای تغییر دهی که کارت راه بیفته .
اول برنامه کامپیوتری :
static int usbasp_paged_load(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
int page_size, int n_bytes)
این تابع برای خواندن یک پیج از روی حافظه میکروست (هم فلش و هم رام){
int n;
unsigned char cmd[4];آدرس شروع پیچ را با این متغیر به میکرو می فرستیم
int address = 0;
int wbytes = n_bytes;
int blocksize;مشخص کننده طول بلوک اطلاعاتی است که باید یکجا از میکرو ارسال شود.
unsigned char * buffer = m->buf;این بافر همون بافری است که حاوی اطلاعاتی است که از روی میکرو خوانده می شود
int function;

if (strcmp(m->desc, "flash") == 0) {
function = USBASP_FUNC_READFLASH;
} else if (strcmp(m->desc, "eeprom") == 0) {
function = USBASP_FUNC_READEEPROM;
} else {
return -2;
این چند خط بالا برای تشخیص اینه که می خواهیم از روی رام بخوانیم یا از روی فلش }

while (wbytes) {
if (wbytes > USBASP_READBLOCKSIZE) {
blocksize = USBASP_READBLOCKSIZE;
wbytes -= USBASP_READBLOCKSIZE;
} else {
blocksize = wbytes;
wbytes = 0;
}
اینجا آدرس را در دوبایت به میکرو میفرستیم
cmd[0] = address & 0xFF;
cmd[1] = address >> 8;
حال که تمامی پارامتر های تابع ارسال تکمیل شده ارسال می کنیم .
n = usbasp_transmit(1, function, cmd, buffer, blocksize);

if (n != blocksize) {
fprintf(stderr, "%s: error: wrong reading bytes %x\n",
progname, n);
exit(1);
}
مقدار بافر و آدرس را با توجه به تعداد بایتهای بلوک آپدیت می کنیم
buffer += blocksize;
address += blocksize;
این تابع برای نمایش نواراست(Progress bar)
report_progress (address, n_bytes, NULL);
}

return n_bytes;
}
این تابع برای نوشتن یک پیج روی میکرو است
static int usbasp_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
int page_size, int n_bytes)
{
int n;
unsigned char cmd[4];این متغیر برای ارسال آدرس و اندازه پیج استفاده می شود
int address = 0;
int wbytes = n_bytes;
int blocksize;
unsigned char * buffer = m->buf;
unsigned char blockflags = USBASP_BLOCKFLAG_FIRST;
int function;

if (strcmp(m->desc, "flash") == 0) {
function = USBASP_FUNC_WRITEFLASH;
} else if (strcmp(m->desc, "eeprom") == 0) {
function = USBASP_FUNC_WRITEEEPROM;
} else {
return -2;
}

while (wbytes) {
if (wbytes > USBASP_WRITEBLOCKSIZE) {
blocksize = USBASP_WRITEBLOCKSIZE;
wbytes -= USBASP_WRITEBLOCKSIZE;
} else {
blocksize = wbytes;
wbytes = 0;
blockflags |= USBASP_BLOCKFLAG_LAST;
}

cmd[0] = address & 0xFF;بایت پایین آدرس
cmd[1] = address >> 8;بایت بالای آدرس
cmd[2] = page_size & 0xFF;بایت پایین اندازه پیج
cmd[3] = (blockflags & 0x0F) + ((page_size & 0xF00) >> 4);
blockflags = 0;
ارسال با تابع مخصوصش
n = usbasp_transmit(0, function, cmd, buffer, blocksize);

if (n != blocksize) {
fprintf(stderr, "%s: error: wrong count at writing %x\n",
progname, n);
exit(1);
}

اصلاح بافر و آدرس برای ارسال بلوک بعدی
buffer += blocksize;
address += blocksize;

report_progress (address, n_bytes, NULL);
}

return n_bytes;
}







و حالا برنامه میکرو :
uchar usbFunctionRead(uchar *data, uchar len}(این تابع برای خواندن اطلاعات فلش یا رام و ارسال به یو اس بی است

uchar i;

/* check if programmer is in correct read state */
if ((prog_state != PROG_STATE_READFLASH) &&
(prog_state != PROG_STATE_READEEPROM)) {
return 0xff;
}
در اینجا بافری را که باید به کامپیوتر بفرستیم پر می کنیم
/* fill packet */
for (i = 0; i < len; i++) {
if (prog_state == PROG_STATE_READFLASH) {
data[i] = ispReadFlash(prog_address);
} else {
data[i] = ispReadEEPROM(prog_address);
}
prog_address++;
}

/* last packet? */
if (len < 8) {
prog_state = PROG_STATE_IDLE;
}
طول بافر پر شده را برمی گردانیم
return len;
}

این تابع برای نوشتن یک پیج روی رام یا فلش میکروست
uchar usbFunctionWrite(uchar *data, uchar len) {

uchar i;

/* check if programmer is in correct write state */
if ((prog_state != PROG_STATE_WRITEFLASH) &&
(prog_state != PROG_STATE_WRITEEEPROM)) {
return 0xff;
}


for (i = 0; i < len; i++) {

if (prog_state == PROG_STATE_WRITEFLASH) {
/* Flash */

if (prog_pagesize == 0) {
/* not paged */
ispWriteFlash(prog_address, data[i], 1);
} else {
/* paged */
ispWriteFlash(prog_address, data[i], 0);
prog_pagecounter --;
if (prog_pagecounter == 0) {
ispFlushPage(prog_address, data[i]);
prog_pagecounter = prog_pagesize;
}
}

} else {
/* EEPROM */
ispWriteEEPROM(prog_address, data[i]);
}

prog_nbytes --;

if (prog_nbytes == 0) {
prog_state = PROG_STATE_IDLE;
if ((prog_blockflags & PROG_BLOCKFLAG_LAST) &&
(prog_pagecounter != prog_pagesize)) {

/* last block and page flush pending, so flush it now */
ispFlushPage(prog_address, data[i]);
}
}

prog_address ++;
}

return 0;

سلام. من در اين تاپيك از شما سوالي پرسيدم. ميشه لطفا برنامه منو چك كنين؟؟؟؟

behnam6500
14-01-2009, 10:37
دوست عزیز منم با این توابع کار نکردم یعنی تا حالا مورد نیازم نبوده وفقط از همون setup استفاده کردم
خوب یک مثال جامع و کامل با سورس کامل در اختیارتون گذاشتم بررسی کنید و یک مثال ساده در همین تاپیک بذارید

سلام كوير جان
برنامه ميكروي من مشكلي نداشت و سالم هست! اشكال كار من در برنامه كامپيوتري بود! فايلي كه واسه ارتباط با ميكرو استفاده مي كنم مشكل داره واسه ارسال داده به ميكرو!
آيا شما كامپوننتي، dllاي دارين كه بتونم باهاش كار كنم؟؟؟ زبان برنامه نويسي من وي بي دات نت هست. اگه چنين كامپوننتي رو داري لطفا در اختيار منم بزار.
با تشكر

kavir
14-01-2009, 13:21
سلام
اگه ارتباط خیلی سریع و راحت می خواهید توی انجمن avr309 جستجو کنید فقط برنامه میکرو اسمبلی هست و لی ارتباط خیلی راحت هست و یا توی گوگل avrcdc بگردید اونم ارتباطش راحته که برنامه میکرو اون با winavr و یک پورت com مجازی می سازه و بسادگی می تونید ارتباط برقرار کنید
موفق باشید

araboy
03-03-2011, 03:40
با سلام
اگه بخواهیم برای انتقال های بیشتر از 2 بایت از تابع های read ,write در برنامه میکرو استفاده کنیم برنامه سمت کامپیوتر رو در #c چطور باید بنویسیم
ممنون میشم اگه راهنمایی کنید یا مرجعی به من معرفی کنید