اطلاعیه

Collapse
No announcement yet.

سنسور LM35 با وقفه میکرو

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    سنسور LM35 با وقفه میکرو


    با سلام وخسته نباشید
    دوستان بعد مطالعه رجیسترای مبدل انالوگ به دیجبتال سنسور دمای LM35 رو به روش سرکشی و بدون وقفه راه اندازی کردم
    بعدش خواستم با استفاده از وقفه این کارو بکنم و کد زیر رو نوشتم
    مشکلم اینه که داخل حلقه بینهایت اگه استارت نزنم اعداد نامعتبری میگیرم و نمیدونم چرا؟ مگه بعد خروج از وقفه خود میکرو استارت نمیزنه؟؟
    اگه از مهندسای عزیز کسی این سنسور رو با وقفه (دستورات رجیستری )و بدون مشکل راه انداحته کدشو بذاره تا مقایسه کنم
    ممنونم ازهمگی
    کد:
    #include "lpc17xx.h"               /* LPC17xx definitions  */
    #include "lcd4bit.h"
    #include <stdio.h>
    
    
    
    
    void Delay (uint32_t Time)
    {
      uint32_t i;
      
      i = 0;
      while (Time--) {
        for (i = 0; i < 5000; i++);
      }
    }
    
    
    void ADC_IRQHandler (void) 
    {
    	char	buff[20];
    	unsigned short current_value;
    	 int s;
    	unsigned int i;
    	while ((LPC_ADC->ADGDR & 0x80000000) == 0);
    	i = LPC_ADC->ADDR0; // Read A/D Data Register
     current_value = (i >> 4) & 0x0FFF; // bit 4:15 is 12 bit AD value
    	s = current_value/13;
    		 	sprintf(buff,"Temp = %i ",s);
    		 lcd_puts(buff);
    			Delay(1500);
    		 command(0x01);
    			NVIC_DisableIRQ(ADC_IRQn);	
    }
    
    //===================================================================================================
    int main(void){
    	lcd_init_4bit();
    	Delay(1000);
    //==========================================================
    	LPC_PINCON->PINSEL1 = 1 << 14; // p0.23 select as ADC0.0  23-16=7 2*7=14
     LPC_SC->PCONP |= (1 << 12); // Enable power to AD block 
    		
     LPC_ADC->ADCR |= (1<<0);    //select AD0.0 0x1 0x2 0x4 0x8 1000
     LPC_ADC->ADCR |= 1<<8;   		// 	ADCLK is 12.5 MHz 1 0000 0000
    	//LPC_ADC->ADCR |= 0x10000;  // BURST bit  1 << 16
     LPC_ADC->ADCR |= 0x200000;  //Power up,  1 << 21
     //LPC_ADC->ADCR |= 0x08000000; //Start conversion on a falling edge on the selected CAP/MAT signal.
    	              // 1 << 27
     //-----------------------------
     LPC_ADC->ADCR |= 0x01000000; // Start A/D Conversion , When the BURST bit is 0 
    
    LPC_ADC->ADINTEN |= 0x00000001;			// Enable interrupt on channel 0	
    		
    	//===========================================================
    	
    			
    			//LPC_ADC->ADCR &= ~(7<<24);           /* stop conversion */
    			//LPC_ADC->ADCR |= (1<<24);           /* start conversion */
    			
    	
    	while(1){
    		
    		LPC_ADC->ADCR |= (1<<24);           /* start conversion */ چرا باید باشه؟؟؟؟؟
    		 NVIC_EnableIRQ(ADC_IRQn);	
       
    		
    		}
    	
    }
    If your dreams don't scare you,They aren't big enough

    #2
    پاسخ : سنسور LM35 با وقفه میکرو

    سلام
    من خیلی وارد جزییات کد نشدم ولی یه سوال از خودتون بپرسید: با توجه به مفهوم موقفه ، این عبارت while ((LPC_ADC->ADGDR & 0x80000000) == 0); در زیر روال وقفه چه کاری می کنه دقیقا !!!!!!!؟
    فيلم آموزشي ميکروکنترلر LPC1768
    فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
    فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
    فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

    دیدگاه


      #3
      پاسخ : سنسور LM35 با وقفه میکرو

      اون دستور بیت DONE رو چک میکنه و وجودش تو روتین وقفه کاملا غیرضروری و بیخوده !!
      بعد خوردن به مشکل عدم دریافت عدد معتبر از این واحد با کد ور رفتم تا علتو پیدا کنم و این قسمت یادم رفته پاکش کنم
      با استارت در حلقه بینهایت while مشکل برطرف شد اما نمیدونم چرا؟؟؟؟؟
      If your dreams don't scare you,They aren't big enough

      دیدگاه

      لطفا صبر کنید...
      X