PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : برنامه نویسی نرم افزار پروگرامر برای USBasp



behnam6500
10-02-2010, 02:12
سلام.

در این پست هم آموزش ساخت یه نرم افزار پروگرامر برای usbasp رو میخوام شروع کنم...

انشاالله در پایان، دوستان میتونن نرم افزار پروگرامری بنویسن که تمامی امور مربوط به پروگرام کردن رو انجام بده...

مانند خواندن از میکرو (فلش و eeprom) نوشتن در میکرو، erase میکرو و........

تا من اولین مطلب رو آماده میکنم، لطفا طریقه کار با کلاس UsbController رو یادبگیرین. چون آموزشها بر پایه اون کلاس هست... :wink:

راستی آموزشها به دو زبان VB.Net و #C هست.

morteza_rk
10-02-2010, 02:19
به به ، دیگه زدی تو خال مهندس؟!

من مدتهاست که دنبال این آموزش هستم ولی هیچکس نتونسته کمکم کنه ، دانشجوهای رشته ی نرم افزار که جای خود دارند من از اساتید هم سوال کردم ولی جوابهای نا مربوط شنیدم ، خودمم که عقلم قد نمیده :lol: اگه توی این بحث بتونم این مبحث رو یاد بگیرم عالی میشه.

خیلی گلی آقا بهنام.

behnam6500
10-02-2010, 17:30
مقدمه
دوستان همونطور که گفتم میخواهیم به نحوه برنامه نویسی یه پروگرامر بپردازیم. پروگرامر مورد نظر هم USBasp هست.

در این پست به مهندسی نرم افزار و GUI برنامه نمی پردازم. این به سلیقه شماست که چطوری برنامه رو طراحی کنید و بنویسید که مستلزم تجزیه و تحلیل سیستم هست.

هدف من تنها نحوه ارسال دستورات به میکرو می باشد برای انجام عملیاتهای مربوط به پروگرام کردن. مثلا اینکه بگم اگه میخواید میکرو رو Erase کنید، چه کارهایی باید انجام بدین و... فرض را هم بر این میگذاریم که با مقدمات زبانهای VB.Net و #C آشنایی دارید.


برنامه به وسیله اون کلاسی که معرفی کرده ام کار خواهد کرد. برای دریافت کلاس و آموزش های اون به این لینک مراجعه کنید

You can see links before reply

در زیر هم یه برنامه پروگرامر هست با نام EasyProg که خودم با استفاده از این کلاس نوشته ام. به عنوان نمونه اینجا میزارمش.

سورس برنامه میکروی USBASP رو هم میتونین از سایت مربوطه دانلود کنید (همراه با درایورهاش و نقشه شماتیک):

You can see links before reply

پیشنهاد میکنم اول از همه سورس برنامه میکرو رو یه نگاهی بندازین تا آمادگی واسش کسب بشه...

جلسه اول
ارتباطات بین نرم افزار و usbasp به وسیله کدهایی انجام میشه. با یه مثال ساده تر بگم: وقتیکه برنامه میخواد از حافظه فلش یا eeprom میکرو بخونه، اول کدی رو به میکرو ارسال میکنه تا پروگرامر بفهمه که میخواد چه کاری انجام بده و بعد به درخواست پاسخ بده.

توجه داشته باشید که ما فقط از نوع انتقال کنترلی استفاده میکنیم.

در زیر لیست کدهایی که برای کارمون نیاز هست آوردم:



#define USBASP_FUNC_CONNECT 1
#define USBASP_FUNC_DISCONNECT 2
#define USBASP_FUNC_TRANSMIT 3
#define USBASP_FUNC_READFLASH 4
#define USBASP_FUNC_ENABLEPROG 5
#define USBASP_FUNC_WRITEFLASH 6
#define USBASP_FUNC_READEEPROM 7
#define USBASP_FUNC_WRITEEEPROM 8


کد شماره 1: برای برقراری ارتباط با پروگرامر (میکرو در حالت آماده به کار قرار میگیره)
کد شماره 2: قطع ارتباط (حالت بیکاری میکرو)
کد شماره 3: برای انتقال یه سری دستورات و بایتها به میکرو و برعکس (مثلا برای پاک کردن حافظه و یا خوندن signature(
کد شماره 4: خوندن حافظه Flash
کد شماره 5: برای ورود به حالت برنامه ریزی میکرو
کد شماره 6: برای نوشتن در حافظه Flash
کد شماره 7: برای خوندن Eeprom
کد شماره 8: برای نوشتن در eeprom

نرم افزار ما به وسیله همین چندتا کد تمامی کارهای یه پروگرامر رو انجام میده. این کدها رو میتونین در سورس برنامه میکروی usbasp ببینید.

قبل از هر چیز، این متغیر ها رو در برنامه ایجاد کنید:
وی بی:



Dim BS As Integer = 7
Dim RWBlockSize As Byte = 253

Dim buf(BS) As Byte
Dim CMD(4) As Integer


سی شارپ:



int BS = 7; x
byte RWBlockSize = 253; x

byte[] buf = new byte[BS]; x
int[] CMD = new int[4]; x

متغیر BS فقط نگهدارنده مقدار 7 می باشد (یعنی 8 بیت). ازش استفاده میشه!
متغیر RWBlockSize مقدار 253 رو داره برای انتقالهای صفحه ای! کاربردش بعدا معلوم میشه.

متغیر buf که معرف حضور هست!
متغیر CMD برای زمانی که ما یک کد کنترلی میفرستیم و همراه اون کد نیاز داریم که چند بایتی هم به میکرو ارسال کنیم!

توی برنامه یه نوع داده ای شمارشی بصورت زیر ایجاد کنید:

وی بی:



Enum USBCommands
[USBASP_FUNC_CONNECT] = 1
[USBASP_FUNC_DISCONNECT] = 2
[USBASP_FUNC_TRANSMIT] = 3
[USBASP_FUNC_READFLASH] = 4
[USBASP_FUNC_ENABLEPROG] = 5
[USBASP_FUNC_WRITEFLASH] = 6
[USBASP_FUNC_READEEPROM] = 7
[USBASP_FUNC_WRITEEEPROM] = 8
End Enum


سی شارپ:



enum USBCommands
{
USBASP_FUNC_CONNECT = 1,
USBASP_FUNC_DISCONNECT = 2,
USBASP_FUNC_TRANSMIT = 3,
USBASP_FUNC_READFLASH = 4,
USBASP_FUNC_ENABLEPROG = 5,
USBASP_FUNC_WRITEFLASH = 6,
USBASP_FUNC_READEEPROM = 7,
USBASP_FUNC_WRITEEEPROM = 8
}


حالا میخوام یه سری توابع تعریف کنم برای برنامه تا کدهای مربوط به Connect شدن، Disconnect و ورود به مد برنامه ریزی و همچنین عملیات Transmitرو از برنامه به میکرو واسمون انجام بده:

برای Connect شدن (USBASP_FUNC_CONNECT):
وی بی:



Private Sub IspConnect()
USB.Transmit(UsbController.Programmer07.Net.USBCon troller.USBController.USBRequestType.Device_To_Hos t, _
USBCommands.USBASP_FUNC_CONNECT, CMD, buf, 300)
End Sub


سی شارپ:



private void IspConnect()
{
USB.Transmit(UsbController.Programmer07.Net.USBCon troller.USBController.USBRequestType.Device_To_Hos t, USBCommands.USBASP_FUNC_CONNECT, CMD, buf, 300);
}


برای Disconnect شدن (USBASP_FUNC_DISCONNECT):
وی بی:



Public Sub IspDisconnect()
USB.Transmit(UsbController.Programmer07.Net.USBCon troller.USBController.USBRequestType.Device_To_Hos t, _
USBCommands.USBASP_FUNC_DISCONNECT, CMD, buf, 300)
End Sub


سی شارپ:



public void IspDisconnect()
{
USB.Transmit(UsbController.Programmer07.Net.USBCon troller.USBController.USBRequestType.Device_To_Hos t, USBCommands.USBASP_FUNC_DISCONNECT, CMD, buf, 300);
}


برای ورود به مد برنامه ریزی (USBASP_FUNC_ENABLEPROG):
وی بی:



Public Sub EnterProgMode()
USB.Transmit(UsbController.Programmer07.Net.USBCon troller.USBController.USBRequestType.Device_To_Hos t, _
USBCommands.USBASP_FUNC_ENABLEPROG, CMD, buf, 300)
End Sub


سی شارپ:



public void EnterProgMode()
{
USB.Transmit(UsbController.Programmer07.Net.USBCon troller.USBController.USBRequestType.Device_To_Hos t, USBCommands.USBASP_FUNC_ENABLEPROG, CMD, buf, 300);
}


برای Transmit:
وی بی:



Public Function Spi(ByVal Byte_() As Byte) As Byte
Dim buf(4) As Byte
CMD(0) = Byte_(0)
CMD(1) = Byte_(1)
CMD(2) = Byte_(2)
CMD(3) = Byte_(3)

USB.Transmit(UsbController.Programmer07.Net.USBCon troller.USBController.USBRequestType.Device_To_Hos t, _
USBCommands.USBASP_FUNC_TRANSMIT, _
CMD, buf, 300)
Return buf(3)
End Function


سی شارپ:



public byte Spi(byte[] Byte_)
{
byte[] buf = new byte[4];
CMD[0] = Byte_[0])
CMD[1] = Byte_[1];
CMD[2] = Byte_[2];
CMD[3] = Byte_[3];

USB.Transmit(UsbController.Programmer07.Net.USBCon troller.USBController.USBRequestType.Device_To_Hos t, USBCommands.USBASP_FUNC_TRANSMIT, CMD, buf, 300);
return buf[3];
}


به وسیله این توابع، برنامه خیلی راحت این چند کد رو به میکرو میفرسته.
همه ساده هستند فقط یه توضیح در مورد تابع Spi بدم:
به وسیله این تابع میتونین چهار بایت علاوه بر کد کنترلی به میکرو بفرستین. از این تابع ما برای پاک کردن میکرو، خوندن Signature و خوندن فیوز بیتها و لاک بیتها استفاده میکنیم. در این کارها، نتیجه ای که میکرو به ما برمیگردونه در آخرین عنصر متغیر buf قرار میگیره...

انشاالله ادامه آموزش در پست بعدی قرار خواهد گرفت...

موفق باشید...:wink:

morteza_rk
10-02-2010, 18:18
عالیه مهندس:wink:

فقط یه کوچولو واضح تر بگو تا مبتدی هایی مثل من هم بفهمن.

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

behnam6500
12-02-2010, 02:28
جلسه دوم

در این جلسه میخوام به نحوه پاک کردن حافظه Flash و Eeprom میکرو و همینطور خوندن Signature بپردازم.

پاک کردن حافظه Flash و Eeprom
Erase کردن میکرو همونطور که میدونین شامل این دو بخش (فلش و eeprom) هست. یعنی زمانیکه میکرو دستور کدهای Erase رو دریافت میکنه، هر دو حافظه رو پاک میکنه.

برای پاک کردن حافظه ما از همون تابع Spi که تو جلسه اول معرفی کردم استفاده میکنیم...

مراحل پاک شدن حافظه:
مرحله 1: برقراری ارتباط با میکرو
مرحله 2: ورود به حالت برنامه ریزی
مرحله 3: ارسال به ترتیب کدهای AC , 80 , 0, 0 به میکرو (همیشه کدها در مبنای هگز هستند)
میکرو وقتیکه این کدها رو دریافت کنه حافظه Flash و Eeprom میکرو رو پاک میکنه.
مرحله 4: قطع ارتباط با میکرو

حالا با توجه به مراحلی که توضیح دادم، مرحله 1 و 2 و 4 رو در جلسه اول یاد گرفتیم. فقط میمونه مرحله 3 که توضیحش اینه:
من اینجا 4 تا کد دارم که باید بفرستم به میکرو تا حافظه پاک بشه. یه تابع دارم با نام Spi که عملیات Transmit رو انجام میده. تابع Spi دارای آرگومان ورودی آرایه ای از نوع بایت هست و خروجی تابع هم از نوع بایت.
فقط کافیه که این چها کد رو به آرگومان ورودی بدم تا میکرو پاک بشه!

برای این کار، یه آرایه با نام TransmitByte و با 4 عنصر از نوع بایت تعریف میکنم. خونه های آرایه رو با کدهای مربوطه مقدار دهی می کنم. بعد این آرایه رو میدم به آرگومان ورودی تابع Spi تا حافظه میکرو پاک بشه.

این از توضیح تئوری... برای فهم بهتر مطلب به تابعی که واسه عملیات Erase نوشتم دقت کنین:
وی بی:



Private Sub ChipErase()
IspConnect()
EnterProgMode()

Dim TransmitByte(3) As Byte
TransmitByte(0) = &HAC
TransmitByte(1) = &H80
TransmitByte(2) = &H0
TransmitByte(3) = &H0
Spi(TransmitByte)

IspDisconnect()
End Sub


سی شارپ:



private void ChipErase()
{
IspConnect();
EnterProgMode();

byte[] TransmitByte = new byte[3];
TransmitByte[0] = 0xac;
TransmitByte[1]= 0x80;
TransmitByte[2] = 0x0;
TransmitByte[3] = 0x0;
Spi(TransmitByte);

IspDisconnect();
}


از این ساده تر؟؟؟!!! :wink::wink::wink:
حالا دقیقا یاد گرفتیم که تابع Spi چطوری چهار بایت رو میفرسته به میکرو...
اول تابع پاک کردن حافظه رو گفتم چون خیلی ساده بود حالا میریم سراغ خوندن Signature. پیچیده تر از Erase هست ولی سادست...

مراحل خوندن Signature
همه میدونیم که Signature چی هستو نیازی به تعریف کردنش در اینجا نیست.

مراحلی که برای این کار نیازه:
مرحله 1: برقراری ارتباط با میکرو
مرحله 2: ورود به حالت برنامه ریزی
مرحله 3: ارسال یک عالمه کد به میکرو و دریافت نتیجه و انجام یه سری عملیات and و shift و or!
مرحله 4: قطع ارتباط با میکرو

محصول: جناب Signature

توضیح برای مرحله 3:
خود این مرحله رو به زیر مرحله هایی میشکنم:
A) ابتدا کدهای 30, 0, 0, 0 رو به ترتیب به میکرو می فرستیم.
B) دریافت یک بایت از میکرو پس از انجام مرحله قبل.
C) بایت رو 16 بار شیفت به چپ میدیم.
D) حاصل رو OR میکنیم با FF00FFFF.
E) حاصل مرحله قبل رو And میکنیم با FFFFFFFF.

F) ارسال کدهای 30, 0, 1, 0 به میکرو.
G) دریافت یک بایت از میکرو پس از انجام مرحله قبل.
H) بایت رو 8 بار شیفت به چپ میدیم.
I) حاصل رو OR میکنیم با FFFF00FF.
J) حاصل مرحله قبل رو And میکنیم با حاصل مرحله E.

K) ارسال کدهای 30, 0, 2, 0 به میکرو.
L) دریافت یک بایت از میکرو پس از انجام مرحله قبل.
M) بایت رو OR میکنیم با HFFFFFF00.
N) حاصل مرحله قبل رو And میکنیم با حاصل مرحله J.

O) حاصل نهایی And میشه با FFFFFF و کد Signature ما بدست می آید.

مراحل A-E برای بدست آوردن سمت چپ ترین Signature هست. F-J برای Signature وسط. K-N هم برای سمت راست هست.


این هم از این مراحل و توضیح تئوری... برای فهم بهتر مطلب به تابعی که واسه عملیات خوندن Signature نوشتم دقت کنین:
وی بی:



Private Function ChipReadSignature() As String
IspConnect()
EnterProgMode()

Dim ChipSignature As String = ""

Dim A As Long
Dim Signature As Long = &HFFFFFFFF
Dim TransmitByte(3) As Byte

TransmitByte(0) = &H30
TransmitByte(1) = &H0
TransmitByte(2) = &H0
TransmitByte(3) = &H0

A = Spi(TransmitByte)
A = A << 16
A = A Or &HFF00FFFF
Signature = Signature And A

TransmitByte(0) = &H30
TransmitByte(1) = &H0
TransmitByte(2) = &H1
TransmitByte(3) = &H0

A = Spi(TransmitByte)
A = A << 8
A = A Or &HFFFF00FF
Signature = Signature And A

TransmitByte(0) = &H30
TransmitByte(1) = &H0
TransmitByte(2) = &H2
TransmitByte(3) = &H0

A = Spi(TransmitByte)
A = A Or &HFFFFFF00
Signature = Signature And A

IspDisconnect()
ChipSignature = Hex((Signature And &HFFFFFF)).ToString.ToUpper
Return ChipSignature
End Function


سی شارپ:



private string ChipReadSignature()
{
IspConnect();
EnterProgMode();

string ChipSignature = "";

long A;
long Signature = 0xffffffff;
byte[] TransmitByte = new byte[3];

TransmitByte[0] = 0x30;
TransmitByte[1] = 0x0;
TransmitByte[2] = 0x0;
TransmitByte[3] = 0x0;

A = Spi(TransmitByte);
A = A << 16;
A = A | 0xff00ffff;
Signature = Signature & A;

TransmitByte[0] = 0x30;
TransmitByte[1] = 0x0;
TransmitByte[2] = 0x1;
TransmitByte[3] = 0x0;

A = Spi(TransmitByte);
A = A << 8;
A = A | 0xffff00ff;
Signature = Signature & A;

TransmitByte[0] = 0x30;
TransmitByte[1] = 0x0;
TransmitByte[2] = 0x2;
TransmitByte[3] = 0x0;

A = Spi(TransmitByte);
A = A | 0xffffff00;
Signature = Signature & A;

IspDisconnect();
ChipSignature = (Signature & 0xffffff).ToString("X6").ToUpper;
return ChipSignature;
}


این هم از جلسه دوم...
اینارو عملی کار کنین و نتیجه رو ببینین.
امیدوارم که در این تاپیک فقط من نباشم که پست میزاره!!!! :x

موفق باشید... :wink:

kavir
12-02-2010, 03:13
سلام
انشاءالله در اولین فرصت منم به جمع می یام فعلا در گیر گرافیک مجله هستیم
دستت درد نکنه من یکی طرفدار سرسخت این مبحث هستم:wink:

morteza_rk
12-02-2010, 13:18
مهندس شما به عنوان استاد پست میذاری ، ما هم هرجا که مشکل داشتیم مطرح می کنیم ، البته من نمی دونم که آیا بغیر از شما کسی دیگه ای به این مبحث اونم با کلاسی که شما خودت تعریف کردی تسلط داره یا نه؟ ولی من مثل یه شاگرد خوب بیشتر گوش میدم.

:wink: :roll:

behnam6500
12-02-2010, 14:54
مهندس شما به عنوان استاد پست میذاری ، ما هم هرجا که مشکل داشتیم مطرح می کنیم ، البته من نمی دونم که آیا بغیر از شما کسی دیگه ای به این مبحث اونم با کلاسی که شما خودت تعریف کردی تسلط داره یا نه؟ ولی من مثل یه شاگرد خوب بیشتر گوش میدم.

:wink: :roll:

کی گفته که من استادم؟؟؟ :x:x:x
کار با اون کلاس کاملا معلومه و دوستان هر طور که بخوان میتونن باهاش کار کنن.

morteza_rk
12-02-2010, 16:14
ببخشید شاگرد جان ، پس من خیلی کند ذهنم که کار با اون کلاس رو بلد نیستم. :0013: