سلام دوستان
من سال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;
}

