RS 232 3 byte veri alma sorunu

Başlatan ofdan, 26 Ekim 2010, 21:43:13

ofdan

Merhaba arkadaşlar, 18f4520 ve rfid modül kullanarak bir proje yapıyorum.pic ile modülü haberleştirdim pic den gönderdigim komutlara modul cevap veriyor  fakat modülden gelen cevaplar 12 byte ve üzeri.pic ile bu gelen verilerin 3 byte ını okuyabiliyorum.Kalan dataları nasıl okutabiliriz arkadaşlar yardımlarınızı bekliyorum.Cevaplarınız için şimdiden teşekkürler.

Program:
------------------------
#include <18f4520.h>
#FUSES XT   
#use delay(clock=4M)
#include "flex_lcd.c"
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,stop=1,bits=8,ERRORS)
#define LED PIN_D1
#define BUTON PIN_C1
#define BUTON2 PIN_C2

char gelenveri[12];
char deger[];
int i=0,k,j;

#int_rda
void verigeldi(){
deger=getch();
printf("Gelen Veri>%2x\r",deger);
    

}

void main(){
set_tris_d(0x04);
set_tris_b(0x00);
set_tris_C(0xff);
output_d(0x00);
output_b(0x00);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
enable_interrupts(GLOBAL);
enable_interrupts(int_rda);

lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc,"Modul");
delay_ms(1000);



while(1){

}
}

---------------------
proteus simulasyonu
---------------------------

justice_for_all

arkadasim soyle yapcaksin

#int_rda
void kesme(void)
{
     char sayac=0;

     gelenveri[sayac]=getc();
     printf("Gelen Veri>%2x\r",gelenveri[sayac]);
     if(++sayac==12)
         sayac=0;

}

dene bakalim...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ofdan

justice_for_all ; değişen birşey olmadı yine aynı 3 byte alıyor :S

justice_for_all

o zaman gonderdigin baytlarda sorun var onun programinida yazarmisin...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ofdan

gonderilen byte ları modül gönderiyor gelen byteları serial port monitor ile rahatça alıyorum

modülün gonderdigi bytelar
----------------------------------


ofdan

justice_for_all gonderdigin programı tekrar denerken bisey daha farkettim senin program bazen 5 byte bazen 3 byte bazende 8 byte alıyor.Hocam bu dengesizligin sebebi modülün byteların hepsini biranda gondermesi olabilir mi acaba ?

justice_for_all

#6
seri portta hepsini birarada gonderemez zaten bayt seklinde gonderir alicidaki picde her baytta kesme oldugu icin eger datalar kaybolmuyosa dogru sekilde almasi gerekiyo...veri kayip mi oluyo acaba...

bide virtual terminalden gordermeyi denermisin
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ofdan

#7
bende çözemedim hocam acaba baud hızını düşürsek (modülün ve picin) yada osilatörü hızını artırsak bir fayda edermi ?Edit:

Edit:
deneyeyim 1 dk

justice_for_all

bide virtual terminalden gordermeyi denermisin

osilator hizi birseyi degistirmicektir ERRORS ne icin kullaniyosun ben hic yazmiyodum onu...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ofdan

Hocam Errors yazmassam virtual terminal donguye giriyor gelen veriler 00 oluyor.sizin programı virt. terminaldende denedim yine aynı hocam bazen 8 byte bazen 3 byte alıyor.bu veri kaybını önlemek için ne yapabiliriz hocam

justice_for_all

proteus dosyasini kodu ve hexi rarlayip gonderirmisin bende bakmak istiyorum...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay


Tagli

Acaba RCREG dolup taşmış olabilir mi? Sanırım ekrana yazdırma işlemi kesme kodu içinde yapılıyor. Bu sırada veri gelmişse tekrardan kesmeye gidilemeyebilir. Ve gelen 3. byte ile birlikte OERR biti 1 olur ve modül kapanır. Gerçi 16 serisindeki RCREG 3 değil 2 katlı. Az önce datasheet'e baktım, 18F4520'de bu RCREG'in kaç katlı olduğu yazmıyor veya ben göremedim. Denemek için işlemin sonunda OERR'i de ekrana yazdır. 1 görüyorsan sorun yukarıda anlattığım şeydendir.
Gökçe Tağlıoğlu

ofdan

#13
Hocam ccs de pek iyi değilim bu OERR nasıl ekrana yazdıracağız?

hocam ekrana yazmayı ana programda nasıl yapabliriz ?

Tagli

#14
Ben CCS hiç bilmiyorum  :) OERR doğrudan tanımlı mıdır onu da bilemem, ama kendisi RCSTA register'ının 1. biti. Yok RCSTA da tanımlı değil diyorsan, ki bu çok düşük bir ihtimal, bu register h'FAB' adresinde.

Hatta RCSTA'yı olduğu gibi ekrana yazdırırsan da sonuca ulaşabilirsin.
Gökçe Tağlıoğlu