PDA

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



mapmap
13-09-2011, 21:44
با سلام
تو این برنامه ساده موندم
میخوام PortC.0 برای 50 بار به سرعت چشمک بزنه 0بعد از اون با سرعتی ملایم چشمک بزنه
باید چکار کنم؟؟؟ اصلا" تو بسکام چطور میشه چنتا DO-Loop داشته باشم؟؟؟
اینم برنامه:
Dim I As Byte
I = 1
Do
Incr I
Set Portc.0
Waitms 5
Toggle Portc.0
Loop Until I = 50
Exit Do
Do
Set Portc.0
Waitms 60
Toggle Portc.0
Loop
End

madar
13-09-2011, 21:48
شما می تونید از حلقه ی for -next برای اینکار استفاده کنید.مثلا 50 بار حلقه ی اول را تکرار کند بعد وارد for-next بعدی بشه.

vahidasm
14-09-2011, 01:32
میتونید برای اینکه برنامه کم حجمتر بشه مقدار زمان رو تو یه متغیر ذخیره کنی و بعد از for-next مقدارشو تغییر بدی و دوباره به اول for-next برگردی

raminrayat
24-09-2011, 10:56
سلام به دوستان.من دنبال یه برنامه pid کنترلر می گشتم .و بالاخره پیداش کردم اما به زبان c و با کدویژن نوشته .خودم اون رو دستو پا شکسته با بیسیک نوشتم.البته فعلا بدون کیپد. ولی دما رو به جای اینکه دقیقا رو مقدار ست پوینت نگه داره ! 4 الی 6 درجه دما بیشتر از setpoint میشه چون من زبان c بلد نبودم نتونستم علت رو با مقایسه با برنامه اصلی بفهمم .لطفا راهنماییم کنید.
اولی برنامه اصلی از سایت picpars.com
دومی برنامه نوشته شده با بیسیک

:hi: دوستان خواهش می کنم بعد از دانلود فایل بگید مشکل برنامه من تو بیسیک چیه.یا اگه راه بهتری مد نظرتونه بگید.

raminrayat
24-09-2011, 12:41
:hi:منتظر راهنماییتونم

mahdi_91
08-12-2011, 21:48
سلام
من تازه دارم بسکام یاد میگیرم میخواسم از دوستان کمک بگیرم ...
کسی میتونه این قسمت از برنامه ی دماسنج رو تحلیل کنه
Start Adc
B = 1
Enable Interrupts
Enable Timer2

On Timer2 K
Start Timer2
'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''
Cls
Cursor Off

Do

Loop

End
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''
K:

'''''''''''''''''''''''''''''''''''''
A = Getadc(0)
A = A / 2
Locate 2 , 1
Lcd "Temp =" ; A ; Chr(0) ; "c "
Locate 2 , 16
Lcd Chr(b)

Incr B
If B > 6 Then B = 1

mahdi_91
08-12-2011, 21:56
کل برنامه ای هستش

$regfile = "m16def.dat"

Config Portb = Input
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , Rs = Portd.3 , E = Portd.2
Config Timer2 = Timer , Async = On , Prescale = 128
Config Adc = Single , Prescaler = Auto

'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''
Dim Secs As Byte , Minits As Byte , Hours As Byte
Dim A As Word , B As Byte
'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''
Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32
Deflcdchar 1 , 32 , 4 , 12 , 28 , 28 , 32 , 32 , 32
Deflcdchar 2 , 32 , 4 , 14 , 31 , 31 , 32 , 32 , 32
Deflcdchar 3 , 32 , 4 , 14 , 31 , 31 , 7 , 6 , 4
Deflcdchar 4 , 32 , 4 , 14 , 31 , 31 , 31 , 14 , 4
Deflcdchar 5 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 32


Start Adc
B = 1
Enable Interrupts
Enable Timer2

On Timer2 K
Start Timer2
'''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''
Cls
Cursor Off

Do

Loop

End
'''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''
K:

'''''''''''''''''''''''''''''''''''''
A = Getadc(0)
A = A / 2
Locate 2 , 1
Lcd "Temp =" ; A ; Chr(0) ; "c "
Locate 2 , 16
Lcd Chr(b)

Incr B
If B > 6 Then B = 1

'''''''''''''''''''''''''''''''''''''
Incr Secs
If Secs > 59 Then
Incr Minits
Secs = 0
If Minits > 59 Then
Incr Hours
Minits = 0
Secs = 0
If Hours > 23 Then
Hours = 0
Secs = 0
Minits = 0
End If
End If
End If
If Pinb.2 = 1 Then
Secs = 0
Elseif Pinb.0 = 1 Then
Incr Minits
Elseif Pinb.1 = 1 Then
Incr Hours
End If

Locate 1 , 1
If Hours < 10 Then
Lcd "0" ; Hours ; ":"
Else
Lcd Hours ; ":"
End If
If Minits < 10 Then
Lcd "0" ; Minits ; ":"
Else
Lcd Minits ; ":"
End If
If Secs < 10 Then
Lcd "0" ; Secs
Else
Lcd Secs
End If

Return

morteza_rk
09-12-2011, 01:05
تو این برنامه ساده موندم
میخوام PortC.0 برای 50 بار به سرعت چشمک بزنه 0بعد از اون با سرعتی ملایم چشمک بزنه
باید چکار کنم؟؟؟ اصلا" تو بسکام چطور میشه چنتا DO-Loop داشته باشم؟؟؟

سلام
فکر کنم نوبتی به سوالات جواب بدیم بهتره!

در این مورد چون تعداد تکرارها از قبل مشخصه بهترین حالت استفاده از حلقه for-next هست. و همینطور تعریف یه متغیر که هربار با تغییر محتواش بشه زمان چشمک زدنهارو کنترل کرد.

نکته : اگه زمان چشمک زدنها تقریبا کمتر از 20 میلی ثانیه باشه ، چشم ما نمی تونه خاموش شدن led رو تشخیص بده! (طبق اثر فلیکر) بنابراین ما فکر می کنیم که led همیشه روشنه. پس استفاده از مقادیر زیر 20 میلی ثانیه توصیه نمیشه.

اما برنامه ی شما می تونه بصورت زیر اصلاح بشه :




config portc.0=output

dim i as byte
dim wait1 as byte

do

wait1=50

for i=1 to 50
portc.0=1
waitms wait1
portc.0=0
waitms wait1
next

wait1=120

for i=1 to 50
portc.0=1
waitms wait1
portc.0=0
waitms wait1
next

loop

end

morteza_rk
09-12-2011, 01:13
سلام به دوستان.من دنبال یه برنامه pid کنترلر می گشتم .و بالاخره پیداش کردم اما به زبان c و با کدویژن نوشته .خودم اون رو دستو پا شکسته با بیسیک نوشتم.البته فعلا بدون کیپد. ولی دما رو به جای اینکه دقیقا رو مقدار ست پوینت نگه داره ! 4 الی 6 درجه دما بیشتر از setpoint میشه چون من زبان c بلد نبودم نتونستم علت رو با مقایسه با برنامه اصلی بفهمم .لطفا راهنماییم کنید.

راستش من برنامه رو دانلود کردم ، نگاه هم کردم ، ولی چیزی نفهمیدم! خیلی ضرب و تقسیم و جمع و تفریق و ... انجام داده ، آخرش که چی؟ اصلا چی می خواسته طرف؟

البته این پست و پست قبلی جواب کسانیه که چند ماه پیش سوالشونو مطرح کردن ، ولی من الان جواب دادم (قبلا ندیده بودم) شاید بعدها بدرد کسی بخوره ، حداقلش اینه که این تاپیک بیهوده نمی مونه.

morteza_rk
09-12-2011, 01:21
سلام
من تازه دارم بسکام یاد میگیرم میخواسم از دوستان کمک بگیرم ...
کسی میتونه این قسمت از برنامه ی دماسنج رو تحلیل کنه

تحلیل خاصی نداره! یه سنسور دمای آنالوگ داریم که وصل شده به مبدل آنالوگ به دیجیتال شماره 0 میکرو ، دستور a=getadc(0) مقدار آنالوگی که به دیجیتال تبدیل شده رو می خونه و می ریزه توی متغیر A ، بعدش طبق رابطه ای که برنامه نویس بدست آورده تقسیم بر 2 کرده تا بشه مقدار واقعی دما ، بعد این مقدار رو روی lcd نشون داده.

یه کاراکتر درجه (همون دایره کوچولو) با دستور Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32 درست کرده که اونم جلوی عدد دما روی lcd نشون میده ، با دستور lcdchr(0) ، همین.

hetler
09-12-2011, 02:40
با سلام
سوالم مبتدیانه است
چگونه می توان در میکرو دو حلقه را هم زمان اجرا کرد
مثلا یک پایه هر 50 میلی ثانیه 0 و1 شود ویک پایه دیگر هر 100 میل ثانیه0 و1 شود
بدون اینکه حلقه ها تک تک اجرا شود؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟

morteza_rk
09-12-2011, 13:57
چگونه می توان در میکرو دو حلقه را هم زمان اجرا کرد
مثلا یک پایه هر 50 میلی ثانیه 0 و1 شود ویک پایه دیگر هر 100 میل ثانیه0 و1 شود
بدون اینکه حلقه ها تک تک اجرا شود؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟

در یک میکروکنترلر نمیشه دو حلقه رو همزمان اجرا کرد! چون منطقی که میکروکنترلرها ازش پیروی می کنن طوریه که برنامه رو خط به خط اجرا می کنه. نمیشه که همزمان چند خط با هم اجرا بشن! بنابراین همیشه اول حلقه ای که در خطوط قبل از حلقه ی دوم نوشته شده اجرا میشه و بعدش حلقه ی دوم اجرا میشه.

اما فکر می کنم که پردازنده های fpga می تونن همزمان چند خط رو اجرا کنن! علتشم اینه که اونجا زبان برنامه نویسی درواقع مثل مدارهای دیجیتال می مونه! یعنی ورودی ها می تونن برابر یا مستقل باشن و خروجی ها هم همینطور.

مثلا شما یک آی.سی 7408 رو در نظر بگیرید. توی این آی.سی 4 تا گیت and هست. بطوریکه شما می تونید از هرکدوم به تنهایی استفاده کنید یا به همشون ورودی یکسان (یا غیر یکسان) بدید و در یک لحظه ازشون خروجی بگیرید. بدون اینکه خروجی ها بهم ربطی داشته باشن. (اما همزمان انجام میشن).

اما مثالی که شما زدید راه حل داره و سادست! شما می تونید یه حلقه درست کنید که داخلش به ازای هر 2 بار چشمک زدن یکی از پایه ها ، پایه ی بعدی یکبار چشمک بزنه!

mahdi_91
11-12-2011, 22:19
تحلیل خاصی نداره! یه سنسور دمای آنالوگ داریم که وصل شده به مبدل آنالوگ به دیجیتال شماره 0 میکرو ، دستور a=getadc(0) مقدار آنالوگی که به دیجیتال تبدیل شده رو می خونه و می ریزه توی متغیر a ، بعدش طبق رابطه ای که برنامه نویس بدست آورده تقسیم بر 2 کرده تا بشه مقدار واقعی دما ، بعد این مقدار رو روی lcd نشون داده.

یه کاراکتر درجه (همون دایره کوچولو) با دستور deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32 درست کرده که اونم جلوی عدد دما روی lcd نشون میده ، با دستور lcdchr(0) ، همین.
ممنون ...متغییر b تو تایمر نقشش چیه؟

mehrdad22
13-12-2011, 03:10
سلام به همه
من توی بسکام برنامه ای نوشتم ، البته هنوز کامل نیستا
ولی نباید error بگیره ولی میگیره!!!:unh::baad:
از دستور alias استفاده کردم و ازهمون دستور هم ارور میگیره


$regfile = "m8def.dat"
$crystal = 8000000

Config Portd = Input
Config Portb = Output

Dim R As Bit
Dim V As Bit
Dim L As Bit

R Alias Pind.7
V Alias Pind.3
L Alias Pind.0

If V = 1 Then

Set Portb.7
Reset portb.6
Set portb.5
Reset portb.4
Set portb.1
Set portb.2


Elseif R = 1 And V = 0 Then
Reset portb.7
Set portb.6
Set portb.5
Reset portb.4
Set portb.1
Set Portb.2


End If


و این هم ارور ها :

ALIAS can not be CONST or DIMMED variable[R]
ALIAS can not be CONST or DIMMED variable[V]
دوستان لطفا کمک کنید:(

ali_h
06-01-2012, 18:16
سلام، نیازی نیست وقتی می خوای از alias استفاده کنی قبلش بیای یک متغیر با همون نام تعریف کنی. یعنی این 3 خط را باید حذف کنی :


Dim R As Bit
Dim V As Bit
Dim L As Bit


در واقع کامپایلر قبل از کامپایل می گرده و تمام کلمه هایی را که alias کردی با مقدار ثابت متناظرشون جایگزین می کنه و بعد برنامه شما را کامپایل می کنه.
به بیان دیگه alias کردن نه حجم برنامتون رو زیاد می کنه و نه میزان استفاده از sram میکرو رو.

ali_h
06-01-2012, 18:29
با سلام
سوالم مبتدیانه است
چگونه می توان در میکرو دو حلقه را هم زمان اجرا کرد
مثلا یک پایه هر 50 میلی ثانیه 0 و1 شود ویک پایه دیگر هر 100 میل ثانیه0 و1 شود
بدون اینکه حلقه ها تک تک اجرا شود؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟ اصولاً نه میکرو و نه هیچ موجود تک پردازنده ای دیگه ای (یعنی حتی پردازشگرهای کامپیوتری چند گیگاهرتزی چند سال پیش!) نمی تونن چند دستوزالعمل رو دقیقاً همزمان اجرا کنن این هنر برنامه نویسی که قابلیت Multitasking رو به سخت افزار ها اضافه کرده
شما هم اگر علاوه بر این چشمک زدن ها می خواید میکروتون همزمان کارهای دیگه ای هم انجام بده باید از تایمر یا اینتراپت های میکرو استفاده کنید. در غیر این صورت راه حل morteza_rk کاملاً درسته.
من پایه قضیه گفتم که به نظر پیچیده میاد ولی اگه بدردتون می خوره بگید توضیح ساده تر و کاربردی تری بدم.

ali_h
06-01-2012, 18:41
ممنون ...متغییر b تو تایمر نقشش چیه؟

با کمک این متغیر در سطر دوم و ستون 16 ام در هر ثانیه یکی از 6 کاراکتری که در بالا تعریف شده نمایش داده می شه. در واقع انگار که برنامه نویس می خواسته یک انیمیشن کاراکتری گوشه ال سی دی نشون بده.

explore77
24-08-2012, 21:34
آقا من يه برنامه اي نوشتم كه اواسط برنامه وقتي ميرسه به اين جا:
If A > F Then
For W = 1 To 5
Rotate Portd , Left , 1
Waitms 500
Toggle Portb.5
Next
End If
با وجود اينكه شرط برقرار وارد حلقه for نميشه
حالا وقتي شبيه سازيش ميكنم همه چي اجرا ميشه ولي تو عمل وارد حلقه نميشه
آيا اين نوع برنامه نويسي مشكل فني داره ؟
اگه بخوام واضح تر بپرسم ميشه تو داخل يه شرط از حلقه for استفاده كرد؟ اگه نه راه حل چيه.با تشكر

alinavidy
03-09-2012, 23:53
با سلام You can see links before reply
من یه مشکل در برنامه نویسی بسکام avr دارم اگه کسی بتونه مشکل من رو حل کنه ممنونش میشم.12:
من یه پروژه ای دارم که میخوام یه سری اطلاعات رو نگه داره و با قطع برق(ریست میکرو) اطلاعاتش پاک نشهYou can see links before reply .... برای این کار هم رفتم از eeprom استفاده کردم که بایدفایل eep رو که bascom در خروجیش میده رو باید رو میکرو پروگرام کنم. ولی متاسفاته وقتی که کامپیلر میکنمbascom یه سری فایل رو میده(hex,...) ولی فایل eep رو بهم نمیده یه نمونه برنامه در هلپ بسکام گذاشته بود که وقتی اون رو کامپایل میکردم eep رو بهم میداد...
تو اینترنت هم یه سری نمونه گذاشته بود که اونها هم فایل eep نمیداد...
نمیدونم چی کار کنم . شاید یه سری چیزا رو رعایت نکرده ام .... البته بسکام هم هیچ اروری نمیده
من خواهش میکنم از کسایی که با ای حافظه کار کرده کند و جئاب گرفته اند و اطلاعاتی در این مورد دارند به من کمک کنند12You can see links before reply

morteza_rk
04-09-2012, 04:39
سلام

یعنی شما الان از دستورهای eeprom$ یا eepromhex$ استفاده کردی ولی کد مربوط به eeprom رو نمی گیری؟

alinavidy
04-09-2012, 19:47
سلام mortesa_rk ممنونم که جوابم رو دادی
من قبلا فکر می کردم باید فایل eep رو داخل eeprom باید بریزم مثل اینکه اینطور نیست و باید همون فایل hex رو ریخت (البته حدس میزنم) یه برنامه در هلپ بسکام بود اون رو کامپایل کردم و خروجیش هم eep , hex ,... داشت بعد اومدم فایل hex رو در قسمت eeprom ریختم رو میکرو و به درستی پروگرام شد و هیچ اروری نداد.
اینم برنامه ای داخل هلپ بسکام بود و جواب گرفتم:


$regfile = "2313def.dat"

$baud = 19200

$crystal = 4000000 ' 4 MHz crystal



Dim B As Byte

Readeeprom B , 0 'now B will be 1

End





Dta:

$eeprom

Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8

$data

End

مشکل اینجاست که من خودم که برنامه نوشته ام و میخوام هکسش رو بریزم رو میکرو ارور میده
error.png (You can see links before reply) (28.0 کیلوبایت)

اینم برنامش:



$regfile = "m32def.dat"
$baud = 19200
$crystal = 4000000
$lib "glcdKS108.lib"
Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Ce = 2 , _
Ce2 = 3 , Cd = 6 , Rd = 5 , Reset = 1 , Enable = 4

Cls
Dim A As Byte , C As Byte

Do
Writeeeprom C , 1
Waitms 500
Setfont Font16x16
Readeeprom A , 1
Lcdat 1 , 1 , A
Incr C

Loop

Dta:
$eeprom

Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8
$data

End

$include "font16x16.font"


من خیلی مبتدی هستم و در مورد قوانین و شرایط eeprom میکرو نمی دانم
آیا دستوری باید میزاشم یا نباید بزارم ؟؟
لطفا کمک کنید
اگه میشه یه برنامه خیلی ساده بزارید که بشه عدد رو بشماره و رو lcd نمایش بده و با قطع برق و وصل مجدد دو باره ادامه شمارش رو طی کنه
بازهم از تمام دوستان به ویژه مرتضی تشکر میکنم

alinavidy
05-09-2012, 00:18
سلام دوست عزیز
من خیلی مبتدی هستم و نیاز به کمک شما دارم من میخوام میکرو یه سری اطلاعات رو در خودش نگه داره همین ...
اگه زحمتی نیست این برنامه رو چک کن و ببین مشکل از کجاست


$regfile = "m32def.dat"
$baud = 19200
$crystal = 4000000
$lib "glcdKS108.lib"
Config Eeprom = Mapped

Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portd , Ce = 2 , _
Ce2 = 3 , Cd = 6 , Rd = 5 , Reset = 1 , Enable = 4

Cls
Dim A As Byte , C As Byte

Do
Writeeeprom C , 1
Waitms 500
Setfont Font16x16
Readeeprom A , 1
Lcdat 1 , 1 , A
Incr C

Loop

Dta:
$eeprom

Data 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8
$data

End

$include "font16x16.font"




ممنونت میشم اگه بهم جواب بدی

mj3747
05-09-2012, 00:37
فقط متغیری که میخوای اطلاعات رو توی اون بنویسی برا ذخیره کردن در eeprom رو به صورت زیر تعریف کن.
dim x as eram byte
برا اطلاع بیشتر توی help بیسکام سرچ کن dim و اطلاعات مربوط به تعریف متغیر رو بخون.

alinavidy
05-09-2012, 23:20
سلام مشکل از این دو دستور هست من باید چی کار کنم
وقتی این دو دستور می زارم فایل رو داخلی epeprom نمی ریزه

$include "font16x16.font"


Setfont Font16x16

با سپاس فراوان از شما دوست خوب

Doloop
06-09-2012, 03:13
خوب این فونت حجم زیادی داره
احتمال داره مشکل از کمبود ظرفیت باشه
اگه متن ارورهارو قرار بدید بهتر میشه کمکتون کرد:0013:

alinavidy
06-09-2012, 08:16
با سلام
راه حل چیه من باید چی کار کنم که با ال سی دی گرافیکی کار کنم.
این عکس رو هم گذاشتم دقیقا موقعی این پیام میاد که من از همون دو دستور استفاده می کنم .
امکان داره که این دستورهای باید جای بخصوصی باید تعریف بشه
ممنونم از راهنمایتون

alinavidy
06-09-2012, 19:39
دوستان عزیز کمک کنید خواهشا