Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: ido2323 - 13 Mart 2016, 18:25:23

Başlık: rs232 atmel yardım
Gönderen: ido2323 - 13 Mart 2016, 18:25:23
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.

Başlık: Ynt: rs232 atmel yardım
Gönderen: bocek - 13 Mart 2016, 20:03:23
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.
Başlık: Ynt: rs232 atmel yardım
Gönderen: ido2323 - 14 Mart 2016, 10:49:59
o zaman 1mhz de çalıştığıma göre 9600bps için şöyle yazarsam olur;

UBRR0H = 0;
UBRR0L = 6;
Başlık: Ynt: rs232 atmel yardım
Gönderen: AST - 14 Mart 2016, 11:49:39
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);
}

Başlık: Ynt: rs232 atmel yardım
Gönderen: ido2323 - 14 Mart 2016, 15:13:52
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.