USART Haberleşme Sorunu

Başlatan batuhann, 17 Haziran 2021, 00:14:30

batuhann

Arkadaşlar selamlar, çok ilginç bir sorunla karşı karşıyayım ve çözümü bulamadım. ATMEGA2560 mikrodenetleyicisi ile çok basit bir UART haberleşme kodu yazarak denemeler yaptım. Aşağıda paylaştığım kodu mikrodenetleyiciye yüklediğimde isim adlı dizinin eleman sayısı 3'ten fazla olduğu zaman verileri terminal ekranından düzgün şekilde alamıyorum ancak 3 ve 3'ten az az karakter olursa veriler doğru geliyor. Ekteki kod Atmel Studio 7'de yazılmıştır. İşin garibi aynı kodu arduino IDE'sini kullanarak arduino MEGA'ya yüklediğimde kod düzgün bir şekilde çalışıyor. Ayrıca kodda bulunan USART_Transmit fonksiyonunu kullanarak herhangi bir veri gönderdiğimde sorunsuz şekilde verileri terminal ekranında alabiliyorum ancak dizi şeklinde bir veriyi gönderirken 3 karakterden fazla olduğu zaman veriler düzgün iletilmiyor(dizi içeriği ne olursa olsun terminal ekranında ? gibi karakterler görünüyor)

sizce nerede hata yapmış olabilirim

#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <string.h>

#define  BAUD 74800
#define BRC ((F_CPU/16/BAUD) - 1)

void USART_Init(unsigned int ubrr);
void USART_Transmit(unsigned char data);
void USART_putstring(char * s);

char isim[] = {"0123456789"};

int main(void)
{   
     USART_Init(BRC); //UART 74800 BAUD HIZINA AYARLANDI
     while (1){
          USART_putstring(isim);    
          _delay_ms(50);
     }

}

void USART_Init(unsigned int ubrr){	
	UBRR0H = (unsigned char) (ubrr >> 8); // BAUD HIZI AYARI
	UBRR0L = (unsigned char) ubrr;        // BAUD HIZI AYARI
	UCSR0B = (1 << RXEN0) | (1 << TXEN0);  // VERİ ALMA VE GÖNDERME AKTİF EDİLDİ
	UCSR0C = (1 << USBS0) | (1 << UCSZ01) | (1 << UCSZ00);  // 2 BİT STOP BİT VE 8 BİT KARAKTER SEÇİLDİ
}

void USART_Transmit(unsigned char data){
	while( !(UCSR0A & (1 << UDRE0)) ); // HATTIN BOŞ OLMASINI BEKLE
	UDR0 = data;  // VERİYİ GÖNDER
}

void USART_putstring(char * s) {
	int i = 0;
	while(s[i] != '\0'){
		UART_Transmit(s[i]);
		i++;
	};
}

RaMu

USART_putstring(&isim);
veya
USART_putstring(isim[0]);
şeklinde denermisin.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

batuhann

USART_putstring(&isim);
bu kodu çalıştırdığımda sonuçta bir değişiklik olmuyor

USART_putstring(isim[0]);
bu kodu çalıştırdığımda derleyici int bir değer olduğu için uyarı veriyor. Bunun yerine
USART_putstring(&isim[0]);
bu kod parçasını yazıyorum ama sonuç yine aynı