ايران ويج

نسخه‌ی کامل: كمك فوري set/up /downبراي تنظيمات
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام دوستان من خدا قوت
من يه برنامه نوشتم كه چند تا متغيير داره و هر كدوم داراي يه مقداري هستند حالا مي خوام اين مقادير رو با سه تا كليد
setبراي انتخاب متغيير مورد نظر
up براي افزايش مقدار آن
down براي كاهش مقدار آن
******با زبان بسكام لطفا********
ممنون شرمنده سوالام خيلي زياد شده و همشون پيش پا افتادست
ولي من از اينجا خيلي چيزا رو ياد گرفتم واقعا خدا اجر و پاداش بزرگي براي اين زحمات به همه زحمت كشان سايت بده

سلام اگه برنامت رو بذاری بهتر میشه راهنماییت کرد ولی من اینجا روشی که خودم استفاده میکنم رو میگم البته شاید کمی گیج بشی
من توی برنامم (بین Do Loop)اصلی کد زیر رو میذارم تا هروقت پایه مثلا Set زده شد برنامه به بخش تنظیمات بره
کد:
Debounce PinA.0 , 0 , setting , Sub

این کد پین A.0 که میتونه همون دکمه Set باشه رو چک میکنه هر وقت این پایه 0 شد (میتونی به جای 0 ، 1 بذاری ) به زیر برنامه setting میپره (مثل دستور gosub که برنامه به setting: میره
حالا میتونی توی زیر برنامه Setting دوباره از یه حلقه استفاده کنی و دستور بالا رو برای پایه های دیگه استفاده کنی
به مثال زیر توجه کن :
کد:
$regfile=m32def.dat"
$crystal=8000000

Dim A as byte,B as Byte,C as byte
Dim X as byte

Config PinA.0=Input
Config PinA.1=Input
Config PinA.2=Input

setkey Alias PinA.0
upkey Alias PinA.1
downkeu Alias PinA.2

startprogram:
Do
Debounce setkey  , 0 , setting , Sub
'بقیه برنامه
Loop
End

setting:
x=0 'برای تغییر بین متغیر ها
Do
Debounce setkey  , 0 , nextx , Sub
Debounce upkey  , 0 , Upx , Sub
Debounce downkeu , 0 , Downx , Sub
Loop
return

nextx:
if x=2 then
goto startprogram
else
x=x+1
end if
return

upx:
select case x
case x=0
a=a+1
case x=1
b=b+1
case x=2
c=c+1
end select
return

downx:
select case x
case x=0
a=a-1
case x=1
b=b-1
case x=2
c=c-1
end select
return
سلام ممنون كه پاسخ دادين اما من كاملا گيج شدم برنامه من اينه كه با يه سنسوري و استفاده از adc يه چيزي رو اندازه مي گيرم حا لا دو تا شرط مي زارم مثلا اگه از يه عددي بالا تر يا پايين تر رفت شما فلان كار رو انجام بده حالا مي خوام مقدار اون شرط رو با استفاده از اين كليد ها تغيير بدم
کد:
[
$regfile = "m16def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = _
Portd.5 , E = Portd.0 , Rs = Portd.1
Config Lcd = 16 * 2
Config Portb.0 = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim A As Single , B As Word
Do
B = Getadc(0)
A = B
A = A / 2
Cls
Lcd A
If A < 10 Then
Set Portb.0
End If
If A > 20 Then
Reset Portb.0
End If
Waitms 20
Loop
End
]
حالا مي خوام با استفاده از اين سه كليد مقدار 10و 20 رو تغيير بدم
ممنون مي شم سريع تر پاسخ بدين شديدا نيازش دارم
سلام.

اصلا نيازي به تعريف متغيير A نيست ...
به هر حال ، جايي كه نوشتي A>20 و A<10 ، بجاي 10 و 20 بايد متغيير استفاده كني.
يعني A>c مثلا ...
حالا 2 تا كليد به 2 پايه از ميكرو مي زني ، دستورشون رو هم اينطور مي نويسي كه اگر يكي رو زدي هر سري مثلا 1 واحد بهش اضافه بشه ...
براي كليد بعدي هم همينطور ، اما اين بار 1 واحد كم شه ...
و براي عملكرد بهتر ، از چيزي كه دوستمون بالا گفت بهتره استفاده كني .
بهترش هم اينه كه اگر از int0 و int1 استفاده نكردي ، كليد هات رو به اين وقفه ها بدي كه هر بار كه خاصتي مقادير تغيير كنن ، همون موقع بره به وقفه و مقادير شرط ها رو تغيير بده ...

موفق باشيد.
يا علي.
سلام ممنون دوست گلم اما اين برنامه كامل نيست يعني هنوز كلي چيز ديگه دارم كه بايد به اون اضافه كنم و همه اونها بايد با همون سه تا دكمه مقدارشون قابل تغيير با شه به همين خاطر نمي تونم بيشتر از سه تا پايه رو درگير اين موضوع كنم
اون مثال دوستمونم كامل نفهميدم آخه من تازه كارم
اگر دوستان همون مثال خودم رو با كد ارسال دوم تركيب كنند واقعا لطف بزرگي كردند


خيلي خيلي دوستون دارم
دوستان عزيز مي دونم كه همتون كار دارين اما من كارم گير هستش كسي نيست كمكم كنه
مهندس ، بنظرت من چقدر تجربه دارم ؟! منم تازه كارم ...
يه نصيحت برادرانه ...
اگر مي خواي پيشرفت كني ، توي فروم فقط مشورت كن و بعد خودت مشكلات رو برطرف كن ،‌مگر اينكه واقعا بعد از اينكه تمام تلاشت رو كردي و به نتيجه نرسيدي همچين درخواستي كني ...

برنامه رو برات نوشتم و برنامه ي خودت و بخشي از ايده ي دوستمون و ايده ي خودم رو تو هم قاطي كردم و شد برنامه ي زير كه مي بيني ...
اميدوارم بفهمي چكار كردم ، فقط زحمت تحليلش رو ديگه خودت بكش ، برنامه رو compile كردم و خطا نداره ، اما تو پروتوس چكش نكردم ، ممكنه گير هاي كوچيكي داشته باشه كه با كمي دستكاري درست بشه ...
پس با خودت ديگه ...

براي اينكار از pB1 و PB2 براي زياد و كم كردن مقدار ها استفاده كردم ، واز پايه ي int0 به منظور انتخاب يكي از متغيير هاي UP و down و همچنين براي خروج از حالت set كردن اين مقادير استفاده كردم ...
به اين دليل به اين سبك عمل كردم و شلوغ بازي در آوردم كه مدارت تداخل زماني نداشته باشه و هميشه خوب جواب بده ...
روند كار :
وقتي ميكرو روشن مي شه ، با مقادير پيشفرضي كه گذاشتي شروع به كار مي كنه ...
اگر خواستي مقادير رو تغيير بدي ، بايد كليدي كه به int0 وصل مي شه رو بزني تا به وقفه بره ، براي اولين بار متغيير up انتخاب مي شه ، بعد بازدن PB1 مقدار يكي يكي زياد مي شه و با زدن PB2 مقدار يكي يكي كم مي شه ...
وقتي مقادير به حد مورد نظر رسيد ، دوباره دكمه اي كه به int0 وصل هست رو مي زني تا برگرده به برنامه ي اصلي. حالا اگر دوباره int0 رو بزني ، اينبار متغيير دوم انتخاب مي شه و باقيه ماجرا مثل قبليه ...
پس int0 دكمه ي set كردن هست.

به روش هاي زيادي مي شه اين كار رو انجام داد ، اما بنظرم از نظر عملكرد ، اين يكي خوب جواب بده ...
پورت lcd رو هم عوض كردم ...

اين هم كد ها :
کد:
$regfile = "m16def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = _
Portc.5 , E = Portc.0 , Rs = Portc.1
Config Lcd = 16 * 2
Config Pinb.0 = Output
'****************************
Config Pinb.1 = Input
Config Pinb.2 = Input
Enable Int0
Config Int0 = Rising
Enable Interrupts
On Int0 Slct
'****************************
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Dim A As Single , B As Word , K As Bit
Dim Up As Single , Down As Single
Dim Count As Byte , Check As Byte
Dim En As Byte
K = 0 : Up = 10 : Down = 20
'****************************
Main:
   B = Getadc(0)
   A = B / 2
   Cls
   Lcd A
   If A < Up Then
   Set Portb.0
   End If
   If A > Down Then
   Reset Portb.0
   End If
   Waitms 20
     If K = 1 Then
     Do
          Debounce Pinb.1 , 0 , L_up , Sub
          Debounce Pinb.2 , 0 , L_down , Sub
          If K = 0 Then
          If En = 1 Then
          Count = 0
          End If
          Goto Main
          End If
     Loop
     End If
Goto Main
End
'******************************
Slct:
      If K = 1 Then
      K = 0
      Return
      End If
      If K = 0 Then
      K = 1
      End If
    '------------''
      Count = Count + 1
      Check = Count Mod 2
      If Check = 0 Then
      En = 1
      Cls
      Lcd " up limit :"
      Locate 2 , 2
      Lcd Up                                                ' select up
      Else
      En = 0
      Cls
      Lcd " down limit :"
      Locate 2 , 2
      Lcd Down
      End If                                                ' select down
      Return
L_up:
      K = 1
      If En = 1 Then
      Up = Up + 1
      Cls
      Lcd " up limit :"
      Locate 2 , 2
      Lcd Up
      End If
      If En = 0 Then
      Down = Down + 1
      Cls
      Lcd " down limit :"
      Locate 2 , 2
      Lcd Down
      End If
  Return
L_down:
      K = 1
      If En = 1 Then
      Up = Up - 1
      Cls
      Lcd " up limit :"
      Locate 2 , 2
      Lcd Up
      End If
      If En = 0 Then
      Down = Down - 1
      Cls
      Lcd " down limit :"
      Locate 2 , 2
      Lcd Down
      End If
  Return

موفق باشي.
يا علي.
اگه این هارو نمیفهمی توصیه می کنم یه کتاب آموزش avr بخر همیشه بذار کنار دستت ازش استفاده کن
من خودم کتاب ( کاربرد میکروکنترلرهای AVR نوشته ی مهندس عبدالرحمن حیدیری ) رو دارم هر وقت چیزی رو متوجه نمیشم مثل int0 میرم توی اون میخونم
ولی هیچوقت از کارت نا امید نشو و هر جور شده تا آخر تمومش کن من خودم یه بار یه روبات میساختم که نا امید شدم و کلی ضرر کردم .
بازم اگه کارت گیره و اینا رو نفهمیدی بگو تا بیشتر کمک کنیم .
موفق باشی
سلام ممنون دوستان
من كتاب يك نفر رو با بسكام تقريبا خوندم
با زبان c هم كتاب جابر الوندي رو به بعضي فصل ها نگاه كردم
رو فهم دستورات خيلي مشكل ندارم متوجه مي شم كلي اين دستور كه نوشتين چه جوري ولي خوب بايد بهتر بخونم قبول دارم اما الان كارم فوريه و وقتش رو ندارم

اين برنامه رو كه گذاشتي تو پروتئوس تست كردم كار ميكنه فقط يه مشكل داره كه
وقتي مثلا اون 10 رو با دكمه ها مي كني 5 به جاي اينكه زير 5بياد و فرمان set شدن pb.0رو بده باز رو همون 10 اين كار رو مي كنه
واسه 20 هم همينطور ممنون مي شم راهنمايي فوري كنين
سلام.

قرار شد ديگه باقيش با خودت باشه ... ( يادته در مورد پيشرفت چي گفتم ؟! )
پروتوس قابل اعتماد نيست ...
كلا فكر كنم به وقفه ها خوب جواب نمي ده ...
عملي تستش كن ، يعني برنامه رو رو ميكرو پروگرام كن و كليد ها و LCD رو وصل كن ببين چي مي شه ...
معمولا وقتي از وقفه برمي گرده بايد از خط بعد از اوني كه به وقفه رفته شروع كنه به خوندن ، اما بنظر مي رسه كه از اول اول برمي گرده و اين مشكل پروتوس هست به احتمال زياد.( بخاطر همين مقادير بر مي گرده به مقدار اولشون ... )
فقط هم يكي از متغيير ها رو مي شه كم و زياد كرد !! اما مطمئنم كه برنامه ي وقفه اش درسته ، چون چكش كردم ...
عملي تستش كن ...
برنامه رو هم خوب بايد براي خودت تحليل كني ...

اگر باز جواب نداد ،‌مقدار اوليه ي count رو برابر 1 بگير ، و تو قسمت debounce ها هم count رو برابر 1 بذار ( در اون if هه ) ، مقدار اول برنامه رو هم براي count =1 كن . بعد ببين چي مي شه ...

اگر نشد بيا مقادير متغيير check رو هر بار كه به وقفه مي ياد رو lcd نشون بده ببين تغيير مي كنه يا نه ... ( عملي منظورمه ها )

و ...

برنامه نويسي هم به بلد بودن كد هاي برنامه نيست ...
بايد بتوني با كد كار كني و به برنامه انعطاف بدي ...
توي برنامه نويسي اينه كه مهم هست و كاملا به خودت بستگي داره ... ، وگرنه دستورات رو كه تو help خودش نوشته ...

در مورد گير بودن كار ، گير بودن شرايط ويژه اي نيست ...
همه تو جاهاي مختلف گير دارن ، خودمم خيلي كارا دارم كه روشون گير كردم و بايد خيلي سريع از پسشون بر بيام ... ، بهانه ي خوبي نيست ...


موفق باشي.
يا علي.

سلام به همه دوستان
و قدر داني بسيار از شما عزايزان كه كمك كردين تا راه بيوفتيم
اين برنامه رو تونستيم به لطف خدا و كمك گرفتن از برنامه بچه ها كامل كنيم هم تو پروتوئوس جواب داد هم تو عمل

اينم برنامه واسه عزيزاني كه قراره تو آينده با اين درگير بشنHappyHappyHappy017ClapHeart
کد:
do
main:                                 حلقه اصلي
.
.
.
Debounce Pind.1 , 1 , Tanzim1 , Sub                                     با زدن كليد به بحث تنظيمات 1 وارد مي شود
.
.
loop

tanzim1:
Do
Cls
Lcd "l_down="
Locate 1 , 10
Lcd L_down
Debounce Pinb.2 , 1 , L_down_up , Sub
Debounce Pinb.3 , 1 , L_down_down , Sub
Debounce Pinb.1 , 1 , Tanzim2 , Sub                        با فشردن مجدد همان كليد به تنظيم پارامتر بعد وارد مي شود                                                  
Waitms 20
Loop

L_down_up:
L_down = L_down + 1
Goto Tanzim1

L_down_down:
L_down = L_down - 1
Goto Tanzim1

                                                                      و اين را مي شود تا تنظيم 100پارمتر تكرار كرد

از همه ممنون
صفحه‌ها: 1 2