Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

hata nerede anlayamadım "usart"

Başlatan askin, 20 Mart 2005, 00:03:10

askin

Merhaba,
Aşağıdaki programı derlediğimde rs232 üzerinden veri gönderebilyorum yani "void putrsUSART(const char *data)" fonksiyonu hatasız çalışıyor fakat veri almaya çalıştığımda program hyperterminalden gönderdiğim bilgiyi almıyor. Hata nerede anlayamadım, yardımcı olursanız sevinirim.

Alıntı Yap
#include   <pic.h>

void Setup(void);
void putrsUSART(const char *data);

char udata;


const char ready[] = "\n\rREADY>";

void main(void)
{
Setup();
putrsUSART(ready);
while(1)
{
   if(RCIF==1)
     {
      RCIF=0;
        udata = RCREG;
      if(udata=='x')
         putrsUSART("received x");
   }
}
}

void Setup(void)
{
   TRISC = 0xdb;
   SPBRG = 15;                  // 19200 baud @ 20MHz
   TXSTA = 0x20;               // setup USART transmit
   RCSTA = 0x90;               // setup USART receive

}
void putrsUSART(const char *data)
{
   do
   {            
      while(!(TXSTA & 0x02));
      TXREG = *data;
   } while( *data++ );
}

ahmetu

RCIF=0;
udata = RCREG;

satırlarını

udata = RCREG;
RCIF=0;

şeklinde değiştirirsen sanırım olay çözülür, önce RCREG registeri okuyup ardından RCIF'i sıfırlıyorsun önce sıfırlarsan RCREG'de birşey kalmıyor.

james

RCIF sadece okunabilir bir flag oldugundan RCREG i okuduktan sonra kendiliginden sifirlanacaktir.RCIF=0 satirini kaldirirsan problem çözülür
ARAMIYORUM , BULUYORUM

askin

RCIF=0;
satırını tamamen kaldırdım fakat bir değişiklik olmadı.

james

setup ayarlarinda eksiklik göremedim.devreni bi kontrol et veya buraya koy bakalim
ARAMIYORUM , BULUYORUM

askin

Aşağıdaki program sorunsuz çalışıyor
#include	<pic.h>

void Setup(void);
void putrsUSART(const char *data);

unsigned char udata;

const char ready[] = "\n\rREADY>";

void main(void)
{
Setup();
putrsUSART(ready);
while(1)
{
	if(RCIF==1)
   	{
		udata = RCREG;
	putrsUSART(&udata);
	}
}
}

void Setup(void)
{

	TRISC7   = 1; 
	TRISC6   = 0; 
	SPBRG = 15;						// 19200 baud @ 20MHz
	TXSTA = 0x20;					// setup USART transmit
	RCSTA = 0x90;					// setup USART receive

}
void putrsUSART(const char *data)
{
	do
	{				
		while(!(TXSTA & 0x02));
		TXREG = *data;
	} while( *data++ );
}



fakat
if(udata=='x')
			putrsUSART("received x");

satırlarını eklediğimde hyperterminalden gönderdiğim x karakterini okumuyor.[/quote]

SpeedyX

hoca bide şunu bi dene. önceden h-tech takılırken bununla bir uygulama yapmıştım. veriyi pc ye gönderdim sadece. çalışıyordu. ama almayı denememiştim hiç. daha sonradan da ccs ye geçtim zaten. bence çalışır.
#include	<pic.h>
#include	<conio.h>

/*	Transmit and Receive port bits */

static bit	TxData @ (unsigned)&PORTA*8+3;		/* bit3 in port A */
static bit	RxData @ (unsigned)&PORTA*8+2;		/* bit2 in port A */
#define	INIT_PORT	TRISA = 7			/* set up I/O direction */

/*	Xtal frequency */

#define	XTAL	4000000

/*	Baud rate	*/

#define	BRATE	9600

/*	Don't change anything else */

#define	DLY		3		/* cycles per null loop */
#define	TX_OHEAD	13		/* overhead cycles per loop */
#define	RX_OHEAD	12		/* receiver overhead per loop */

#define	DELAY(ohead)	(((XTAL/4/BRATE)-(ohead))/DLY)

void
putch(char c)
{
	unsigned char	dly, bitno;

	bitno = 11;

	INIT_PORT;
	TxData = 0;			/* start bit */
	bitno = 12;
	do {
		dly = DELAY(TX_OHEAD);	/* wait one bit time */
		do
			/* nix */ ;
		while(--dly);
		if(c & 1)
			TxData = 1;
		if(!(c & 1))
			TxData = 0;
		c = (c >> 1) | 0x80;
	} while(--bitno);
}

char
getch(void)
{
	unsigned char	c, bitno, dly;

	for(;;) {
		while(RxData)
			continue;	/* wait for start bit */
		dly = DELAY(3)/2;
		do
			/* nix */;
		while(--dly);
		if(RxData)
			continue;	/* twas just noise */
		bitno = 8;
		c = 0;
		do {
			dly = DELAY(RX_OHEAD);
			do
				/* nix */;
			while(--dly);
			c = (c >> 1) | (RxData << 7);
		} while(--bitno);
		return c;
	}
}

char
getche(void)
{
	char c;

	putch(c = getch());
	return c;
}

raprap17

Kod:
Alıntı Yap
void putrsUSART(const char *data)
{
  do
  {            
     while(!(TXSTA & 0x02));
     TXREG = *data;
  } while( *data++ );
}  

böyle yapmakla gonderilen data sürekli ekrana yazıyor.
Misal: "ali" stringini parametre olarak gonderince çıktı şöyle oluyo.
alialialialialialialiali...
bunu birkez yazdırmanın yolu nedir?
örnek çıktı: ali
Neyi arıyorsan osun sen ! Hz. Mevlana

izwirlee_35

bu sorunla defalarca karşılaştım ve bazen şöle aştım
void main ()
{
....
seri_gonder("ali");while(1);
}

bazense
void main ()
{
....
seri_gonder("ali");while(1);

      do{
         if(kontrol_1)seri_gonder("ali");
         else seri_temizle();
          }

}


yardım edebilmişimdir umarım .kolay gelsin
keep learning . . .