سلام،
تو پروژه ای که تو کدویژن درست کردم برای جلوگیری از ایجاد مکث در حلقه ی اصلی while به خاطر تابع ()getchar می خوام از وقفه ارنباط سریال استفاده کنم اما برنامه اصلا کار نمیکنه و از خطی که تابع getchar داره رد نمیشه.... ممنون میشم اگه کمک کنید.
تو پروژه ای که تو کدویژن درست کردم برای جلوگیری از ایجاد مکث در حلقه ی اصلی while به خاطر تابع ()getchar می خوام از وقفه ارنباط سریال استفاده کنم اما برنامه اصلا کار نمیکنه و از خطی که تابع getchar داره رد نمیشه.... ممنون میشم اگه کمک کنید.
کد:
#include <mega16.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 8 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; 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; }; }; } #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> // Declare your global variables here void main(void) { // Declare your local variables here unsigned char n; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x98; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33; // LCD module initialization lcd_init(16); // Global enable interrupts #asm("sei") while (1) { n=getchar()-48; putsf("line passed"); }; }
دیدگاه