سلام. نمی تونم با usart بین دو میکرو ارتباط برقرار کنم
مشکل این برنامه چیه.... دیگه مخم هنگ کرد :angry: :angry: :angry:
فرستنده:
گیرنده:
اینم از فایل پروتئوس:
مشکل این برنامه چیه.... دیگه مخم هنگ کرد :angry: :angry: :angry:
فرستنده:
کد:
#define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdio.h> #include "ALCD.h" #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART Transmitter buffer #define TX_BUFFER_SIZE 8 char tx_buffer[TX_BUFFER_SIZE]; #if TX_BUFFER_SIZE <= 256 unsigned char tx_wr_index,tx_rd_index,tx_counter; #else unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif ISR(USART_TXC_vect) /**USART Transmitter interrupt service routine **/ { if (tx_counter) { --tx_counter; UDR=tx_buffer[tx_rd_index++]; #if TX_BUFFER_SIZE != 256 if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; #endif } } void usart_tx_init() { // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x48; UCSRC=0x06; UBRRH=0x00; UBRRL=0x33; sei(); } void usart_putchar(char c) { while (tx_counter == TX_BUFFER_SIZE); reti(); if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) { tx_buffer[tx_wr_index++]=c; #if TX_BUFFER_SIZE != 256 if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; #endif ++tx_counter; } else UDR=c; sei(); } int main(void) { PORTD=0x00; DDRD=0x00; usart_tx_init(); // init transmitter lcd_init(); lcd_puts("Tx:"); _delay_ms(300); char count = 1; while (1) { usart_putchar(count); char str[16]; sprintf(str," %d ",count); lcd_puts(str); count++; _delay_ms(1000); lcd_gotoxy(0,0); } }
کد:
#define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdio.h> #include "ALCD.h" #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR) #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 char rx_buffer_overflow;/** This flag is set on USART Receiver buffer overflow **/ ISR (USART_RXC_vect) /*USART Receiver interrupt service routine*/ { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index++]=data; #if RX_BUFFER_SIZE == 256 // special case for receiver buffer size=256 if (++rx_counter == 0) { #else if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; #endif rx_buffer_overflow=1; } } } void usart_rx_init() { // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: Off // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x90; UCSRC=0x06; UBRRH=0x00; UBRRL=0x33; sei(); } char usart_getChar() { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index++]; #if RX_BUFFER_SIZE != 256 if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #endif reti(); --rx_counter; sei(); return data; } int main(void) { PORTD=0x00; DDRD=0x00; usart_rx_init();// init receiver lcd_init(); lcd_clear(); lcd_puts("Rec:"); while (1) { char data; data = usart_getChar(); char str[16]; sprintf(str," %c ",data); lcd_puts(str); lcd_gotoxy(0,0); } }

دیدگاه