با سلام.
بنده مدت زیادیه برای AVR برنامه مینویسم و تا حدود زیادی هم واردم. ولی امروز به یک مشکل برخوردم. و این مشکل بر میگرده به ارسال داده 9 بیتی با UART . بنده قبلاً برای انتقال داده 8 بیتی با UART برنامه نوشته بودم و مشکلی هم نداشتم. ولی وقتی برای مد 9 بیتی برنامه نوشتم دچار مشکل شدم. به طوری که وقتی برای اولین مرتبه بیت نهم رو یک میفرستم در گیرنده بیت RXB8 در رجیستر UCSRB یک میشه و دیگه صفر نمیشه . حتی وقتی دفعه بعدی بیت نهم صفر ارسال بشه. یعنی بعد از اینکه اولین بار بیت نهم یک ارسال میشه تا آخر فقط یک دریافت میشه. ولی در هر وضعیت هشت بیت کم ارزش درست منتقل میشه . برنامه ای هم که استفاده کردم برنامه توصیه شده خود اتمل هست. نکته ای که هست اینه که در اکثر کتابها از پرداختن به این موضوع(انتقال 9 بیتی) تفره رفتند. شاید اشتباه میکنم ولی به این نتیجه رسیدم که این یک باگ سخت افزاری در AVR است. اگر از دوستان کسی میتونه این حرف رو نقض کنه یک برنامه مناسب برای انتقال 9 بیتی ارائه کنه.
برنامه فرستنده:
برنامه گیرنده:
بنده مدت زیادیه برای AVR برنامه مینویسم و تا حدود زیادی هم واردم. ولی امروز به یک مشکل برخوردم. و این مشکل بر میگرده به ارسال داده 9 بیتی با UART . بنده قبلاً برای انتقال داده 8 بیتی با UART برنامه نوشته بودم و مشکلی هم نداشتم. ولی وقتی برای مد 9 بیتی برنامه نوشتم دچار مشکل شدم. به طوری که وقتی برای اولین مرتبه بیت نهم رو یک میفرستم در گیرنده بیت RXB8 در رجیستر UCSRB یک میشه و دیگه صفر نمیشه . حتی وقتی دفعه بعدی بیت نهم صفر ارسال بشه. یعنی بعد از اینکه اولین بار بیت نهم یک ارسال میشه تا آخر فقط یک دریافت میشه. ولی در هر وضعیت هشت بیت کم ارزش درست منتقل میشه . برنامه ای هم که استفاده کردم برنامه توصیه شده خود اتمل هست. نکته ای که هست اینه که در اکثر کتابها از پرداختن به این موضوع(انتقال 9 بیتی) تفره رفتند. شاید اشتباه میکنم ولی به این نتیجه رسیدم که این یک باگ سخت افزاری در AVR است. اگر از دوستان کسی میتونه این حرف رو نقض کنه یک برنامه مناسب برای انتقال 9 بیتی ارائه کنه.
برنامه فرستنده:
کد:
#include <mega8.h> #include <delay.h> void send_serial(unsigned char,unsigned char); void main(void) { // USART initialization // Communication Parameters: 9 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 4800 UCSRA=0x00; UCSRB=(1<<TXEN)|(1<<UCSZ2); // OR: UCSRB=0x0C; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // OR: UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; while (1) { send_serial(0x01,0); delay_ms(1000); send_serial(0x02,1); delay_ms(1000); send_serial(0x04,0); delay_ms(1000); send_serial(0x08,0); delay_ms(1000); } } //////////////////////////////////////////////// ////////////////////////////////// void send_serial(unsigned char data,unsigned char address) { while ( !( UCSRA & (1<<UDRE)) ) UCSRB &= ~(1<<TXB8); if ( address ){ UCSRB |= (1<<TXB8);} UDR = data; } //////////////////////////////
کد:
#include <mega8.h> unsigned char a=0,x=0; // USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) { x=UCSRB; a=UDR; PORTB=a; if(x & (1<<RXB8)) PORTC.0=1; else PORTC.0=0; } ///////////////////////////////////////////// void main(void) { DDRB=0xff; DDRC=0xff; // USART initialization // Communication Parameters: 9 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: Off // USART Mode: Asynchronous // USART Baud Rate: 4800 UCSRA=0x00; UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<UCSZ2); // OR: UCSRB=0x94; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //OR: UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; // Global enable interrupts #asm("sei") while (1) { } } /////////////////////////////////////////////
دیدگاه