Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

rs232 atmel yardım

Başlatan ido2323, 13 Mart 2016, 18:25:23

ido2323

https://gist.github.com/gshrikant/8549474

Hayırlı akşamlar yukarıda linkini verdiğim siteden rs232 iletişimi çalışıyorum;

   // Set baud rate; lower byte and top nibble
   UBRR0H = ((_UBRR) & 0xF00);
   UBRR0L = (uint8_t) ((_UBRR) & 0xFF);

bu satırlarda 16 bitlik UBRR0x kayıtçısının 12 bitlik UBRR kısmına _UBRR değeri nasıl atanıyor? Teşekkürler.


bocek

Burada bir hata var gibi.
Normalde 8-bitten büyük registerlere değer ataması yapılırken HIGH ve LOW byte'lara ayrı ayrı atama yapılır. Burada da o yapılmaya çalışılmış ancak UBRR0 registerinin hi byte'na atama yapmak için 16-bitlik olduğunu tahmin ettiğimiz _UBRR değişkeninin low byte'ı sıfırlanmış ancak hi byte'ta kalan 8-bitlik kısmın sağa kaydırılması unutulmuş. Low byte atamasında sorun yok.

atmega dataseheet'ten alıntı:
void USART_Init( unsigned int ubrr)
{
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
.
.
}

Buna göre:
   UBRR0H = ((_UBRR) & 0xF00)>>8;
   UBRR0L = (uint8_t) ((_UBRR) & 0xFF);

Şeklinde olmalıydı.
Aslında avr-gcc'de buna gerek yok. Direkt atama yaptığımızda derleyici hi ve low byte'ları atama işlemini kendisi yapıyor.
UBRR0 = _UBRR

şeklinde bir yazım yeterli ancak kod taşınabilirliği isteniyorsa bu tercih edilmiyor.
1 ya da 0. işte 'bit'ün mesele..

ido2323

o zaman 1mhz de çalıştığıma göre 9600bps için şöyle yazarsam olur;

UBRR0H = 0;
UBRR0L = 6;

AST

1Mhz için direk o değeri verebilirsin.
http://wormfood.net/avrbaudcalc.php


Ben şu şekilde kullanıyorum,

void setSerialBaudrate(uint32_t USART_BAUDRATE)
{
	UCSRA=0x00;	//U2X: Double the USART Transmission Speed Disabled
	UCSRB=0x18;	//RX Complete Interrupt Enabled,Transmitter Enabled
	UCSRC=0x86;	//URSEL Enabled, Asynchronous Operation, Parity Disabled, 8bit Enabled
	UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//enable global interrupts
	
	uint16_t BAUD_PRESCALE=((F_CPU / (USART_BAUDRATE * 16UL))) - 1;// PRESCALER HESAPLA
	
	UBRRH=BAUD_PRESCALE >>8;
	UBRRL=BAUD_PRESCALE;	
}


int main(void)
{
       ..............
       setSerialBaudrate(38400);
}

ido2323

Herkese teşekkür ederim, çözdüm gibi; verilerin yanlış gitmesi dışında bir sıkıntı kalmadı onu da deneyip çözmeye çalışacağız.