اطلاعیه

Collapse
No announcement yet.

اتصال انکودر به Xmega

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

    اتصال انکودر به Xmega

    سلام دوستان
    من سال92 در همین انجمن با کمک چند از مهندسین عزیز و البته استاد ارجمند طراح عزیز موفق به طراحی مداری شدم که با استفاده از یک میکرو xmega و انکودر 500 پالس متراژ پارچه رو اندازی گیری میکرد .
    امسال در پروژه ای مشابه خواستم همان مدار را دوباره بسازم ولی متاسفانه چند مشکل دارم . البته ذکر کنم که مدار تمام شده و کد نهایی رو هم قبلا در پستی ارائه و توضیح داده بودم ولی متاسفانه دیگه پیداش نمی کنم گویا حذف شده است.
    اول اینکه برخی قسمت های کد رو نیمدونم دقیقا چی بوده و فراموش کردم که کد رو قرار میدم اگرلطف کنید و یه راهنمایی کنید ممنون میشم . یعنی اصلا کد داخل حلقه اصلی رو نمی دونم چیکار داره میکنه و اصلا متغییر maxvalue چی بود ؟
    دوم اینکه گاهی اوقات کلید های ورودی درست عمل نمی کنند نمی دونم از اینتراپت ها هستند یا از جای دیگه ؟ توضیح اینکه دو تاکلید دارم که در کد مشخصه توابع جدا دارند و متغییر هایی رو هم قرار دادم که بیخودی عمل نکنن. ولی گاهی خود به خود کلید می خوره و گاهی هم کلید می زنیم عمل نمیکنه .

    کد:
     
    #include <avr/io.h>
    #include <avr/interrupt.h>
     
    #define [I]F_CPU[/I] 16000000UL         
     
    //-----------------delays---------------------------------------------------------
    #define LOOP_CYCLES 8                          
    #define fcpu_delay_us(num) delay_int(num/(LOOP_CYCLES*(1/([I]F_CPU[/I]/1000000.0))))
    #define fcpu_delay_ms(num) delay_int(num/(LOOP_CYCLES*(1/([I]F_CPU[/I]/1000.0))))
     
    void delay_int(unsigned long delay);
    //--------------------------------------------------------------------------------
    void system_clocks_init(void);
    void usarte0_init(void);
     
     
    #define Set(a, b) (a) |= (1 << (b))
    #define Reset(a, b) (a) &= ~(1 << (b))
    #define Output(a, b) (a) |= (1 << (b))
    #define Input(a, b) (a) &= ~(1 << (b))
     
    #define DDRB _SFR_IO8(0x0620)
    #define PORTB _SFR_IO8(0x0620)
    #define PORTB0 0
    #define DDRE _SFR_IO8(0x0680)
    #define DDRC _SFR_IO8(0x0640)
     
    // USARTE0 Receiver buffer   Scale
    #define RX_BUFFER_SIZE_USARTE0 2
    char rx_buffer_usarte0[RX_BUFFER_SIZE_USARTE0];
     
    #if RX_BUFFER_SIZE_USARTE0 <= 256
    unsigned char rx_wr_index_usarte0=0,rx_rd_index_usarte0=0,rx_counter_usarte0=0;
    #else
    unsigned int rx_wr_index_usarte0=0,rx_rd_index_usarte0=0,rx_counter_usarte0=0;
    #endif
     
    // This flag is set on USARTE0 Receiver buffer overflow
    bool rx_buffer_overflow_usarte0= false;
     
    int Counter = 0;
    float Metr = 0 ;
    int Centimeter = 0;
    bool ShartINT0 = true;
    int    CountrShartINT0 = 0;
    bool ShartINT1 = true;
    int    CountrShartINT1 = 0;
     
    int CentimeterSend = 0;
    bool FlgSendRepeter = false;
     
    bool FlgAlowToPushKey2 = false;
     
     
    int MaxValue = 38 ;
    int a = 10;
    int b = 30;
     
    unsigned int Sefr_value;
    unsigned int Now_value;
    unsigned int OLD_value;
    int Jahat = 1;
    unsigned char i;
    int XLED = 0;
    bool FlgZero = false;
    bool FlgMax = false;
    int modeSend = 0;  // 1  sabt normal  2 mokhtalef key2
    int SendCounter=0;
     
    int main(void)
    {
           system_clocks_init();
          
           Output(DDRB,0);
           Output(DDRB,1);
           Output(DDRE,3);
           Input(DDRC,0);
           Input(DDRC,1);
           Input(DDRC,2);
           Input(DDRC,3);
           Input(DDRC,4);
          
           Reset(PORTB, 1);
          
     
           // External interrupt 0 on PC0, enable pullup, sence falling edge
           PORTC.PIN1CTRL = PORT_OPC_PULLUP_gc | PORT_ISC_FALLING_gc;
           PORTC.INT0MASK = PIN1_bm;  //PIN1_bm
           PORTC.INTCTRL = PORT_INT0LVL_LO_gc;
          
           PORTC.PIN2CTRL = PORT_OPC_PULLUP_gc | PORT_ISC_FALLING_gc;
           PORTC.INT1MASK = PIN2_bm;
           PORTC.INTCTRL = PORT_INT0LVL_LO_gc | PORT_INT1LVL_LO_gc ;
     
          
           TCC0_PER = 15623; //   9764;     // (F Crystal) 10.000.000 /  (TC_CLKSEL_DIV256_gc) 256 = 39062.5 ~ -1 = 39060  = 1s / LED     250 ms  9764   15623
           TCC0_INTCTRLA = TC_ERRINTLVL_OFF_gc | TC_OVFINTLVL_LO_gc;
           TCC0_CTRLA = TC_CLKSEL_DIV256_gc;
          
           TCD0_PER = 62499;//    39060;     // (F Crystal) 10.000.000 /  (TC_CLKSEL_DIV256_gc) 256 = 39062.5 ~ -1 = 39060   = 1s / Send Function   62499
           TCD0_INTCTRLA = TC_ERRINTLVL_OFF_gc | TC_OVFINTLVL_LO_gc;
           TCD0_CTRLA = TC_CLKSEL_DIV256_gc;
          
           PMIC_CTRL = PMIC_LOLVLEN_bm;
     
           usarte0_init();
     
           PORTC_PIN3CTRL=PORT_ISC_LEVEL_gc; // QDPH0
           PORTC_PIN4CTRL=PORT_ISC_LEVEL_gc; // QDPH90
           TCC1_PER = MaxValue; // ok 39     
           EVSYS_CH0MUX=EVSYS_CHMUX_PORTC_PIN3_gc;
           EVSYS_CH1MUX=EVSYS_CHMUX_PORTC_PIN2_gc;
           EVSYS_CH0CTRL=EVSYS_QDIEN_bm|EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_gc;
           EVSYS_CH0CTRL=EVSYS_QDEN_bm|EVSYS_DIGFILT_2SAMPLES_gc;
           TCC1_CTRLD=TC_EVACT_QDEC_gc|TC_EVSEL_CH0_gc;
           TCC1_CTRLA=TC_CLKSEL_DIV1_gc;
          
          
           // enable interrupt globally.
           sei();
          
     
          
           while(1)
           {
                  Now_value=TCC1_CNT;
     
                  if((Now_value>a)&&(Now_value< b))   // ok 10 30
                  {
                         FlgZero=false;
                         FlgMax=false;
                  }
                  else if(Now_value<a && !FlgZero && !FlgMax) //min
                  {
                         FlgZero=true;
                         FlgMax=false;
                  }
                  else if(Now_value>b && !FlgZero && !FlgMax) //max
                  {
                         FlgMax=true;
                         FlgZero=false;
                  }
     
                  if(Now_value<a && FlgMax==true)//min
                  {
                         Centimeter++;
                         FlgMax=false;
                         FlgZero=true;
                  }
                  else if(Now_value>b && FlgZero==true) //max
                  {
                         Centimeter--;
                         FlgZero=false;
                         FlgMax=true;
                  }
                 
           }
    }
     
     
     
     
     
     
     
    ISR(PORTC_INT0_vect)
    {
           // push Key 1
           if(ShartINT0)
           {
                  Set(PORTB, 1);
                  //FlgSendRepeter = true;
                  //SendMetrajByIntrupt();
                  SendCounter++;
                  if(SendCounter >= 10) SendCounter = 1;
                  CentimeterSend = Centimeter;
                  FlgAlowToPushKey2 = true;
                  modeSend = 1;
                  Centimeter = 0;
                  Reset(PORTB, 1);
                 
           }
    }
     
    ISR(PORTC_INT1_vect)
    {
           // push Key 2
           if(ShartINT1)
           {
                  if(FlgAlowToPushKey2)
                  {
                         if(Centimeter > 0 && Centimeter <= 15)
                         {
                               FlgAlowToPushKey2 = false;
                               Set(PORTB, 1);
                               SendCounter++;
                               if(SendCounter >= 10) SendCounter = 1;
                               CentimeterSend = Centimeter;
                               modeSend = 2;
                               //SendMetrajByIntruptMokhtalef();
                               Reset(PORTB, 1);
                               Centimeter = 0;
                         }
                  }
           }
    }
     
    ISR (TCD0_OVF_vect)
    {
           SendMetraj();
     
           CountrShartINT0++;
           CountrShartINT1++;
          
           if(CountrShartINT0 >= 3)
           {
                  ShartINT0 = true;
                  CountrShartINT0 = 0;
           }
          
           if(CountrShartINT1 >= 3)
           {
                  ShartINT1 = true;
                  CountrShartINT1 = 0;
           }
          
           bool ShartOK = true;
           int CounterWhile = 0;
          
     
    }
     
     
     
    // System Clocks initialization
    void system_clocks_init(void)
    {
           OSC.XOSCCTRL=0XCB;
           OSC.CTRL = 9;
           while(!(OSC.STATUS & 8));
           CCP = 0xD8;
           CLK.CTRL = 0x03;
           CLK.PSCTRL = 0x01;
    }
    - به دنبال فرصت عمري تباه کردم ! فرصت جواني ام بود من اشتباه کردم .
لطفا صبر کنید...
X