مهندس واسه کار شما بسکام همه توابعش رو داره !!
در بعضي از ميکرو ها تايمر /کانتر دو يا صفر ميتواند به صورت اسنکرون ( در حالت اسنکرون کلاک تايمر توسط کريستال ساعت 32768Hz از دو پايه toc1,toc2 تامين مي شود) کار کند و زمان و تاريخ را بشمارد ، اين شمارش در همه حالتها حتي زماني که ميکرو در حالت power-save است نيز وجود دارد.
همچنين ايسي هاي نيز وجود دارد که زمان و تاريخ را ميشمارد و حتي قابليت شمارش و ذخيره زمان و تاريخ شمرده شده را نيز دارد در زير هر دو مورد را بررسي ميکنيم:
>Rtc داخلي ميکرو :
اين قابليت در بعضي از ميکروها وجود دارد ، که شما ميتوانيد با مراجعه به ديتا شيت ميکرو از وجود يا عدم وجود آن مطلع شويد.rtc با دستور زير پيکربندي مي شود:
کد php:
CONFIG CLOCK = soft | USER [, GOSUB = SECTIC]
Soft :هنگامي استفاده مي شود که ميخواهيد از rtc داخلي ميکرو استفاده کنيد.
USER : هنگاي استفاده مي شود که بخواهيد از rtc خارجي (مانند Ds1307 يا...(اين ايسي از پروتکل I2C استفاده ميکند ،کار با اين ايسي در بخش "روشهاي ارتباطي در avr " گفته شده است))استفاده کنيد.
GOSUB = SECTIC: اين گزينه اختياري است ، زماني که تايمر سرريز شد ( تا يک ثانيه شمرد) به برچسب SECTIC پرش مي شود ، باز گشت از برچسب با دستور return صورت ميگيرد
با دستورات زير مقدار اوليه زمان و تاريخ مشخص مي شوند(روش اول) :
کد php:
DATE$ = "mm/dd/yy"
TIME$ = "hh:mm:ss"
به جاي حروف اعداد اوليه قرار داده ميشوند مانند:
کد php:
$regfile = "M16DEF.DAT"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , E = Pind.1 , Rs = Pind.0
Config Lcd = 16 * 2
Enable Interrupts
Config Clock = Soft
Date$ = "11/11/00"
Time$ = "02:20:00"
Do
Locate 1 , 1
Lcd Date$
Locate 2 , 1
Lcd Time$
Loop
End
شما ميتوانيد با دستورات زير مقدار اوليه اي را براي زمان و تاريخ مشخص کنيد:
_sec = X بين 0 تا 59 استx
_min = X بين 0 تا 59 است x
_hour = X بين 0 تا 23 استx
_day = X بين 1 تا 31 استx
_month = X بين 1 تا 12 است x
_year = x بين 0 تا 99 استx
شما ميتوانيد کليه اعمال جمع و تفريق (کاستن و افزودن ) را مستقيم روي متغيير هاي بالا انجام دهيد .مثال:
کد php:
$regfile = "M16DEF.DAT"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , E = Pind.1 , Rs = Pind.0
Config Lcd = 16 * 2
Config Portb = Input
Enable Interrupts
Config Date = YMD , Separator =.
Config Clock = Soft , Gosub = Sectic
_sec = 57 : _min = 59 : _hour = 23 : _day = 32 : _month = 11 : _year = 99
Goto W
Set_ok:
Locate 1 , 10 : Lcd "set ok "
Wait 2 : Locate 1 , 10 : Lcd " "
W:
Do
Debounce Pinb.5 , 0 , Incr_sec
Loop
Incr_sec:
Do
Locate 1 , 10 : Lcd "set sec"
Debounce Pinb.5 , 0 , Incr_min : Waitms 100
If Pinb.6 = 0 Then : _sec = 0 : Waitms 400 : End If
If Pinb.7 = 0 Then : _sec = 30 : Waitms 400 : End If
Loop
Incr_min:
Do
Locate 1 , 10 : Lcd "set min" : Waitms 100
Debounce Pinb.5 , 0 , Incr_hour
If Pinb.6 = 0 Then : Incr _min: Waitms 400 : End If
If Pinb.7 = 0 Then : Decr _min : Waitms 400 : End If
Loop
Incr_hour:
Do
Locate 1 , 10 : Lcd "set hou"
Debounce Pinb.5 , 0 , Incr_day:Waitms 100
If Pinb.6 = 0 Then : Incr _hour : Waitms 400 : End If
If Pinb.7 = 0 Then : Decr _hour: Waitms 400 : End If
Loop
Incr_day:
Do
Locate 1 , 10 : Lcd "set day"
Debounce Pinb.5 , 0 , Incr_month:Waitms 100
If Pinb.6 = 0 Then : Incr _day : Waitms 400 : End If
If Pinb.7 = 0 Then : Decr _day : Waitms 400 : End If
Loop
Incr_month:
Do
Locate 1 , 10 : Lcd "set mon"
Debounce Pinb.5 , 0 , Incr_year :Waitms 100
If Pinb.6 = 0 Then : Incr _month : Waitms 400 : End If
If Pinb.7 = 0 Then : Decr _month : Waitms 400 : End If
Loop
Incr_year:
Do
Locate 1 , 10 : Lcd "set yea"
Debounce Pinb.5 , 0 , Set_ok : Waitms 100
If Pinb.6 = 0 Then : Incr _year : Waitms 400 : End If
If Pinb.7 = 0 Then : Decr _year : Waitms 400 : End If
Loop
End
Sectic:
Locate 1 , 1 : Lcd Date$ : Locate 2 , 1 : Lcd Time$
Return
مثال:
$regfile = "M16DEF.DAT"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Pind.2 , Db5 = Pind.3 , Db6 = Pind.4 , Db7 = Pind.5 , E = Pind.1 , Rs = Pind.0
Config Lcd = 16 * 2
Enable Interrupts
Cursor Off
Config Clock = Soft , Gosub = Sectic
Config Adc = Single , Prescaler = Auto
Dim Q(2) As Word
Date$ = "11/11/00"
Time$ = "02:20:00"
Start Adc
Do
Q(1) = Getadc(0)
Q(2) = Getadc(1)
Q(1) = Q(1) / 2
Q(2) = Q(2) / 2
Locate 1 , 11
Lcd "t1:" ; Q(1)
Locate 2 , 11
Lcd "t2:" ; Q(2)
Loop
End
Sectic:
Locate 1 , 1
Lcd Date$
Locate 2 , 1
Lcd Time$
Return
برنامه بالا علاوه برنمايش ساعت وتقويم دماي دو نقطه ي دلخواه را نيز نمايش ميدهد ، همانگونه که مشاهده ميفرماييد برنامه اسکن کانال هاي adc در حلقه ي do –loop قرار داده شده ، هنگامي که تايمر سرريز مي شود به برچسب Sectic پرش مي شود و زمان و تاريخ بر روي lcd نمايش داده شده و دوباره با دستور return به حلقه ي do-loop رجوع مي شود و اين کار مدام تکرار ميگردد.شما ميتوانيد در حلقه از هر دستوري استفاده کنيد .
شما همچنين ميتوانيد با دستور زير فرمت نمايش تاريخ را معين کنيد ( در هرکشوري تاريخ به شکل خاص نشان داده مي شود ، مثلا در ايران به صورت : yy/mm/dd و درايلات متحده امريکا به صورت: mm-dd-yy است)
کد php:
CONFIG DATE = DMY/MDY/YMD , Separator = char
DMY/MDY/YMD :نشان دهنده مکان نمايش روز ، ماه وسال است ، d نمايشگر روز(Day) ، m نمايشگر ماه(month) و y نمايشگر سال(year) است .
Char : علامت بين روز و ماه وسال ميباشد که ميتواند نقطه "." ، مميز"/" يا خط فاصله"-" باشد.