پروژه راه اندازی RTC با میکروکنترلر AVR
یکی از امکانات میکروکنترلرها تایمرها هستند ، این واحد برای بسیاری از پروژه ها لازم و ضروری بوده و بدون آنها انجام آن پروژه غیر ممکن است. تایمر ها از رجیسترها متفاوتی برای عملکرد خود ساخته شده اند و از کنار هم قرار گرفتن آنها تایمر درست می شود. تایمر ها از لحاظ سرعت شمارش و دقت با یکدیگر متفاوت می باشند به عنوان مثال تایمری می تواند تا 32 بیت شمارش را انجام دهد و تایمری دیگر تا 8 بیت می تواند شمارش کند. از مهمترین کاربردهای این سخت افزار میتوان به تایمر ( زمان سنج ) ، کانتر ( شمارنده ) ، Real Time Clock ( زمان سنج حقیقی ) و PWM ( مدولاسیون عرض پالس ) اشاره کرد.
زمان سنج برای اندازه گیری زمان استفاده می شود ، شمارنده برای شمارش پالس های ورودی به تایمر استفاده می شود و مدولاسیون پهنای پالس نیز برای تولید دیوتی سایکل های متفاوت استفاده می شود. از RTC برای ساخت زمان دقیق استفاده می شود. در این روش یک عدد کریستال ساعت با فرکانس 32.768 کیلوهرتز به پایه های ورودی تایمر داده می شود و در واقع فرکانس تایمر از این کریستال تامین می شود.در شکل زیر نحوه اتصال کریستال به پایه های میکروکنترلر نشان داده شده است.
طریقه کارکرد برنامه به این صورت می باشد که فرکانس تایمر که همان 32.768 کیلو هرتز می باشد بر عدد 128 تقسیم شده و فرکانس شمارش تایمر 256 هرتز در ثانیه می شود. پس از شمارش از 0 تا 256 تایمر سریز شده و وقفه اتفاق افتاده و کدهای داخل آن اجرا می شود.در زیر سورس برنامه ساعت با RTC قرار داده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#include <mega16.h> #include <lcd.h> #include <stdio.h> #define xtal 8000000 #asm .equ __lcd_port=0x1B ;PORTA #endasm unsigned char second, minute,hour; unsigned char lcd_buff[10]; interrupt [TIM2_OVF] void timer2_ovf_isr(void) { if(second==59) { second=0; if(minute==59) { minute=0; if(hour==24) hour=0; else hour++; } else minute++; } else second++; sprintf(lcd_buff,"Time = %d:%d:%d",hour, minute, second); lcd_clear(); lcd_puts(lcd_buff); } // Declare your global variables here void main(void) { // Timer/Counter 2 initialization // Clock source: TOSC1 pin // Clock value: PCK2/128 // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x08; TCCR2=0x05; TCNT2=0x00; OCR2=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x40; lcd_init(16); #asm("sei") // Global enable interrupts while (1); } |