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 [Genişlet]
#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 . . .