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.
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.
o zaman 1mhz de çalıştığıma göre 9600bps için şöyle yazarsam olur;
UBRR0H = 0;
UBRR0L = 6;
1Mhz için direk o değeri verebilirsin.
http://wormfood.net/avrbaudcalc.php (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);
}
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.