PDA

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



imported_tvm2009
12-05-2009, 15:47
با عرض سلام به تمام بر و بچه های ir-man

با استفاده از Atmega16
یک کی برد تلفنی 4*3 را به ورودی اینتراپت atmega16 متصل است{int0-int1-int2}(که باید بصورت AND شده به ورودی اینتراپت وصله بشه چون که ورودی اینتراپت سه تا است وپایه کی بوردمون 7) هرگاه کاربر کلیدی را زد cpu برنامه اصلی را رها کند وکلید زده شده را روی یک 7segment که روی یک پورت قرار دارد نشان دهد وهم چنین بر نامه اصلی آن یک شمارنده صفر تا 15 بالا شمار است که روی پورت دیگری قرار دارد.ا
با تشکر

imported_tvm2009
14-05-2009, 17:57
هیچ کس توی این سایت نیست که بتون به من کمک کنه و جواب سوالم را بده؟

mehrdadgh
15-05-2009, 00:49
سلام
اگه با اسمبلی برای کیبرد برنامه نوشته باشین میتونین به راحتی برای کیپد 3*4 هم بنویسین
به این صورت که یه ماتریس در نظر میگیری بعد به ترتیب یکی از سطرها یا ستون ها رو یک میکنی و ستون یا سطر ها میخونی تا بفهی کدوم کلید فشرده شده


یا تو بیسکام تابعش برای4*4 هست و کاری نداره یه ستون حذف میشه بعدم سیم های کیبرد رو این ور اون ور میکنی به راحتی جواب میده
میتونی به این صورت هم وصل کنی

c1=port b.0
c2= portb.2
c3= portb.3
r1=portb.4
r2=portb.5
r3=portb.6
r4=portb.7


اینم یه برنامه هستش که از اینترنت برداشته بودم به نظر که درسته ولی شما یه تستی بکن

$regfile = "m32def.dat"
$crystal = 1000000


Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Pina.4 , Db5 = Pina.5 , Db6 = Pina.6 , Db7 = Pina.7 , Rs = Pina.2 , E = Pina.3
Config Kbd = Portd , Debounce = 50 , Delay = 30

Dim K As Byte

Cls
Cursor Blink
L1:
Do
Display On
Cls
Lcd "Enter The Key"

Loop Until K < 15

Main:

K = Getkbd()
If K > 15 Then Goto Main
K = Lookup(k , My_kbd)
Cls
Lcd K
If K = 10 Then Goto L1
If K = 11 Then Display Off
jmp main

End
My_kbd:
Data 1 , 2 , 3 , 4 , 4 , 5 , 6 , 7 , 7 , 8 , 9 , 10 , 10 , 0 , 11

imported_tvm2009
15-05-2009, 20:55
ببین دوست عزیز
این برنامه ای که من بالا نوشتم به وسیله اینتراپت avr انجام می شه یعنی این که یک سون سگمنت به پورت (مثلا)
Aاست ودارد شمارش می کند ویک کی بورد به سه تا اینتراپت های ورودی avr وصله(int0-int1-int2) {که باید بصورت AND شده به ورودی اینتراپت وصله بشه چون که ورودی اینتراپت سه تا است وپایه کی بوردمون 7.}سپس اگر از کی بورد عددی زده شده cpu شمارش را رها کرده وعدد زده شده از کی بورد را روی سون سگمنتی که روی پورت دیگر مثلا Bقرار دارد یا همان پورتA نمایش دهدوپس از نمایش عدد ، دوباره شروع به شمارش کند.

1nafar
17-05-2009, 15:34
سلام
شما باید سه تا سطر رو به پایه های اینرتاپت متصل کنید و 4 تا پایه ستون رو به چهار تا پایه از میکرو .
توی برنامه و حلقه اصلی بین پایه های ستون مدام یک سطح یک رو بچرخونی ، با گذاشتن چند تا شرط و .... همه چیز درست میشه مثلا :
config porta = out put
config portb = output
dim a as word
dim b as word
Config Int0 = Falling
Enable Int0
On Int0 qqqq
do
portb=b
porta = &b0001
porta = &b0010
porta = &b0100
porta = &b1000
incr a
if a > 1000 then
incr b :a=0
end if
loop
qqq:
if porta = &b0001 then b=1
if porta = &b0010 then b=2
if porta = &b0100 then b=3
if porta = &b1000 then b=4
return
.
.
.
.
.
راستی مگا 16 دوتا پایه وقفه بیشتر نداره ؟؟؟؟

imported_tvm2009
17-05-2009, 21:01
اگه میشه بیشتر توضیح بده چون من زبان بیسیک بلد نیستم.
در ضمن ATMEGA16سه تا وقفه داره پایه های شماره 3-16و17 میکرو
روی پورتb یکی از وقفه هامون هست که نمی شه خروجی بشه باید ورودی بشه

1nafar
18-05-2009, 21:04
در ضمن ATMEGA16سه تا وقفه داره پایه های شماره 3-16و17 میکرو
روی پورتb یکی از وقفه هامون هست که نمی شه خروجی بشه باید ورودی بشه
سلام
درسته تا حالا دقت نکرده بودم ، سعی میکنم تا فردا شب یه برنامه کامل بزارم .

imported_tvm2009
22-05-2009, 02:32
هم اکنون نیازمند یاری سبزتان هستیم

1nafar
24-05-2009, 16:04
سلام
این برنامه :

$regfile = "m32def.dat"
$crystal = 8000000
Config Porta = Input
Config Portc = Output
Dim A As Byte , B As Byte
Config Int0= RISING
Config Int1 = Rising
Config Int2 = Rising
On Int0 Q
On Int1 W
On Int2 E
On Ovf1 R
Enable Int0
Enable Int1
Enable Int2
Config Timer1 = Timer , Prescale = 64
Enable Ovf1
Enable Interrupts
Do
A = 5
Set Porta.0
Waitms A
Reset Porta.0

Set Porta.1
Waitms A
Reset Porta.1

Set Porta.2
Waitms A
Reset Porta.2

Set Porta.3
Waitms A
Reset Porta.3
Portc = B
Loop
Q:
If Porta.0 = 1 Then : B = 0 : End If
If Porta.1 = 1 Then : B = 1 : End If
If Porta.2 = 1 Then : B = 2 : End If
If Porta.3 = 1 Then : B = 3 : End If
Return
W:
If Porta.0 = 1 Then : B = 4 : End If
If Porta.1 = 1 Then : B = 5 : End If
If Porta.2 = 1 Then : B = 6 : End If
If Porta.3 = 1 Then : B = 7 : End If
Return
E:
If Porta.0 = 1 Then : B = 8 : End If
If Porta.1 = 1 Then : B = 9 : End If
If Porta.2 = 1 Then : B = 10 : End If
If Porta.3 = 1 Then : B = 11 : End If
Return
R:
Incr B
Return

برنامه از چند تا قسمت تشکیل شده :
1- معرفی و راه اندازی امکانات :
معرفی میکرو و مقدار کریستال :
$regfile = "m32def.dat"
$crystal = 8000000
قرار دادن پروت c به عنوان خروجی برای اتصال به ایسی 7447 و 7 سگمنت ، قرار دادن پروت a به عنوان ورودی برای اتصال سطر های کیبرد و معرفی دو عدد متغییر :
Config Porta = Input
Config Portc = Output
Dim A As Byte , B As Byte
پیکر بندی پایه های وقفه :
Config Int0= RISING
Config Int1 = Rising
Config Int2 = Rising
On Int0 Q
On Int1 W
On Int2 E

Enable Int0
Enable Int1
Enable Int2
پایه های وقفه به لبه بالا رونده حساس هشتند و با تحریک cpu به برچسب مشخص شده میرود .
Config Timer1 = Timer , Prescale = 64
Enable Ovf1
On Ovf1 R
توسط تایمر 1 زمان .5 ثانیه ایجاد شده است تا شمارش ، شمارند نمایان شود (تاخیر در شمردن )
و حلقه اصلی :
Do
A = 5
Set Porta.0
Waitms A
Reset Porta.0

Set Porta.1
Waitms A
Reset Porta.1

Set Porta.2
Waitms A
Reset Porta.2

Set Porta.3
Waitms A
Reset Porta.3
Portc = B
Loop
در این حلقه ، پین 4 پایه اول پورت a که به ستون کیپد متصل میشود ، سطح منطقی 1 مدام میچرخد ، به این صورت 0001 >>> 0010 >>>> 0100 >>>1000>>> >0001>>......
Waitms A تاخیر در فشرده شدن کلید یا همو دیبانس خودمون هست ، و میتونی مقدار اون رو تغییر بدی .
برچسب های تحریک پایه های وقفه هست :
Q:
If Porta.0 = 1 Then : B = 0 : End If
If Porta.1 = 1 Then : B = 1 : End If
If Porta.2 = 1 Then : B = 2 : End If
If Porta.3 = 1 Then : B = 3 : End If
Return
W:
If Porta.0 = 1 Then : B = 4 : End If
If Porta.1 = 1 Then : B = 5 : End If
If Porta.2 = 1 Then : B = 6 : End If
If Porta.3 = 1 Then : B = 7 : End If
Return
E:
If Porta.0 = 1 Then : B = 8 : End If
If Porta.1 = 1 Then : B = 9 : End If
If Porta.2 = 1 Then : B = 10 : End If
If Porta.3 = 1 Then : B = 11 : End If
Return
و در نهایت برچسب سرریزی تایمر :
R:
Incr B
Return

فرض کن cpu میکرو خط 21 برناه رو میخونه (Set Porta.0 ) در این حالت شما یکی از کلید ها رو که به ستون متصل به این پایه هست رو فشار میدید ، با فشرده شدن کلید این پایه به یکی از پایه های وقفه (مثلا وقفه شماره یک ) متصل میشه ، cpu به برچسب تحریک وقفه ( w ) مراجعه میکنه ، در اونجا ما چند تا شرط داریم ، شرط ها چک میشن ، شرط If Porta.0 = 1 Then : B = 0 : End If درست هست (بقه غلط هستند ، چون پایه های صفر هست ) بنابراین مقدار b برابر 0 میشه با دستور return پردازنده میکرو به حلقه اصلی هدایت میشه و با دستور Portc = B مقدار b به پروت c ارسال میشه و در اونجا به نمایش در می یاد .

imported_tvm2009
24-05-2009, 22:32
دستت درد نکنه ممنون از این همه لطفت.
مدار کار نکرد نمی دونم چرا ؟
4 تا سطر کی بورد را به 4 تا بیت اول پورتAدادم وسه تا ستونش ام را به وقفه ها دادم.وخروجیشم 7447 وخروجی 7447 هم به یک 7سگمنت وصل کردم شمارش می خوام از صفر تا 15 بصورت ترتیبی باشدولی در برنامه ترتیبی نیست ودر ضمن با زدن کی بورد تاثیری در خروجی نیست یعنی 7سگمنت داره همون شمارش بون ترتیبش را می کند.
باتشکر فراوان از زحمات تان[hr]
راستی نمیشه کار کرد که دیگه از 7447 استفاده کرد مثلا به جای این که مقدار باینری بشه مقدار هگز بشه وبا ان انجام داد

1nafar
24-05-2009, 22:54
مدار کار نکرد نمی دونم چرا ؟
دو تا مشکل وجود داره
1- فرکانس کریستال استفاده شده با فرکانس کریستال نوشته شده یکی نیست ، میکرو باید با فرکانس 8 مگا هرتز کار کنه
2- اگه از نرم افزار پروتوس استفاده میکنید این مورد رو نمیشه توی پروتوس تست کرد ، بعضی از مواقع ، دو از پایه ها اتصال کوتاه میشن ( به مدت 5 میلی ثانیه ) و پروتوس شبیه سازی رو متوقف میکنه ،

ش می خوام از صفر تا 15 بصورت ترتیبی باشدولی در برنامه ترتیبی نیس
منظورت از ترتیب چی هست ؟
شمارش از صفر شروع میشه و هر .5 میلی ثانیه اضافه میشه

راستی نمیشه کار کرد که دیگه از 7447 استفاده کرد مثلا به جای این که مقدار باینری بشه مقدار هگز بشه وبا ان انجام داد
این کار رو هم میشه انجام داد ، برای اینکار باید از جدول استفاده کنید و کد 7 سگمنت ها رو بخونید ، با یه کمی سعی و تلاش میتونی تکمیلش کنی

imported_tvm2009
01-06-2009, 22:08
کانتر عملی جواب میده ولی کی بورد کار نمی کنه؟
هرچه کلید رو می زنه شمارش متوقف نمیشه؟

1nafar
10-06-2009, 12:39
کانتر عملی جواب میده ولی کی بورد کار نمی کنه؟
هرچه کلید رو می زنه شمارش متوقف نمیشه؟
سلام پایه های وقفه رو با مقاومت 4.7 کیلو به زمین متصل کن ( هر پایه ، یک مقاومت )
برنامه رو در عمل تست کردید

imported_tvm2009
10-06-2009, 20:17
برنامه رو در عمل تست کردید

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

imported_tvm2009
23-06-2009, 11:00
[quote]
سلام پایه های وقفه رو با مقاومت 4.7 کیلو به زمین متصل کن ( هر پایه ، یک مقاومت )
برنامه رو در عمل تست کردید

مقاومت ها را وصل کردم بازم جواب نداد.
دیگه نمیدونم چیکار باید بکنم.

1nafar
23-06-2009, 11:31
سلام
من یه برا دیگه مواردی که باید رعایت بشه رو میگم :
1- پایه های اینترابت با مقاومت 4.7 کیلو به زمین متصل بشه .
2- برنامه باید در عمل تست بشه
3- کریستال متصل شده با میکرو با کریستال موجود در برنامه یکی باشه ( کریستال 8 مگا هرتز )
برنامه مشکلی نداره و اینکه درست کار نمیکنه به مشکلات سخت افزاری و ... بر میگرده .

$regfile = "m32def.dat"
$crystal = 8000000
Config Porta = Input
Config Portc = Output
Dim A As Byte , B As Byte
Config Int0= RISING
Config Int1 = Rising
Config Int2 = Rising
On Int0 Q
On Int1 W
On Int2 E
On Ovf1 R
Enable Int0
Enable Int1
Enable Int2
Config Timer1 = Timer , Prescale = 64
Enable Ovf1
Enable Interrupts
Do
A =500
Set Porta.0
Waitms A
Reset Porta.0

Set Porta.1
Waitms A
Reset Porta.1

Set Porta.2
Waitms A
Reset Porta.2

Set Porta.3
Waitms A
Reset Porta.3
Portc = B
Loop
Q:
If Porta.0 = 1 Then : B = 0 : End If
If Porta.1 = 1 Then : B = 1 : End If
If Porta.2 = 1 Then : B = 2 : End If
If Porta.3 = 1 Then : B = 3 : End If
Return
W:
If Porta.0 = 1 Then : B = 4 : End If
If Porta.1 = 1 Then : B = 5 : End If
If Porta.2 = 1 Then : B = 6 : End If
If Porta.3 = 1 Then : B = 7 : End If
Return
E:
If Porta.0 = 1 Then : B = 8 : End If
If Porta.1 = 1 Then : B = 9 : End If
If Porta.2 = 1 Then : B = 10 : End If
If Porta.3 = 1 Then : B = 11 : End If
Return
R:
Incr B
Return
این برنامه رو روی میکرو بریز و کی از کلید ها رو برای 5 ثانیه نگه دار . ببینی چی میشه .

imported_tvm2009
25-06-2009, 14:08
فرق نمیکنه به جای atmega32 از 16 استفاده کنم.

1nafar
25-06-2009, 14:52
نه هر دوتاشون مثل هم هستند و کافی توی برنامه نام میکرو رو تغییر بدی

1nafar
25-06-2009, 15:35
برنامه :

imported_tvm2009
27-06-2009, 14:14
:heart::heart:مرسی محمد جان:heart::heart:
:P:cool : محمد هاشمی دوست داریم ما& دوست دارم ما:P:cool: