اطلاعیه

Collapse
No announcement yet.

مشکل در usart در ATmel Studio

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در usart در ATmel Studio

    سلام. نمی تونم با usart بین دو میکرو ارتباط برقرار کنم
    مشکل این برنامه چیه.... دیگه مخم هنگ کرد :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);
    	}
    }
    اینم از فایل پروتئوس:
    اللهم صل علي محمد و ال محمد و عجل فرجهم
    >>> www.DMF313.ir <<<
    اگر ژرف یابی و پژوهش نباشد; نتیجه اش یک جا ایستادن،
    در جا زدن و با دنیای پیرامون خود به تدریج بیگانه تر شدن
    است.

    #2
    پاسخ : مشکل در usart در ATmel Studio

    سلام.

    ببینید این کارتون را راه میندازه:

    http://homepage.hispeed.ch/peterfleury/uartlibrary.ziphttp://homepage.hispeed.ch/peterfleury/uartlibrary.zip


    برای راه اندازی بخش های مختلف میکرو با gcc می تونید از تاپیک آموزش avr-lib توی تاپیک های مهم انجمن استفاده کنید.

    دیدگاه


      #3
      پاسخ : مشکل در usart در ATmel Studio

      ببینید این کارتون را راه میندازه:
      سلام
      لینک ارور میده.
      با راهنمایتون کارم راه افتاد.
      سپاس
      اللهم صل علي محمد و ال محمد و عجل فرجهم
      >>> www.DMF313.ir <<<
      اگر ژرف یابی و پژوهش نباشد; نتیجه اش یک جا ایستادن،
      در جا زدن و با دنیای پیرامون خود به تدریج بیگانه تر شدن
      است.

      دیدگاه

      لطفا صبر کنید...
      X