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++ );
}
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.
RCIF sadece okunabilir bir flag oldugundan RCREG i okuduktan sonra kendiliginden sifirlanacaktir.RCIF=0 satirini kaldirirsan problem çözülür
RCIF=0;
satırını tamamen kaldırdım fakat bir değişiklik olmadı.
setup ayarlarinda eksiklik göremedim.devreni bi kontrol et veya buraya koy bakalim
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]
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;
}
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
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