سلام دوستان
خیلی ها دنبال اموزش درست کردن کتابخانه برای بسکام نیاز دارند خودم هم نیاز داشتم که پیداش کردم گفتم بزارم که شما هم استفاده کنید
مطالب این تایپ مربوط به تایپ این می باشد
http://www.eca.ir/forum2/index.php?topic=29360.0
نقل قول از alitaroosheh
سلام
من توی بحث پخش AVI یه لایبری برای بیسیک نوشتم خیلی با مزست :mrgreen: بیچاره میکنه تا راه بیافته
1. باید کاملا به اسمبلی avr مسلط باشید
2. یکم با نحوه کار کردن زبانهای سطح بالا از دید زبان اسمبلی آشنا باشید (یکم یعنی خیلی خیلی)
3. برید توی help بیسکام و Creating your own LIB file رو سرچ کنید یه توضیحاتی داده که همه چیز هست ولی تا حد امکان خلاصه
توش توضیح داده مثلا یه داده ورودی byref چطوری توی زیر برنامه در دسترسه و byval چطوری حالا اگه دو ورودی داشته باشید دومی چطوری آدرسش بدست میاد
این آدرس لایبری منه
http://www.electrorc.blogfa.com/post-30.aspx
واسه sdram PC133 کامپیوتر های قدیمی
چند تا نکته که اگه خواستید شروع کنید میگم که خیلی کمک میکنه:(من شدم خط شکن یه دو هفته ای روی این مطالب خودم سر کار بودم)
1. فقط و فقط توی NOTEPAD کد رو بنویسید (اگه توی محیط بیسکام بنویسید موقع کامپایل با ERROR های عجیب غریب برخورد میکنید)
2. ابتدا و انتهای توابع با [] مشخص میشن و توی اولش اسم تابع و توی آخریش END مینویسید و قبلش RET رو بنویسی
3. فایل رو توی مسیر نصب توی فولدر LIB بذارید و از منوی بیسکام TOOLS گزینه LIB MANAGER رو بزنید و اسم فایل شما رو که با .LIB هستش رو پیدا کنید و COMPILE توی این صفحه رو بزنید اگه خطا نباشه فایل .LBX تولید میشه اگه خطا فایل .ERR
4. اگه از پایه یا متغییری استفاده میکنید که قرار بیرون تعریف بشه باید دو کار رو همیشه انجام بدید یکی اینکه توی یه فایل که با پسوند .BAS هستش این تنظیمات رو بنویسی
مثلا:
LCD_CS ALIAS PORTB.0
و بعد توی کد نویسی هر جا خواستید از این نام مستعار استفاده کنید باید قبلش یه * بذارید
مثلا:
*SBI LCD_CS
از توابع خود بیسکام هم میشه به شکل خیلی محدود و گنگی استفاده کرد
برای این کار باید توی کد برنامه لایبری از کلید واژه *BASIC:
استفاده کنید
مثلا
*BASIC: A=A+B
دقت کنید که باید BASIC با حروف بزرگ باشه وگرنه ERROR دریافت میکنید
توی اون فایل پیکره بندی باید توابع در دسترس رو هم بنویسید که میشه اینطوری:
مثلا دو تا تابع دارید یکی هست RESET_GSM و دیگری هست SEND_GSM
برای اینکه بیسکام بدونه دو تا تابع با این نامها توی LIB در دسترس هستن باید اینطوری نوشت:
$EXTERNAL RESET_GSM,SEND_GSM
بعد باید تابع ها رو DECLARE کرد
مثلا:
DECLARE SUB RESET_GSM(BYREF A AS STRING)
راستی یه سری دستورات اسمبلی بدلیل نا معلومی توی بیسکام در دسترس نیستن پس اگه مثلا LD کار نکرد با دستورهای دیگه راهش بندازید
اینو نفهمیدم
مثلا اولش میتونید یکم توضیحات بذارید که کامپایل نشه
www = http://www.ElectroRC.blogfa.com
email = ali.taroosheh@gmail.com.com
libversion = 1.01
date = 23 march 2009
history = No known bugs.
comment = Synchronous DRAM , Design by Ali Taroosheh
بعد برای شروع تابع این شکلی شروع و پایان میدید مثلا
[SD_init]
SD_init:
.
.
.
ret
[end]
من برای توابع خودم اینا رو ذخیره میکردم شما هم بکنید
Push R12
Push R13
Push R14
Push R15
push r26
push r27
push r28
push r29
push r30
push r31
اینکار باید اول تابع انجام بشه و بعد از تابع قبل از ret بازیابی بشن اینطوری:
pop r31
pop r30
pop r29
pop r28
pop r27
pop r26
Pop R15
Pop R14
Pop R13
Pop R12
یادتون نره که استک lifo هستش یعنی اولین داده آخرین دادست پس به ترتیب push و pop های بالا دقت کنید
برای ارسال متغیر به تابع هم بهتره برید خود help رو کامل بخونید ... توضیح داده ولی فقط میگم که
من توی اون لایبری sdram که بالا لینکشو دادم یه فایل config_sdram.bas بود که توش نوشتم
$lib "SDRAM.lbx"
$external Sd_init , Sd_write , Sd_read
Declare Sub Sd_init()
Declare Sub Sd_write(array_pointer() As Byte , Byval Sd_position As Long , Byval Sd_length As Word)
Declare Sub Sd_read(array_pointer() As Byte , Byval Sd_position As Long , Byval Sd_length As Word)
پس سه تا تابع دارم یکی init یکی Read و دیگری write
اولی که ورودی نداره
دومی و سومی ورودی دارن اولی از جنس byref یا قابل تغییر (این نوع متغییر ها معمولا بعنوان خروجی اصلی تابع استفاده میشه یا فرستادن یک آرایه)
در اصل این نوع متغییر آدرسش ارسال میشه به تابع یا بقول c کارها پوینتر
دومی و سومین متغییر هم از نوع byval هستن یعنی یه کپی از اون متغییر به تابع ارسال میشه و مقدار اون متغییر بعد از فراخوانی ثابته و مقدار خودشو در تابع حفظ میکنه
حالا ... به ترتیب ورودی ها از آخر به اول میشه مقدار ورودی یا آدرسشو پیدا کرد
مثلا متغییر sd_length که آخریه اینطوری توی لایبری دیده میشه:
ldd Zl,Y+0
ldd Zh,Y+1
ld temp,Z
اگه temp رو مثلا r16 بدونیم مقدار اولین بایت sd_length توی Temp قرار داره
و اگه بنویسیم
adiw Zl,1
ld temp,Z
مقدار دومین بایت یا همون msb متغییر sd_length در دسترسه (توی temp کپی میشه)
متغییر دوم توی توابع بالا sd_position یه متغییر از جنس long که یعنی 4 بایتی
اینجوری با این ترتیب میتونید اولین بایت این متغییر رو پیدا کنید یا همون lsb
ldd Zl,Y+2
ldd Zh,Y+3
ld temp,Z
که اینجا هم lsb اون متغییر در temp قرار داره
به همین ترتیب میتونید با اضافه کردن عدد جمع شده به y بایتهای بعدی رو بدست بیارید
یعنی ldd temp,Z+1 میشه بایت دوم متغییر sd_position
و ldd temp,Z+2 میشه بایت سوم والی آخر...
برای اون متغییر اولی که پوینتری یا byref بود هم میتونید بنویسید
ldd Zl,Y+4
ldd Zh,Y+5
اینجا آدرس اولین بایت از آرایه array_pointer توی Z قرار داره (یادتون نره آدرس قرار داره نه داده)
در مورد متغییرهایی که بیرون توی config تعریف شدن هم باید با {} نشون بدید
مثلا برای اون آرایه بالا
ldd Zl,Y+4
ldd Zh,Y+5
*sts {Sd_pointer},zl
که بطور مثال sd_pointer توی فایل config_sdram به این شکل تعریف شده dim sd_pointer as word
دیگه مطلب زیادی در مورد لایبری زدن نیست فقط خروجی function که خودتون بخونید
و اینکه توابع بیسکام همشون درست کار نمیکنن (توی برنامه های بالا مشخص حرفه ای ها میتونن تشخیص بدن یکم برنامه کج و ماوج نوشته شده)
در مورد دستورات اسمبلی هم باید Avrstudio رو باز کنید که توی help قسمت avr toolt user guide قسمت Assembler رو انتخاب کنید داخل user's guide روی instruction کلیک کنید همه دستورات هستن با یه مثال توضیح داده دنبال کتاب و چیز دیگه هم نرید که این رفرنس بهترین و بهترین و بهترین رفرنسه
حالا مطالب مربوط به هلپ بسکام که باید یکی ترجمه کنه
Action
Informs the compiler about the used libraries.
Syntax
$LIB "libname1" [, "libname2"]
Remarks
Libname1 is the name of the library that holds ASM routines that are used by your program. More filenames can be specified by separating the names by a comma.
The specified libraries will be searched when you specify the routines to use with the $EXTERNAL directive.
The search order is the same as the order you specify the library names.
The MCS.LBX will be searched last and is always included so you don't need to specify it with the $LIB directive.
Because the MCS.LBX is searched last you can include duplicate routines in your own library. These routines will be used instead of the ones from the default MCS.LBX library. This is a good way when you want to enhance the MCS.LBX routines. Just copy the MCS.LIB to a new file and make the changes in this new file. When we make changes to the library your changes will be preserved.
Creating your own LIB file
A library file is a simple ASCII file. It can be created with the BASCOM editor, notepad or any other ASCII editor.
When you use BASCOM, make sure that the LIB extension is added to the Options, Environment, Editor, "No reformat extension".
This will prevent the editor to reformat the LIB file when you open it.
The file must include the following header information. It is not used yet but will be later.
copyright = Your name
www = optional location where people can find the latest source
email = your email address
comment = AVR compiler library
libversion = the version of the library in the format : 1.00
date = date of last modification
statement = A statement with copyright and usage information
The routine must start with the name in brackets and must end with the [END].
The following ASM routine example is from the MYLIB.LIB library.
[test]
Test:
ldd r26,y+2 ; load address of X
ldd r27,y+3
ld r24,x ; get value into r24
Inc r24 ; value + 1
St x,r24 ; put back
ldd r26,y+0 ; address of Y
ldd r27,y+1
st x,r24 ; store
ret ; ready
[END]
After you have saved your library in the LIB subdirectory you must compile it with the LIB Manager. Or you can include it with the LIB extension in which case you don’t have to compile it.
About the assembler.
When you reference constants that are declared in your basic program you need to put a star(*) before the line.
'basic program
CONST myconst = 7
'asm lib
* sbi portb, myconst
By adding the *, the line will be compiled when the basic program is compiled. It will not be changed into object code in the LBX file.
When you use constants you need to use valid BASIC constants:
Ldi r24,12
Ldi r24, 1+1
Ldi r24, &B001
Ldi r24,0b001
Ldi r24,&HFF
Ldi r24,$FF
Ldi r24,0xFF
Other syntax is NOT supported.
See also
$EXTERNAL
Example
$regfile = "m48def.dat"
$crystal = 4000000
$baud = 19200
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'In order to let this work you must put the mylib.lib file in the LIB dir
'And compile it to a LBX
'-------------------------------------------------------------------------
'define the used library
$lib"mylib.lbx"
'you can also use the original ASM :
'$LIB "mylib.LIB"
'also define the used routines
$external Test
'this is needed so the parameters will be placed correct on the stack
Declare Sub Test(byval X Asbyte , Y Asbyte)
'reserve some space
Dim Z As Byte
'call our own sub routine
Call Test(1 , Z)
'z will be 2 in the used example
End
حالا یکی از دوستان یه کتابخانه درست کنه بزاره به عنوان مثال
خیلی ها دنبال اموزش درست کردن کتابخانه برای بسکام نیاز دارند خودم هم نیاز داشتم که پیداش کردم گفتم بزارم که شما هم استفاده کنید
مطالب این تایپ مربوط به تایپ این می باشد
http://www.eca.ir/forum2/index.php?topic=29360.0
نقل قول از alitaroosheh
سلام
من توی بحث پخش AVI یه لایبری برای بیسیک نوشتم خیلی با مزست :mrgreen: بیچاره میکنه تا راه بیافته
1. باید کاملا به اسمبلی avr مسلط باشید
2. یکم با نحوه کار کردن زبانهای سطح بالا از دید زبان اسمبلی آشنا باشید (یکم یعنی خیلی خیلی)
3. برید توی help بیسکام و Creating your own LIB file رو سرچ کنید یه توضیحاتی داده که همه چیز هست ولی تا حد امکان خلاصه
توش توضیح داده مثلا یه داده ورودی byref چطوری توی زیر برنامه در دسترسه و byval چطوری حالا اگه دو ورودی داشته باشید دومی چطوری آدرسش بدست میاد
این آدرس لایبری منه
http://www.electrorc.blogfa.com/post-30.aspx
واسه sdram PC133 کامپیوتر های قدیمی
چند تا نکته که اگه خواستید شروع کنید میگم که خیلی کمک میکنه:(من شدم خط شکن یه دو هفته ای روی این مطالب خودم سر کار بودم)
1. فقط و فقط توی NOTEPAD کد رو بنویسید (اگه توی محیط بیسکام بنویسید موقع کامپایل با ERROR های عجیب غریب برخورد میکنید)
2. ابتدا و انتهای توابع با [] مشخص میشن و توی اولش اسم تابع و توی آخریش END مینویسید و قبلش RET رو بنویسی
3. فایل رو توی مسیر نصب توی فولدر LIB بذارید و از منوی بیسکام TOOLS گزینه LIB MANAGER رو بزنید و اسم فایل شما رو که با .LIB هستش رو پیدا کنید و COMPILE توی این صفحه رو بزنید اگه خطا نباشه فایل .LBX تولید میشه اگه خطا فایل .ERR
4. اگه از پایه یا متغییری استفاده میکنید که قرار بیرون تعریف بشه باید دو کار رو همیشه انجام بدید یکی اینکه توی یه فایل که با پسوند .BAS هستش این تنظیمات رو بنویسی
مثلا:
LCD_CS ALIAS PORTB.0
و بعد توی کد نویسی هر جا خواستید از این نام مستعار استفاده کنید باید قبلش یه * بذارید
مثلا:
*SBI LCD_CS
از توابع خود بیسکام هم میشه به شکل خیلی محدود و گنگی استفاده کرد
برای این کار باید توی کد برنامه لایبری از کلید واژه *BASIC:
استفاده کنید
مثلا
*BASIC: A=A+B
دقت کنید که باید BASIC با حروف بزرگ باشه وگرنه ERROR دریافت میکنید
توی اون فایل پیکره بندی باید توابع در دسترس رو هم بنویسید که میشه اینطوری:
مثلا دو تا تابع دارید یکی هست RESET_GSM و دیگری هست SEND_GSM
برای اینکه بیسکام بدونه دو تا تابع با این نامها توی LIB در دسترس هستن باید اینطوری نوشت:
$EXTERNAL RESET_GSM,SEND_GSM
بعد باید تابع ها رو DECLARE کرد
مثلا:
DECLARE SUB RESET_GSM(BYREF A AS STRING)
راستی یه سری دستورات اسمبلی بدلیل نا معلومی توی بیسکام در دسترس نیستن پس اگه مثلا LD کار نکرد با دستورهای دیگه راهش بندازید
اینو نفهمیدم
مثلا اولش میتونید یکم توضیحات بذارید که کامپایل نشه
www = http://www.ElectroRC.blogfa.com
email = ali.taroosheh@gmail.com.com
libversion = 1.01
date = 23 march 2009
history = No known bugs.
comment = Synchronous DRAM , Design by Ali Taroosheh
بعد برای شروع تابع این شکلی شروع و پایان میدید مثلا
[SD_init]
SD_init:
.
.
.
ret
[end]
من برای توابع خودم اینا رو ذخیره میکردم شما هم بکنید
Push R12
Push R13
Push R14
Push R15
push r26
push r27
push r28
push r29
push r30
push r31
اینکار باید اول تابع انجام بشه و بعد از تابع قبل از ret بازیابی بشن اینطوری:
pop r31
pop r30
pop r29
pop r28
pop r27
pop r26
Pop R15
Pop R14
Pop R13
Pop R12
یادتون نره که استک lifo هستش یعنی اولین داده آخرین دادست پس به ترتیب push و pop های بالا دقت کنید
برای ارسال متغیر به تابع هم بهتره برید خود help رو کامل بخونید ... توضیح داده ولی فقط میگم که
من توی اون لایبری sdram که بالا لینکشو دادم یه فایل config_sdram.bas بود که توش نوشتم
$lib "SDRAM.lbx"
$external Sd_init , Sd_write , Sd_read
Declare Sub Sd_init()
Declare Sub Sd_write(array_pointer() As Byte , Byval Sd_position As Long , Byval Sd_length As Word)
Declare Sub Sd_read(array_pointer() As Byte , Byval Sd_position As Long , Byval Sd_length As Word)
پس سه تا تابع دارم یکی init یکی Read و دیگری write
اولی که ورودی نداره
دومی و سومی ورودی دارن اولی از جنس byref یا قابل تغییر (این نوع متغییر ها معمولا بعنوان خروجی اصلی تابع استفاده میشه یا فرستادن یک آرایه)
در اصل این نوع متغییر آدرسش ارسال میشه به تابع یا بقول c کارها پوینتر
دومی و سومین متغییر هم از نوع byval هستن یعنی یه کپی از اون متغییر به تابع ارسال میشه و مقدار اون متغییر بعد از فراخوانی ثابته و مقدار خودشو در تابع حفظ میکنه
حالا ... به ترتیب ورودی ها از آخر به اول میشه مقدار ورودی یا آدرسشو پیدا کرد
مثلا متغییر sd_length که آخریه اینطوری توی لایبری دیده میشه:
ldd Zl,Y+0
ldd Zh,Y+1
ld temp,Z
اگه temp رو مثلا r16 بدونیم مقدار اولین بایت sd_length توی Temp قرار داره
و اگه بنویسیم
adiw Zl,1
ld temp,Z
مقدار دومین بایت یا همون msb متغییر sd_length در دسترسه (توی temp کپی میشه)
متغییر دوم توی توابع بالا sd_position یه متغییر از جنس long که یعنی 4 بایتی
اینجوری با این ترتیب میتونید اولین بایت این متغییر رو پیدا کنید یا همون lsb
ldd Zl,Y+2
ldd Zh,Y+3
ld temp,Z
که اینجا هم lsb اون متغییر در temp قرار داره
به همین ترتیب میتونید با اضافه کردن عدد جمع شده به y بایتهای بعدی رو بدست بیارید
یعنی ldd temp,Z+1 میشه بایت دوم متغییر sd_position
و ldd temp,Z+2 میشه بایت سوم والی آخر...
برای اون متغییر اولی که پوینتری یا byref بود هم میتونید بنویسید
ldd Zl,Y+4
ldd Zh,Y+5
اینجا آدرس اولین بایت از آرایه array_pointer توی Z قرار داره (یادتون نره آدرس قرار داره نه داده)
در مورد متغییرهایی که بیرون توی config تعریف شدن هم باید با {} نشون بدید
مثلا برای اون آرایه بالا
ldd Zl,Y+4
ldd Zh,Y+5
*sts {Sd_pointer},zl
که بطور مثال sd_pointer توی فایل config_sdram به این شکل تعریف شده dim sd_pointer as word
دیگه مطلب زیادی در مورد لایبری زدن نیست فقط خروجی function که خودتون بخونید
و اینکه توابع بیسکام همشون درست کار نمیکنن (توی برنامه های بالا مشخص حرفه ای ها میتونن تشخیص بدن یکم برنامه کج و ماوج نوشته شده)
در مورد دستورات اسمبلی هم باید Avrstudio رو باز کنید که توی help قسمت avr toolt user guide قسمت Assembler رو انتخاب کنید داخل user's guide روی instruction کلیک کنید همه دستورات هستن با یه مثال توضیح داده دنبال کتاب و چیز دیگه هم نرید که این رفرنس بهترین و بهترین و بهترین رفرنسه
حالا مطالب مربوط به هلپ بسکام که باید یکی ترجمه کنه
Action
Informs the compiler about the used libraries.
Syntax
$LIB "libname1" [, "libname2"]
Remarks
Libname1 is the name of the library that holds ASM routines that are used by your program. More filenames can be specified by separating the names by a comma.
The specified libraries will be searched when you specify the routines to use with the $EXTERNAL directive.
The search order is the same as the order you specify the library names.
The MCS.LBX will be searched last and is always included so you don't need to specify it with the $LIB directive.
Because the MCS.LBX is searched last you can include duplicate routines in your own library. These routines will be used instead of the ones from the default MCS.LBX library. This is a good way when you want to enhance the MCS.LBX routines. Just copy the MCS.LIB to a new file and make the changes in this new file. When we make changes to the library your changes will be preserved.
Creating your own LIB file
A library file is a simple ASCII file. It can be created with the BASCOM editor, notepad or any other ASCII editor.
When you use BASCOM, make sure that the LIB extension is added to the Options, Environment, Editor, "No reformat extension".
This will prevent the editor to reformat the LIB file when you open it.
The file must include the following header information. It is not used yet but will be later.
copyright = Your name
www = optional location where people can find the latest source
email = your email address
comment = AVR compiler library
libversion = the version of the library in the format : 1.00
date = date of last modification
statement = A statement with copyright and usage information
The routine must start with the name in brackets and must end with the [END].
The following ASM routine example is from the MYLIB.LIB library.
[test]
Test:
ldd r26,y+2 ; load address of X
ldd r27,y+3
ld r24,x ; get value into r24
Inc r24 ; value + 1
St x,r24 ; put back
ldd r26,y+0 ; address of Y
ldd r27,y+1
st x,r24 ; store
ret ; ready
[END]
After you have saved your library in the LIB subdirectory you must compile it with the LIB Manager. Or you can include it with the LIB extension in which case you don’t have to compile it.
About the assembler.
When you reference constants that are declared in your basic program you need to put a star(*) before the line.
'basic program
CONST myconst = 7
'asm lib
* sbi portb, myconst
By adding the *, the line will be compiled when the basic program is compiled. It will not be changed into object code in the LBX file.
When you use constants you need to use valid BASIC constants:
Ldi r24,12
Ldi r24, 1+1
Ldi r24, &B001
Ldi r24,0b001
Ldi r24,&HFF
Ldi r24,$FF
Ldi r24,0xFF
Other syntax is NOT supported.
See also
$EXTERNAL
Example
$regfile = "m48def.dat"
$crystal = 4000000
$baud = 19200
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'In order to let this work you must put the mylib.lib file in the LIB dir
'And compile it to a LBX
'-------------------------------------------------------------------------
'define the used library
$lib"mylib.lbx"
'you can also use the original ASM :
'$LIB "mylib.LIB"
'also define the used routines
$external Test
'this is needed so the parameters will be placed correct on the stack
Declare Sub Test(byval X Asbyte , Y Asbyte)
'reserve some space
Dim Z As Byte
'call our own sub routine
Call Test(1 , Z)
'z will be 2 in the used example
End
حالا یکی از دوستان یه کتابخانه درست کنه بزاره به عنوان مثال
دیدگاه