سلام
فک کنم اینجا هم طبق قوانین بقیه سایتها برای هر مشکل باید یه تاپیک جدید باز کرد
خواهشمندم توی این مشکل هم به من راهنمایی کنین چون واقعا لنگش هستم و باید طی این هفته تمومش کنم
واقعا دیگه هنگ کردم ، پس تو رو خدا کمک کنین تا هم من مشکلم حل شه و هم بزاریمش تو سایت تا بقیه هم بتونن استفاده کنن
این برنامه سه کاراکتر که یه عدد سه رقمی باشه رو از پورت سریال کامپیوتر دریافت میکنه و به میزان عدد دریافتی استپ موتور رو میچرخونه ،مثلا اگه عدد ورودی 270 باشه استپ موتور با دقت 1 درجه رو 270 درجه میچرخونه
براین این کار از وقفه سریال usart با بافر 3 تایی استفاده شده ، آرایه rx_buffer توسط کد ویزارد برای ذخیره دیتای ورودی و آرایه databuff نوع int برای بدست آوردن و ذخیره عدد نهایی است که در sum ذخیره میشود و sum و count هم int هستند
کد:
databuff[0] = rx_buffer[2];
databuff[1] = rx_buffer[1];
databuff[2] = rx_buffer[0];
databuff[1] = databuff[1] * 10;
databuff[2] = databuff[2] * 100;
sum = databuff[0] + databuff[1] + databuff[2];
count =0x00;
while(1)
{
for(num=0;num<4;num++)
{
count ++;
if(count<sum)
{
PORTC = step[num];
delay_ms(40);
}
else
{
goto end;
}
}
}
end:
همچنین برنامه بالا در قسمت فعال شدن وقفه وقتی هر سه کاراکتر دریافت بشن قرار داره
برنامه کامل
کد:
#include <mega8.h>
#include <delay.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 3
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
unsigned int databuff[3],sum,sum2,count;
char step[]={0x66,0x33,0x99,0xcc},num;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
//***************************************
databuff[0] = rx_buffer[2];
databuff[1] = rx_buffer[1];
databuff[2] = rx_buffer[0];
databuff[1] = databuff[1] * 10;
databuff[2] = databuff[2] * 100;
sum = databuff[0] + databuff[1] + databuff[2];
count =0x00;
while(1)
{
for(num=0;num<4;num++)
{
count ++;
if(count<sum)
{
PORTC = step[num];
delay_ms(40);
}
else
{
goto end;
}
}
}
end:
//**************************************
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
void main(void)
{
PORTC=0x00;
DDRC=0xFF;
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;
#asm("sei")
while (1)
{
};
}
ممنون میشم اگه کمکم کنید