به نام خدا : تو این مطلب از سری مطالب آموزش پروژه محور آرم lpc1768 مبحث تایمر کانتر میخوام یه 7 تا پروژه قرار بدم و با توضیح دادن پروژه ها یه جورایی مبحث تایمر کانتر lpc1768 رو توضیح بدم، تو هر پروژه یه ویژگی تایمر کانتر رو آموزش میدم، تقریبا میشه گفت از تمام امکانات تایمر کانتر تو این 7 تا پروژه من استفاده کردم ( تا جایی که ذهنم میرسید مثال و پروژه نوشتم و تست عملی کردم )، در ضمن فیلم پروژه ها رو هم قرار میدم، مواردی که عملکرد و شماتیک مدار چند پروژه یکسان باشد، فقط یه فیلم قرار میدم، برای این مطلب آموزش و پروژه های تایمر آرم، 1هفته وقت گزاشته شده و رفتم خودم یاد گرفتم و در عمل تست کردم و دارم به اشتراک میزارم، لطفا کپی نکنید.
آموزش پروژه محور آرم lpc1768 مبحث تایمر کانتر
لیست پروژه های این مطلب :
- پروژه LED چشمک زن با lpc1768 و پایه خروجی MAT
- پروژه LED چشمک زن با lpc1768 و وقفه ( بدون استفاده از پایه خروجی MAT )
- پروژه LED چشمک زن با lpc1768 و تغییر زمان هر کلاک TC ( از خروجی MAT استفاده شده )
- پروژه تولید فرکانس های مختلف با lpc1768 ( تو این پروژه، فرکانس 10کیلو، شما هر قدر دوست داشتی تولید کن ^_^، حداکثر تا 25 میگ میتونید تولید کنید، حواستون باشه به این مورد )
- پروژه استفاده از مد شمارنده تایمر/کانتر lpc1768 ( مقدار TC همین طوری برا خودش زیاد نمیشه دیگه، افزایشش دست ماست!!! )
- پروژه استفاده از پایه ورودی CAP در lpc1768 ( محاسبه زمان بین دو لبه بالا رونده یه دکمه/باتن/کلید/هر چی اسمشو میزارید)
- پروژه نوشتن تابع Delay به کمک تایمر lpc1768
پیشنیاز های این 7 تا پروژه :
- تغییر و یا خوندن یه بیت از یک متغیر
- مطلب جلسه 1و2 آموزش LPC176x/5x ( لینکشو نمیزارم، خودتون برید پیداش کنید ^_^ )
- مطالب ارتباط سریال lpc1768 ( حسش نی لینکاشو بزارم )
پروژه LED چشمک زن با lpc1768 و پایه خروجی MAT – پروژه 1
تو این پروژه همون طور که میدونید رجیستر شمارنده تایمر (TnTC) میتونه تا 0xFFFF FFFF بشموره، و یه رجیستر دیگه داریم به نام رجیستر برابری (MRn) که میتونیم مقدار بهش بدیم(مقدارش ثابته و تغییر نمیکنه)، به کمک رجیستر (Match Control Register (TnMCR میتونیم تعیین کنیم که در صورت برار شدن این دو رجیستر با هم چه اتفاقی بیوفته ( وقفه رخ بده، مقدار TC ریست بشه، TC و PC متوقف بشن و مقدار [TCR[0 صفر بشه )؛ و یه ریجستر دیگه با نام (External Match Register (TnEMR که کنترل میکنه یه سری پایه میکرو کنترلر رو، حالا چطوری؟ برا هر تایمر حداقل 4 تا پایه رو میکرو داریم(برا تایمر2، 6پایه داریم)، که یکیش برا “برابری0” هستش و یکی برا “برابری1” و اسم این پایه به فرم MATn.m هستش (که n شماره تایمر هستش(0تا3) و m شماره “برابری” هستش)؛ میتونیم تعیین کنیم که در صورت برابر شدن این دو با هم، چه بلایی سر این پایه به صورت خودکار بیاد.
شماتیک پروژه : یه LED به پایه P3.25 وصل کنید ( مقاومت 1k فراموش نشه )
عکس پروژه در عمل : تو عکس زیر، اون LED متصل به P3.26 رو همین طوری گزاشتم، نقش هویج داره، اون سیم های اضافه هم برا بحث ارتباط سریال هستش، تو این پروژه کاربردی نداره ولی خب چون تو پروژه های بعدی ممکنه مورد نیاز بشه، گفتم بزار باشه، به کسی کاری ندارن که ^_^
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 |
#include <lpc17xx.h> #include "timer.h" int main() { LPC_PINCON->PINSEL7 = (2<<18); // P3.25 --> MAT0.0 LPC_TIM0->MR0 = 25000000; // Micro Clock = 100M ---> Timer Clock = 25M = 25000000 Clock in 1Sec LPC_TIM0->MCR |= (1<<_MR0R); // Reset timer on Match 0 ResetCounter(); EnableCounter(); LPC_TIM0->EMR = (_Toggle<<_EMC0) | (1<<_EM0); while(1){}; } |
خط 6 : نقش پایه P3.25 رو به MAT0.0 تغییر دادم ( این پایه مربوطه به رجیستر TnEMR، که در صورت برابر شدن دو رجیستر فوق، این پایه وضعیتش تغییر میکنه با توجه به …. )
خط 8 : از اونجایی که فرکانس میکرو 100میگ هستش و تقسیم فرکانسی تایمر0 برابر 4 هستش و لذا فرکانس تایمر 0 برابر 25 میگ هستش( قبلا نحوه تعیین تقسیم فرکانسی امکانات جانبی میکرو-پریفرال- رو توضیح دادم )، لذا هر 25،000،000 تا کلاک تایمر میشه 1 ثانیه؛ من مقدار رجیستر “برابری0” رو گزاشتم 25،000،000 تا وقتی شمارنده تایمر(TnTC) به این مقدار رسید اتفاق مد نظرم رخ بده.(میخوام یه LED رو هر 1 ثانیه یه بار خاموش روشن کنم) – این طوری 1 ثانیه LED روشن میشه و 1 ثانیه خاموش.
خط 10 : اومدم گفتم در صورت برابر شدن رجیستر “برابری0” با T0TC بیا مقدار T0TC رو 0 کن.( میخوایم LED رو 1ثانیه یبار روشن خاموش کنم دیگه، پس ریجستر شمارنده وقتی به 1 ثانیه یا همون 25000000 تا کلاک رسید یا همون مقدار رجیستر “برابری0” باید مقدار T0TC ریست بشه تا این عمل روشن خاموش شدن LED یه ثانیه یه بار انجام بشه. )
خط 11 : این تابع، تعریفش به صورت زیر هستش، کار این تابع ریست کردن شمارنده و توقف ریست شدن هستش ( چون متوقفش نکنی تا قیامت همین طوری هی شمارنده رو ریست میکنه )
1 2 3 4 5 6 7 8 9 10 |
void StartResetCounter(void) { LPC_TIM0->TCR |= (1 << _CounterReset); // Reset Timer0 } void StopResetCounter(void) { LPC_TIM0->TCR &= ~(1 << _CounterReset); // stop resetting the timer } void ResetCounter(void) { StartResetCounter(); StopResetCounter(); } |
خط 12 : فعال کردن شمارنده برای شمارش.
1 2 3 |
void EnableCounter(void) { LPC_TIM0->TCR |= (1 << _CounterEnable); // Timer/Counter & Prescale Counter/Timer Enable } |
خط 14 : گفتم در صورت برابر شدن MR0 با T0TC بیا پایه ( P3.25 ( MAT0.0 رو مقدارش رو برعکس کن، اگه 0 هستش، 1 کن و اگه 1 هستش، 0 کن.
فیلم پروژه :
پروژه LED چشمک زن با lpc1768 و وقفه – پروژه 2
خب تو پروژه قبلی دیدید که اومدیم و از رجیستر T0EMR برا روشن خاموش کردن خودکار یه LED استفاده کردیم، حالا تو این مطلب میخوایم یکم لقمه رو دور دهنمون بپیچونیم(فقط برای یادگیری ^_^)، تو این پروژه دیگه از این رجیستر EMR استفاده نمیکنم و به جاش میام از وقفه استفاده میکنیم ( وقفه برابر شدن T0TC با MR0 ) و داخل تابع وقفه میایم یه LED رو روشن خاموش میکنیم.
شماتیک و فیلم و عکس پروژه در عمل : مثل پروژه 1
کد پروژه : این از کد پروژه ( که LED متصل به پایه P0.25 رو روشن خاموش میکنیم هر 1ثانیه یکبار )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <lpc17xx.h> #include "timer.h" void TIMER0_IRQHandler (void) { if((LPC_TIM0->IR & 0x01) == 0x01) // if MR0 interrupt { LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag //LPC_GPIO3->FIOPIN = ~LPC_GPIO3->FIOPIN; // ساده ترین راه LPC_GPIO3->FIOPIN ^= (1 << 25); // درست ترین راه } } int main() { LPC_GPIO3->FIODIR = (1<<25); // Set P3.25 OutPut LPC_TIM0->MR0 = 25000000; // Micro Clock = 100M ---> Timer Clock = 25M = 25000000 Clock in 1Sec LPC_TIM0->MCR |= (1<<_MR0R) | (1<<_MR0I); // Reset timer on MR0, Interrupt timer on MR0 ResetCounter(); EnableCounter(); NVIC_EnableIRQ(TIMER0_IRQn); // Enable timer interrupt while(1){}; } |
تو این کد کار خاصی نکردم، فقط در خط 25ام اومدم وقفه “برابری0” رو فعال کردم؛ داخل وقفه هم LED رو تاگل میکنم.
توجه : عملگرد این پروژه و شماتیکش دقیقا مثل پروژه قبلی هستش، فقط نحوه نوشتن کدش یکم فرق داشت.
پروژه LED چشمک زن با lpc1768 و تغییر زمان هر کلاک TC – پروژه 3
خب تو این پروژه اومدم، مدت زمان هر شمارش TC رو تغییر دادم، همون طور که گفتم در حالت عادی در هر بار کلاک تایمر، مقدار TC یه واحد زیاد میشه، حالا میتونیم زمان هر کلاک TC رو دستکاری کنیم به کمک رجیستر PR ^_^
شماتیک، عکس در عمل و فیلم پروژه : مثل پروژه 1و2
کد پروژه : خب این پروژه هم مثل دو پروژه قبلی هستش ولی روش نوشتن کد پروژه فرق داره.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <lpc17xx.h> #include "timer.h" void TIMER0_IRQHandler(void) { if((LPC_TIM0->IR & 0x01) == 0x01) // if MR0 interrupt { LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt flag LPC_GPIO3->FIOPIN ^= (1<<25); // Toggle P3.25 } } int main() { LPC_GPIO3->FIODIR = (1<<25); // Set P3.25 OutPut LPC_TIM0->MCR |= (1<<_MR0R) | (1<<_MR0I); // Reset timer on MR0, Interrupt timer on MR0 LPC_TIM0->PR = getPrescalar_1us(); // Prescalar for 1us LPC_TIM0->MR0 = 1000000; // Load timer value to generate 100ms delay ResetCounter(); EnableCounter(); NVIC_EnableIRQ(TIMER0_IRQn); // Enable Timer0 Interrupt while(1){}; } |
خب همون طور که میبینید یه تابع جدید با نام getPrescalar_1us اومدم به کتابخونه تایمر ام اضافه کردم، کد این تابع به صورت زیر هستش :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
uint32_t getPrescalar_1us(void) { unsigned int prescalarForUs; char Timer0ClockDivider; uint32_t Timer0Clock; Timer0ClockDivider = (LPC_SC->PCLKSEL0 >> 2) & 0x03; // get the pclk info for required timer switch ( Timer0ClockDivider ) // Decode the bits to determine the pclk { case 0x00: Timer0Clock = SystemCoreClock/4; break; case 0x01: Timer0Clock = SystemCoreClock; break; case 0x02: Timer0Clock = SystemCoreClock/2; break; case 0x03: Timer0Clock = SystemCoreClock/8; break; } prescalarForUs = Timer0Clock/1000000 /*- 1*/; // Prescalar for 1us (1000000Counts/sec) return prescalarForUs; } |
کار این تابع اینه : فرکانس تایمر رو به دست میاره و تقسیم بر 1M میکنه و میشه تعداد کلاک برای 1 میکرو ثانیه و بعد اینو ارسال میکنه – حالا اگه این مقدار رو به رجیستر PR بدیم، زمان هر 1واحد افزایش TC برابر 1میکرو ثانیه میشه.
حالا در پروژه من مقدار MR0 رو 100000 دادم، و یعنی هر موقع TC یه MR0 برسه، TC ریست میشه(0 میشه) و وقفه رخ میده، و این یعنی 1000000 تا 1میکرو ثانیه و میشه 1000 میلی ثانیه یا همون 1 ثانیه – لذا LED ما هر 1 ثانیه یه بار خاموش روشن میشه.
بقیه موارد مثل پروژه های قبلی هستش، تنها کاری که تو این پروژه کردیم اینه که زمان هر واحد افزایش TC رو تغییر دادیم – فقط همین.
پروژه تولید فرکانس های مختلف با lpc1768 – پروژه 4
تو این پروژه به کمک پایه خروجی MAT و یکم دستکاری MR0 و دادن مقادیر کم بهش، فرکانس های مختلف تولید میکنیم، من تو این پروژه فرکانس 10 کیلو تولید کردم، مقدار رجیستر MR0 برا فرکانس 1 کیلو هم در داخل کد پروژه، مقدارش رو قرار دادم، من با این روش فرکانس 25 میگ خیلی دقیق هم درست کردم، فرکانس تایمر رو برابر فرکانس مرکزی قرار دادم ( تقسیم کننده فرکانس تایمر رو مقدارش رو 1 قرار دادم ) و مقدار MR0 هم فک کنم 1 قرار دادم و مقدار PR هم 0 قرار دادم اگه اشتباه نکنم تا هر واحد افزایش شمارنده TC برابر 1 دونه کلاک مرکزی بشه.
شماتیک پروژه : مثل پروژه های قبلی هستش فقط به جای این که پایه P3.25 رو به led بدیم، میایم به یه لاجیک آنالیزر یا اسکپ یا مولتیمتر(که قابلیت محاسبه فرکانس داشته باشه) میدیم، تا مطمئن بشیم که فرکانسی که درست کردیم، درست، درست کردم!!!
عکس پروژه در عمل :
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <lpc17xx.h> #include "timer.h" int main() { LPC_PINCON->PINSEL7 = (2<<18); // P3.25 --> MAT0.0 // Micro Clock = 100M ---> Timer Clock = 25M = 25000000 Clock in 1Sec //------------- // Fout = 1k ---> Tout = 1ms ---> Number Clock Timer = 25000 Clock // Pulse = 0 + 1 ---> 25000 Clock / 2 = 12500 Clock //------------- // Fout = 10k ---> Tout = 0.1ms ---> Number Clock Timer = 2500 Clock // Pulse = 0 + 1 ---> 25000 Clock / 2 = 1250 Clock LPC_TIM0->MR0 = 1250; // 10khz LPC_TIM0->MCR |= (1<<_MR0R); // Reset timer on Match 0 ResetCounter(); EnableCounter(); LPC_TIM0->EMR = (_Toggle<<_EMC0) | (1<<_EM0); while(1){}; } |
خب این پروژه هم هیچی نداره و مثل پروژه 1 هستش، فقط تو پروژه 1 مقدار فرکانس 1 بود و اینجا 10 کیلو، کلا خواستم یکم ذهنتون رو باز کنم که تولید فرکانس با تایمر چیز شاقی نیستش.
فیلم پروژه :
پروژه استفاده از مد شمارنده تایمر/کانتر lpc1768 – پروژه 5
شماتیک پروژه : به پایه P1.26 یه دکمه با مقاومت پول دان وصل کنید و هر بار که دکمه رو فشار بدید، مقدار TC یه واحد زیاد میشه؛ مبدل USB TO TTL رو به میکرو وصل کنید، چون اطلاعات به پورت سریال ارسال میشه.
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <lpc17xx.h> #include "serial.h" #include "timer.h" int TC_LastNumber = 0; int main() { initialization( 9600, 0/*autoBaud_Enable*/, 0/*use_AutoBaud_Finish_Interrupt*/, _1Character/*NumberCharRxTrigger*/ ); LPC_PINCON->PINSEL3 = (3<<20); // Set P1.26 as CAP0.0 LPC_PINCON->PINMODE3 = (2<<20); // no Pull-Down or Pull-Up of P1.26 LPC_TIM0->CCR = 0; LPC_TIM0->CTCR = (_CounterMode_RisingEdge<<_CounterTimerMode) | (_CAPn_0<<_CountInputSelect); ResetCounter(); EnableCounter(); while(1) { if( TC_LastNumber != LPC_TIM0->TC ) { TC_LastNumber = LPC_TIM0->TC; printNumberln(LPC_TIM0->TC, 10); } }; } |
پروژه استفاده از پایه ورودی CAP در lpc1768 – پروژه 6
تو این پروژه، به کمک پایه CAP، که به دکمه (با مقاومت پول دان) بهش وصل کردم، زمان بین هر دو بار کلیک شدن دکه رو به من مده، در دفه اول فشرده شدن دکمه، زمان از زمان روشن شدن میکرو محاسبه میشه.
شماتیک : مثل پروژه 5 هستش.
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <lpc17xx.h> #include "serial.h" #include "timer.h" void TIMER0_IRQHandler(void) { if( (LPC_TIM0->IR & (1 << _CR0_Interrupt)) == (1 << _CR0_Interrupt) ) // if CR0 interrupt { printNumber(LPC_TIM0->CR0, 10); write('-'); printNumberln(LPC_TIM0->TC, 10); LPC_TIM0->TC = 0; LPC_TIM0->IR |= (1 << _CR0_Interrupt); // Clear CR0 interrupt flag } } int main() { initialization( 9600, 0/*autoBaud_Enable*/, 0/*use_AutoBaud_Finish_Interrupt*/, _1Character/*NumberCharRxTrigger*/ ); LPC_PINCON->PINSEL3 = (3<<20); // Set P1.26 as CAP0.0 LPC_PINCON->PINMODE3 = (2<<20); // no Pull-Down or Pull-Up of P1.26 LPC_TIM0->CCR = (1<<_CAP0RE) | (1<<_CAP0I); LPC_TIM0->CTCR = (_TimerMode<<_CounterTimerMode) | (_CAPn_0<<_CountInputSelect); ResetCounter(); EnableCounter(); NVIC_EnableIRQ(TIMER0_IRQn); // Enable Timer0 Interrupt while(1); } |
پروژه نوشتن تابع Delay به کمک تایمر lpc1768 – پروژه 7
خب یه متغیر هستش به نام Number که هر 1 ثانیه یکبار مقدارش یه واحد زیاد میشه و مقدارش به پورت سریال ارسال میشه، حالا این تاخیر زمانی رو اومدیم تابعش رو با تایمر نوشتیم؛ برای این اطلاعات رو به پنجره سریال ارسال کردم تا بتونید با شمارنده زمان ( که تو اکثر موبایل ها هستش )، میزان دقت این تابع delayMs رو متوجه بشید.
شماتیک پروژه : مبدل USB TO TTL رو به میکروکنترلر وصل کنید.
کد پروژه : تو کد زیر، اگه اون خط 8 رو یه تابع براش بنویسید که فرکانس تایمر رو بده خیلی خوب میشه، این طوری در تمام پروژه ها میتونیم از تابع delayMs استفاده کنیم، در غیر این صورت هر دفه مجبوریم این خط رو تغییر بدیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <lpc17xx.h> #include "serial.h" void delayMs( uint32_t delayInMs ) { LPC_TIM0->TCR = 0x02; // reset timer LPC_TIM0->PR = 0x00; // set prescaler to zero LPC_TIM0->MR0 = delayInMs * ((SystemCoreClock/4)/(1000-1)); LPC_TIM0->IR = 0xff; // reset all interrrupts LPC_TIM0->MCR = 0x04; // stop timer on match LPC_TIM0->TCR = 0x01; // start timer // wait until delay time has elapsed while (LPC_TIM0->TCR & 0x01); } int main() { int Number = 0; initialization( 9600, 0/*autoBaud_Enable*/, 0/*use_AutoBaud_Finish_Interrupt*/, _1Character/*NumberCharRxTrigger*/ ); while(1) { printNumber( Number++, 10 ); write('\n'); delayMs( 1000 ); } } |
فیلم زیر رو هم پیشنهاد میکنم حتما ببیند ( “اظهارات فوق جنجالی دکتر حسن عباسی در روز دانشجو 16 آذر 95” و گفتن نام کسی که با صهیونیست ها مذاکره کرده و بعد عملیات کربلای 4 لو رفت و… )
http://www.aparat.com/v/JgXZ2
امیدوارم این مطلب برای شما مفید بوده باشه، تا مطلب بعد اگه زنده بودیم، یا علی.
مهمان
سلام
ببخشید لینک نرم افزار logic analyzer رو که استفاده کردید میشه محبت کنید
ممنون
نویسنده این مطلب
سلام تو فروشگاه eca و آفتاب رایانه سرچ کنید پیدا میکنید.
مهمان
سلام خدمت شما. میخواستم بدونم که چرا توی پروژه اول، از عبارات هایی مثل MR0R_ ارور میگیره. ممنون.
نویسنده این مطلب
سلام
کتابخونه های مورد نیاز تو سیستمت نی و این یعنی نسخه های صحیح کیل رو نصب نکردی – 3 تا نسخه داشت تا جایی که یادمه
مهمان
سلام ممکنه در مورد نوشتن توابع وقته بیشتر توضیح بدین که اصولش چطوری هست تو AVR ی جدول داشت که شماره هر وقفه مشخص هست اگر اینم جدولی چیزی داره لطفا لینکشو بزار خیلی ممنونم از آموزشای قشنگت
مهمان
سلام برادر
اگه خواسته باشیم مثلا تایمر صفر رو بدون استفاده از اینتراپت بنویسیم باید چیکار کنیم؟
آیا باید تو یه حلقه بی نهایت مدام TC چک کنیم؟
میشه کمک کنید؟
مهمان
سلام اقا مهدی…سپاس که جواب دادید… من جایی در برنامه ندیدم که pllرو تنظیم کرده باشید..!یعنی حالت defaultقرار داده شده …؟سوالی هم در مورد تنظیم pllداشتم که در تابعsysteminit() مقادیر mرو۶۳وnرو۵قرار داده…آخه چرا…طبق فرمول خروجی pllوابسته به ورودی هستش…پس mوnنباید ثابت باشند…اصلا این اعداد هم تو فرمول رند در نمیان…اگه ما خروجی ثابت ۱۰۰MHzرو می خواهیم…سال نو هم مبارک
نویسنده این مطلب
سلام-فعلا شما همون پروژه هایی که من قرار میدم – همونو تست کنید و ویرایش کنید – تا مطالب رو من کم کم بهشون برسم و بپردازم – فعلا دارم مطلب EEPROM رو مینویسم – چند روزه…
عید شما هم مبارک
مهمان
با سلام
آقا اگه به سوال یارانه می دن بگید ما هم بریم سایت بزنیم
اینکه شما در بالا گفتید که فرکانس ما۱۰۰mhzهست بر چه اساسیه؟من در این زمینه سوال دارم….البته قبلا هم یه درخواست داشتم جواب ندادید…
تشکر
نویسنده این مطلب
سلام
بر مبنای این که واقعا فرکانس بردم ۱۰۰ میگ هستش
اگه مشکلی هستش بگید دیگه جواب ندم.
مهمان
سلام
ممنون از زحماتتون بابت مطالب سایت
یه سوال داشتم اقای دمرچیلو من یه برد اموزشی armlpc1768خریدم دنبال یه کتاب هستم که هم خیلی خوب توضیح داده باشه و هم پروژه محور باشه میخاستم بدونم شما کتاب خاصی رو میشناسین معرفی کنین
ممنون
نویسنده این مطلب
سلام
والا من کتاب محمد خوش باطن رو خریدم – این قدر کتاب … هستش که نگاه هم نمیکنم خیلی وقتا – حیف اون پول – کتاب غیر از این دیدی – بخرش – چون کتاب من در این زمینه کم دیدم – همین مطالبی که من میزارم تو سایت هم میتونی استفاده کنی – سوالی هم بود من در خدمتم.
مهمان
تو پروژه هفتم نهایت یک ثانیه میتونیم درست کنیم دیگه ؟؟مگه این که کد زو تغییر بدیم
نویسنده این مطلب
این تابع حداقل ۱ میلی ثانیه تولید میکنه – برا تغییر این زمان بله باید کدها رو تغییر بدی.
مهمان
تو پروژه ۶ چرا اینو نوشتی ؟
printNumberln(LPC_TIM0->TC, 10);
وقتی نشون میدی TC با CR کمی فرق داره؟؟
نویسنده این مطلب
TC : تایمر/کانتر؛ این رجیستر ۳۲ بیتی افزایش پیدا میکنه هر PR+1 تا کلاک PCLK؛ TC به وسیله TCR کنترل میشه.
—————-
CR0 : رجیستر کپچر ۰؛ مقدار TC درون CR0 لود میشه وقتی که لبه انتخاب شده روی پایه انتخاب شده کپچر ( CAP0.0 – CAP1.0 ) رخ بده.
———————–
خواستم نشون بدم که اون لحظه ای که TC رو میخونیم – مقدارش با CR0 برابر نیست – به هیمن خاطره که رجیستر CR0 وجود داره –
اینم کدی که من نوشتن – برا نشون دادن تفاومت در زمان :
printNumber(LPC_TIM0->CR0, 10);
write('-');
printNumberln(LPC_TIM0->TC, 10);
مهمان
سلام
حاجی تو پروژه دوم به نظرت این کار عبثی نیست که توی if چک میکنیم وقفه رخ داده یانه
if((LPC_TIM0->IR & 0x01) == 0x01)
؟؟؟
نویسنده این مطلب
سلام
مطلب رو بخون دقیق – حال خوندن و جواب دادن ندارم الان – سر مطلب I2C دهنم داره سرویس میشه – حوصلم رو گرفته!!!
احتملا باید این روتین وقفه برا چند تا منبع مشترک باشه – لذا اومدم بررسی کردم – تا منبع اصلی که باعث رخ دادن وقفه شده رو پیدا کنم – مطلب آموزش تایمر ۱۷۶۸ رو بخون – به جواب نرسیدی بگو خودم بخونم.
مهمان
الان بخوام این پروژه اولی رو ببندم باید چه تغییری رو کلاکم بدم؟
هدربوردم eca هستش
مقدار Xtal رو هم به صورت پیش فرض ۱۲ مگ گذاشته
اینو بی زحمت توضیح میدی؟
تشکر
مهمان
LPC_TIM0->MCR |= (1<<_MR0R); // Reset timer on Match 0
ResetCounter();
EnableCounter();
تو این قسمت کد تو پروژه اول دیگه وقتی MR0R رو یک کردی رجیستر های TC , PC ریست میشن چرا اینجا دوباره از ResetCounter استفاده می کنی؟
نویسنده این مطلب
سلام آقا حسین – عرضم به حضورت که :
LPC_TIM0->MCR |= (1< <_MR0R); // Reset timer on Match 0
تو این کد من گفتم هر موقع مقدار شمارنده Tc با mr0 برابر شد - شمارنده رو ریست کن -
ResetCounter();
این تابع دو کد زیر رو اجرا میکنه :
LPC_TIM0->TCR |= (1 < < _CounterReset); // Reset Timer0 LPC_TIM0->TCR &= ~(1 < < _CounterReset); // stop resetting the timer
که برا ۰ کردن مقدار اولیه شمارنده استفاده میشه.
این دو دو مقوله جدا از هم هستن - مطلب آموزش تایمر رو بخونی این دو رجیستر TCR و MCR رو توضیح دادم.
مهمان
ResetCounter();
EnableCounter();
علتش چیه که اول ریست میکنید بعد فعالش میکنید ؟؟؟؟
مهمان
خب من میگم دوباره کاری کردی دیگه.
وقتی Pc , Tc صفر میشن دوباره داری صفرش میکنی
یه اشتباه تایپی هم تو پروژه دوم هست که P0.25 رو روشن نکردی بلکه p3.24 رو طبق کد روشن کردی
بعد اینکه کلاک میکرو رو کجا تنظیم کردی که ۱۰۰ مگه؟؟درحالیکه کریستالت ۱۲ مگه
نویسنده این مطلب
نه دیگه
الان من مقدار MR0 رو بر روی ۲۵۰۰۰۰۰۰ تنظیم کردم – وقتی TC به این مقدار برسه ریست میشه طبق دستور زیر ( و این ریست شدن همشگی هستش ) :
LPC_TIM0->MCR |= (1<<_MR0R); // Reset timer on Match 0 ولی تو تابع ResetCounter مقدار TC که ممکنه مثلا در شروع کار ۰ نباشه - میام و ۰اش میکنم - البته در این پروژه همیشه ۰ هستش و نیازی به این تابع نسیت ولی بهتره که عادت کنیم این ریست رو قرار بدیم. در مورد کلاک هم یه چیز هستش به اسم PLL - اگه شما مثل من هدر برد ECA رو خریده باشین - به صورت پیشفرض کلاک ۱۰۰ میگه - در این مورد هم باید در جلسات اولیه مطلبشو میزاشتم و قبول دارم اشتب از منه - به زودی سعی میکنم مطلبشو بزارم - البته بعد از مطلب PWM
مهمان
توی منوی target کیل ۱۲ مگ زده Xtal رو .۱۰۰ مگ رو کجا زده؟؟؟
نویسنده این مطلب
یه بحثی به نام pll هستش – بعدا میگم آموزشش رو – فعلا به کالا کاری نداشته باشید
مهمان
داداش دمت گرم
یه دونه ای