سلام دوستان
من سال92 در همین انجمن با کمک چند از مهندسین عزیز و البته استاد ارجمند طراح عزیز موفق به طراحی مداری شدم که با استفاده از یک میکرو xmega و انکودر 500 پالس متراژ پارچه رو اندازی گیری میکرد .
امسال در پروژه ای مشابه خواستم همان مدار را دوباره بسازم ولی متاسفانه چند مشکل دارم . البته ذکر کنم که مدار تمام شده و کد نهایی رو هم قبلا در پستی ارائه و توضیح داده بودم ولی متاسفانه دیگه پیداش نمی کنم گویا حذف شده است.
اول اینکه برخی قسمت های کد رو نیمدونم دقیقا چی بوده و فراموش کردم که کد رو قرار میدم اگرلطف کنید و یه راهنمایی کنید ممنون میشم . یعنی اصلا کد داخل حلقه اصلی رو نمی دونم چیکار داره میکنه و اصلا متغییر maxvalue چی بود ؟
دوم اینکه گاهی اوقات کلید های ورودی درست عمل نمی کنند نمی دونم از اینتراپت ها هستند یا از جای دیگه ؟ توضیح اینکه دو تاکلید دارم که در کد مشخصه توابع جدا دارند و متغییر هایی رو هم قرار دادم که بیخودی عمل نکنن. ولی گاهی خود به خود کلید می خوره و گاهی هم کلید می زنیم عمل نمیکنه .
من سال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; }