زمان کنونی: 08-24-2019, 09:20 PM
درود مهمان گرامی! (ورودثبت نام)



New Reply 
 
تایمر1
11-29-2017, 11:51 AM
ارسال: #1
تایمر1
این کد مخصوص پرژه ای است که اگر فاصله از حد 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 */ 
Quote
12-01-2017, 12:50 PM
ارسال: #2
RE: تایمر1
سلام

دقت کنید که واحد تایمر با توجه به 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 به سراغ باقی شرط ها برروی فاصله بروید.

موفق باشید

[تصویر:  telegram_icon.png] کانال رسمی EasyMCU در تلگرام
.
.
Quote
New Reply 


پرش به انجمن:

تماس با ما | EasyMCU | بایگانی | پیوند سایتی RSS
بازگشت به بالا
Persian Translation by MyBBIran.com - Ver: 4.6
Powered by MyBB, © 2002-2019 MyBB Group.
Designed by Escalate Internet. Icons by dAKirby309.

ورود
نام کاربری:
گذرواژه‌:



Lost your password?