Forums
تایمر1 - نسخه‌ی قابل چاپ

+- Forums (http://forums.easymcu.ir/fa)
+-- انجمن: EasyMCU (/forumdisplay.php?fid=1)
+--- انجمن: سوالات برنامه نویسی (/forumdisplay.php?fid=14)
+--- موضوع: تایمر1 (/showthread.php?tid=958)



تایمر1 - ho3n - 11-29-2017 11:51 AM

این کد مخصوص پرژه ای است که اگر فاصله از حد 50سانتی متر کمتر شود LEDها شروع به چشمک زدن میکنن و بازر قطع و وصل میشه و اگ فاصله از 10سانت کمتر باشد فن خاموش میشه
ولی دز این پرژه حلقه تایمر 1 هنگ میکنه یا خوب کار نمیکنه
مشکل از کار کجاست؟
کد php:
    #include "headers.h"

float distance0;
SR04 ultrasonic(P5,P6);
        
LiquidCrystal lcd(P40,P39,P38,P37,P36,P35);
  
        
        
        
void prt_dis (void)
        {
            
distance ultrasonic.distance();            
            
            
lcd.setCursor(6,0);
            
lcd.print(distance);
            
            
        }
int main()
{
  
io.mode(P4,OUTPUT);    
  
lcd.begin(162);
    
lcd.setCursor(00);    
    
lcd.print("S  A  L  A  M");
    
delay.ms(1500);
    
lcd.clear();
    
lcd.setCursor(00);
    
lcd.print("Dic=");
    
lcd.setCursor(13,0);
    
lcd.print("cm");
    
float s=0;
    
    
io.mode(P8,OUTPUT);
    
io.mode(P9,OUTPUT);
    
io.mode(P10,OUTPUT);
    
    
vusb_enable();
    
    
timer1.init(200000,true);
    
timer1.attachISR(prt_dis);
    
io.set(P10);
    
    while(
true)
    {
        
        
        if(
ultrasonic.distance()< 50)
        {
            
s=ultrasonic.distance();
            
io.set(P8);
            
io.set(P9);
            
delay.ms(s*10);
            
io.reset(P8);
            
io.reset(P9);
            
delay.ms(s*10);
        }
        
        if(
ultrasonic.distance()< 10)
        {
            
io.reset(P10);
        }
        else
        {
            
io.set(P10);
        }
        
        
    } 
/* while */
/* main */ 



RE: تایمر1 - Sharin - 12-01-2017 12:50 PM

سلام

دقت کنید که واحد تایمر با توجه به interval مشخص شده برای این واحد وقفه تولید می کند، به عبارت دیگر زمان اجرای روتین وقفه ی تایمر، در زمان های مشخصی همزمان با اجرای محتویات درون حلقه ی while در تابع main هست.
یعنی ممکن است که خط در حال اجرای برنامه روی تابع ()ultrasonic.distance باشد و درست در همان لحظه وقفه تایمر هم رخ دهد و عملیات trig کردن ultrasonic و خواندن میزان فاصله مختل شود !
پس در زمان برنامه نویسی باید همه ی حالات مختلف را مد نظر قرار دهید.

جدا ی از این مورد، شرط هایی که استفاده کردید، طبیعتا کارامد نخواهند بود ، شرط کمتر از 50 و کمتر از 10 بودن به صورت موازی چک می شوند و به ترتیب ، و این در حالی است که فاصله در هر صورت یا کمتر از 10 است ، و یا بزرگتر از 10 و کمتر از 50 ، و یا بزرگتر از 50 است (با توجه به قصد پروژه شما) .
در یک زمان هیچجوره نمی تواند در دو حالت صدق کند، پس برای کارامد بودن باید شرط ها رو به ترتیب اولویت بنویسید و حتما از else if استفاده کنید.

در کد فعلی شما ، جهت روشن شدن مسئله یک عدد را به عنوان فاصله ی محاسبه شده در نظر بگیرید و روال اجرای پروژه ی خود را debug کنید، برای مثال اگر فاصله برابر 6 سانتی متر بود چه خط هایی در برنامه ی شما اجرا مش شوند؟

خواهید دید که 6 کمتر از 50 است ، پس محتویات شرط اول اجرا می شود و بعد از آن 6 کمتر از 10 هست، پس محتویات شرط بعدی هم انجام می شود، در صورتی که این مطلوب شما نبوده !
پس اولویت کمتر از 10 بودن بالاتر هست و اول باید شرط کمتر از 10 را بنویسید و با else if به سراغ باقی شرط ها برروی فاصله بروید.

موفق باشید