21 Eylül 2021, 01:30:41

Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d


USART Haberleşme Sorunu

Başlatan batuhann, 17 Haziran 2021, 03: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 charubrr;        // BAUD HIZI AYARI
	
UCSR0B = (<< RXEN0) | (<< TXEN0);  // VERİ ALMA VE GÖNDERME AKTİF EDİLDİ
	
UCSR0C = (<< USBS0) | (<< UCSZ01) | (<< UCSZ00);  // 2 BİT STOP BİT VE 8 BİT KARAKTER SEÇİLDİ
}

void USART_Transmit(unsigned char data){
	
while( !(
UCSR0A & (<< 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ı

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.