ايران ويج

نسخه‌ی کامل: کمک برای ساعت زنگدار با avr
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3
سلام من یه میخام یه ساعت درست کنم که بتونم بهش بگم تو یه ساعت های مشخصی زنگ بزنه الان همه چی حل شده فقط مشکلم اینه که نمیدونم چیجوری میشه ساعت هایی رو که میخایم زنگ بزنه رو با چند تا کلید خودمون تنظیم کنیم.فقط من خیلی تو برنامه نویسی وارد نیستم لطفا یه جور بگین متوجه بشم

اینم برنامه:
[attachment=8212]
(۱۸-آذر-۱۳۹۱, ۲۲:۰۳:۳۰)amir_s نوشته است: [ -> ]سلام من یه میخام یه ساعت درست کنم که بتونم بهش بگم تو یه ساعت های مشخصی زنگ بزنه الان همه چی حل شده فقط مشکلم اینه که نمیدونم چیجوری میشه ساعت هایی رو که میخایم زنگ بزنه رو با چند تا کلید خودمون تنظیم کنیم.فقط من خیلی تو برنامه نویسی وارد نیستم لطفا یه جور بگین متوجه بشم

اینم برنامه:
سلام
سختی کارتون حل شده
2 تا کلید تعریف کتید (تو حلقه ی اصلی) و دوتا متغیر با فشار دادن کلید ها متغیر ها زیاد بشن
البته به 2 تا شرط هم نیاز دارین که اگر یکی از متغیرها 23 بیشتر شد صفر بشه و دیگری از 59 بیشتر شد صفر بشه
حالا متغیر ها رو با ساعت مقایسه کنید و هر موقع با هم برابر شدن پورتی رو یک کنید که به اون پورت زنگ وصل میشه
موفق باشیدWink
سلام دوست عزیز.واقعا ممنونم که راهنماییم کردین.ولی من خیلی برنامه نویسی بلد نیستم و هر چی هم یاد گرفتم از همین سایت بوده.متغییر ها باید چی باشن؟ ساعت که فقط یه عدد نیست.ثانیه و دقیقه و ساعت داره و همش هم از هم جداست.
بعدشم چیجوری متغییر رو با ساعت مقایسه کنم؟
شرمنده یادم رفته بودShy
توی این موضوع ارسال شماره ی 15 یه ساعت هست اونو امتحان کنید (با این ساعت فرقی نداره فقط برنامش ساده تره) برنامش رو نگاه کنید بعدش با هم می تغییرش می دیم(اگر جایشه نفمیدین بگین تا توضیح بدمWink)
تقریبا هیچیشو نفهمیدم.میشه توضیحش بدی؟
اگه مثل تاپیک اموزش avr از صفر تا بینهایت توضیح بدی که عالیه
قبل از هر چیزی شما تقویم هم می خواهین
اگر می خواهین شمسی یا میلادیWink
حتما میخاد.شمسی
اول از ساعت ساده و تقویم میلادی شروع می کنیم
کد:
$regfile = "m8def.dat"
$crystal = 4000000
$framesize = 128
$hwstack = 128
$swstack = 128
$projecttime = 1
$lib "ds1307clock.lib"
Config Lcdpin = Pin , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portc.5
Cursor Off
تا اینجا که امکانات رو تعریف کردم
'*******************************************************************************
Config Sda = Portb.0 : Config Scl = Portb.1
پایه های مربوط به ارتباط i2c را مشخص کردم
'*******************************************************************************
Dim S As Byte
Dim M As Byte
Dim H As Byte
Dim D As Word
Dim Y As Word
Dim Mo As Word
Dim W As Word
Dim Rooz As Integer
Dim Mah As Byte
Dim Sal As Word
Dim I As Byte
Dim Endm As Byte
متغیر ها رو تعریف کردم
Ddrb.2 = 0 : Portb.2 = 1
Ddrb.3 = 0 : Portb.3 = 1
Ddrb.4 = 0 : Portb.4 = 1
Ddrb.5 = 0 : Portb.5 = 1
Ddrb.6 = 0 : Portb.6 = 1
Ddrb.7 = 0 : Portb.7 = 1
Ddrc.0 = 0 : Portc.0 = 1
پول آپ برای کلید ها تعریف کردم
Cls
'*******************************************************************************
Aval:
Do
I2cstart ارتباط i2c را شروع کردم
I2cwbyte &HD0 ارسال دستور برای شروع نوشتن
I2cwbyte 0 مکان خواندن اطلاعات تعیین کردم
I2cstart ارتباط i2c را شروع کردم
I2cwbyte &HD1 ارسال دستور برای خواندن اطلاعات
I2crbyte S , Ack متغیر ثانیه را از حافظه 0 می خواند (در بالا تعیین کردم)
I2crbyte M , Ack متغیر دقیقه را از حافظه 1 بخوان
I2crbyte H , Ack ساعت
I2crbyte W , Ack ایام هفته را بخوان
I2crbyte D , Ack روز
I2crbyte Mo , Ack ماه
I2crbyte Y , Nack سال
I2cstop پایان ارتباط
'*******************************************************************************
S = Makedec(s) : M = Makedec(m) : H = Makedec(h)
D = Makedec(d) : Mo = Makedec(mo) : Y = Makedec(y)
Y = Y + 2000
اعداد رو به عدد قابل چاپ تبدیل می کنیم(شایدم یه چیز دیگه اگر کسی میدونه بگه) اگر این کار نکنیم میکرو قاطی می کنه
'*******************************************************************************
Locate 1 , 1
Lcd H ; ":" ; M ; ":" ; S ; " "
Locate 2 , 1
Lcd Y ; "/" ; Mo ; "/" ; D ; " "
نمایش اعدا روی ال سی دی
Debounce Pinb.2 , 0 , Second
Debounce Pinb.3 , 0 , Minot
Debounce Pinb.4 , 0 , Hour
Debounce Pinb.5 , 0 , Dey
Debounce Pinb.6 , 0 , Mont
Debounce Pinb.7 , 0 , Year
Debounce Pinc.0 , 0 , Yeard
تعریف کلید برای تنظیم ساعت و تاریخ
Loop
End 'end program
Second: زیر برنامه ثانیه وقتی کلید ثانیه بزنیم برنامه به اینجا پرش می کند
S = 0 ثانیه رو صفر می کنه
S = Makebcd(s) به عدد قابل ذخیره شده تبدیل می کنه
I2cstart ارتباط i2c شروع میشه
I2cwbyte &HD0 ارسال دستور برای شروع نوشتن روی آی سی
I2cwbyte 0 به مکان 0 حافظه بره
I2cwbyte S متغیر s را در حافظه آی سی بنویسه
I2cstop پایان i2c
Goto Aval به زیر برنامه ای که اول برنامه وجود داره پرش می کنه
Return
Minot: وقتی که کلید دقیقه را یزنیم برنامه به اینجا پرش می کنه

Incr M دقیقه را یکی اضافه کن
If M > 59 Then M = 0 اگر دقیقه از 59 بیشتر شد دقیقه را صفر کن
M = Makebcd(m) به عدد قابل ذخیره شدن تبدیل می کنه
I2cstart شروع ارتباط i2c
I2cwbyte &HD0 ارسال دستور برای نوشتن روی آی سی
I2cwbyte 1 به حافظه ی 1 پرش کن
I2cwbyte M متغیر m را روی آی سی بنویس
I2cstop پایان i2c
Goto Aval به اول برنامه پرش کن
Return
بقیه هم همین طور
Hour:
Incr H
If H > 23 Then H = 0
H = Makebcd(h)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte H
I2cstop
Goto Aval
Return
Dey:
Incr D
If D > 31 Then D = 0
D = Makebcd(d)
I2cstart
I2cwbyte &HD0
I2cwbyte 4
I2cwbyte D
I2cstop
Goto Aval
Return
Mont:

Incr Mo
If Mo > 12 Then Mo = 0
Mo = Makebcd(mo)
I2cstart
I2cwbyte &HD0
I2cwbyte 5
I2cwbyte Mo
I2cstop
Goto Aval
Return
Year:
Incr Y
Y = Makebcd(y)
I2cstart
I2cwbyte &HD0
I2cwbyte 6
I2cwbyte Y
I2cstop
Goto Aval
Return
Yeard:
Decr Y
Y = Makebcd(y)
I2cstart
I2cwbyte &HD0
I2cwbyte 6
I2cwbyte Y
I2cstop
Goto Aval
Return
اگر جاییش گنگه بگین تا بیشتر توضیح بدم
اگر فهمیدین حالا یه مبدل میلادی به شمسی اضافش می کنیم
برنامه به این شکل در میاد
کد:
$regfile = "m8def.dat"
$crystal = 4000000
$framesize = 128
$hwstack = 128
$swstack = 128
$projecttime = 1
$lib "ds1307clock.lib"
Config Lcdpin = Pin , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portc.5
Cursor Off
'*******************************************************************************
Config Sda = Portb.0 : Config Scl = Portb.1
'*******************************************************************************
Dim S As Byte
Dim M As Byte
Dim H As Byte
Dim D As Word
Dim Y As Word
Dim Mo As Word
Dim W As Word
Dim Rooz As Integer
Dim Mah As Byte
Dim Sal As Word
Dim I As Byte
Dim Endm As Byte
Ddrb.2 = 0 : Portb.2 = 1
Ddrb.3 = 0 : Portb.3 = 1
Ddrb.4 = 0 : Portb.4 = 1
Ddrb.5 = 0 : Portb.5 = 1
Ddrb.6 = 0 : Portb.6 = 1
Ddrb.7 = 0 : Portb.7 = 1
Cls
'*******************************************************************************
Aval:
Do
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cstart
I2cwbyte &HD1
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Ack
I2crbyte W , Ack
I2crbyte D , Ack
I2crbyte Mo , Ack
I2crbyte Y , Nack
I2cstop
'*******************************************************************************
S = Makedec(s) : M = Makedec(m) : H = Makedec(h)
D = Makedec(d) : Mo = Makedec(mo) : Y = Makedec(y)
'*******************************************************************************
If Mo = 1 Then Rooz = D
If Mo = 2 Then Rooz = D + 31
If Mo = 3 Then Rooz = D + 59
If Mo = 4 Then Rooz = D + 90
If Mo = 5 Then Rooz = D + 120
If Mo = 6 Then Rooz = D + 151
If Mo = 7 Then Rooz = D + 181
If Mo = 8 Then Rooz = D + 212
If Mo = 9 Then Rooz = D + 243
If Mo = 10 Then Rooz = D + 273
If Mo = 11 Then Rooz = D + 304
If Mo = 12 Then Rooz = D + 334
If Rooz > 78 Then
Sal = Y + 79
Rooz = Rooz - 78
If Rooz > 186 Then
Rooz = Rooz - 186
Mah = 7
Else
Mah = 1
End If
If Mah > 6 Then Endm = 30 Else Endm = 31
Else
Sal = Y + 78
Mah = 10
If Rooz =< 78 Then Rooz = Rooz + 11
Endm = 30
End If
For I = 1 To 6
If Rooz > 30 Then Rooz = Rooz - Endm Else Exit For
Mah = Mah + 1
Next
Sal = Sal + 1300
'*******************************************************************************
Locate 1 , 1
Lcd H ; ":" ; M ; ":" ; S ; " "
Locate 2 , 1
Lcd Sal ; "/" ; Mah ; "/" ; Rooz ; " "
'*******************************************************************************
Debounce Pinb.2 , 0 , Second
Debounce Pinb.3 , 0 , Minot
Debounce Pinb.4 , 0 , Hour
Debounce Pinb.5 , 0 , Dey
Debounce Pinb.6 , 0 , Mont
Debounce Pinb.7 , 0 , Year
Loop
End 'end program
Second:
S = 0
S = Makebcd(s)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte S
I2cstop
Goto Aval
Return
Minot:

Incr M
If M > 59 Then M = 0
M = Makebcd(m)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte M
I2cstop
Goto Aval
Return
Hour:
Incr H
If H > 23 Then H = 0
H = Makebcd(h)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte H
I2cstop
Goto Aval
Return
Dey:
Incr D
If D > 31 Then D = 0
D = Makebcd(d)
I2cstart
I2cwbyte &HD0
I2cwbyte 4
I2cwbyte D
I2cstop
Goto Aval
Return
Mont:

Incr Mo
If Mo > 12 Then Mo = 0
Mo = Makebcd(mo)
I2cstart
I2cwbyte &HD0
I2cwbyte 5
I2cwbyte Mo
I2cstop
Goto Aval
Return
Year:
Incr Y
If Y > 23 Then Y = 0
Y = Makebcd(y)
I2cstart
I2cwbyte &HD0
I2cwbyte 6
I2cwbyte Y
I2cstop
Goto Aval
Return
این مبدل رو من ننوشتمShy و هیچی ازش نمی فهممBiggrin از توی همین سایت برداشتم اگر بپرسین بهتون میگن چکار کردن
حالا دقیق بگین چی می خواهینWink
خیلی ممنون از توضیحاتتون.فعلا برنامه اولی رو خوندم و اینارو نفهمیدم
کد:
$framesize = 128
$hwstack = 128
$swstack = 128
$projecttime = 1
$lib "ds1307clock.lib"
---------------------------
یعنی چی پول اپ برای کلید ها تعریف کردی؟
----------------------------

Lcd H ; ":" ; M ; ":" ; S ; " "
اینارو چرا باید بزاریم؟
Lcd Y ; "/" ; Mo ; "/" ; D ; " "
------------------------------------------
چرا بعد از مکان 2 پریدی رفتی مکان 4؟
اصلا این مکان هارو کی تعریف میکنه؟
-----------------------
yeardچیه؟
نقل قول: یعنی چی پول اپ برای کلید ها تعریف کردی؟
نگاه کن علمی نمی گم به زبون ساده میگم.پایه میکرو باید یا یک باشه یا صفر فرض کن کلیدی به مثبت وصله وقتی کلید رو قطع می کنی جریان برق قطع میشه و پایه صفر نمیشه پس تو کار میکرو خطا ایجاد می کنه و هر دفعه ای یه چیزی در نظرش می گیره یا صفر یا یک پس میکرو قاطی میکنه برای همین ما باید وقتی کلید به مثبت وصله با یه مقاومت 10k پایه رو صفر کنیم روشش رو پیوست کردم اگر کلید به منفی وصل باشه باید از داخل برنامه این کارو بکنیم با این دستورایی که نوشتم
Ddrb.2 = 0 : Portb.2 = 1
Ddrb.3 = 0 : Portb.3 = 1
Ddrb.4 = 0 : Portb.4 = 1
Ddrb.5 = 0 : Portb.5 = 1
Ddrb.6 = 0 : Portb.6 = 1
Ddrb.7 = 0 : Portb.7 = 1
Ddrc.0 = 0 : Portc.0 = 1
الان این7 تا پایه پول آپ شدن (pull up) وقتی هم با مقاومت این کارو بکنیم میگن پایه پول دون شده(pull down)
نقل قول: Lcd H ; ":" ; M ; ":" ; S ; " "
اینارو چرا باید بزاریم؟
Lcd Y ; "/" ; Mo ; "/" ; D ; " "
اینا دستور نمایش روی ال سی دی هستند
نقل قول: چرا بعد از مکان 2 پریدی رفتی مکان 4؟
اصلا این مکان هارو کی تعریف میکنه؟
نفهمیدم منظورت چیهConfused
نقل قول: yeardچیه؟
کد php:
yeardزیر برنامه سال کم وقتی کلید سال کم بزنیم برنامه به اینجا پرش می کند portc.0
decr y یک واحد از سال کم می کنیم 
Makebcd(yبه عدد قابل ذخیره شده تبدیل می کنه
I2cstart ارتباط i2c شروع میشه
I2cwbyte 
&HD0 ارسال دستور برای شروع نوشتن روی آی سی
I2cwbyte 6 به مکان 6 حافظه بره
I2cwbyte y متغیر y را در حافظه آی سی بنویسه
I2cstop پایان i2c
Goto Aval به زیر برنامه ای که اول برنامه وجود داره پرش می کنه
Return 
اگر بازم نفهمیدی بگو من در خدمتمWink
موفق باشیدWink
منظورم از مکان همون عددیه که میدیم و مکان خوندن یا نوشتن از 1307رو تعیین میکنیم.
ایناروهم نگفتی چیه:

$framesize = 128
$hwstack = 128
$swstack = 128
$projecttime = 1
$lib "ds1307clock.lib"
صفحه‌ها: 1 2 3