RS 232 3 byte veri alma sorunu

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

ofdan

anladım hocam onları da bir araştırayım bakalım :)

justice_for_all

http://rapidshare.com/files/427317554/pic.rar

ben denedim virtual terminalden gonderince aliyo nekadar gonderirsen
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ofdan

hocam virt. terminalden gonderinceki sorun kalkmış ta diger bir picten örn 10 byte veri gonderdigimde bir kısmını alıyor bazende hepsini bunu çözemedim :S

justice_for_all

arkadasim sende mplab programi yuklumu?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Tagli

LCD'nin komut işleme süreleri değişiklik gösterebilir. Belki bazı durumlarda yazım işi erken bittiğinden RCREG taşmadan program ona yetişiyordur. Ama tabi tamamen yanılıyor da olabilirim. OERR'i ekrana yazdırmadan emin olmak mümkün değil.

Kaç byte veri beklediğini biliyorsan, her kesmede gelen veriyi bir değişkene yaz, ve ayrıca o ana kadar kaç byte veri aldığını da bir yerde sakla. Ana programda bu sayacı kontrol edersin ve hedeflenen sayıya ulaşılmışsa hepsini birden ekrana yazdırırsın.
Gökçe Tağlıoğlu

justice_for_all

egerki mplabin yukluyse onda proteusda debug yapabiliyosun hem ccs c yide destekliyor tum registerleri orda gorup izleyebilirsin...

ama eger yuklu diilsen baytlari gonderdigin programi yolla ben debug yaparim...

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

ofdan

Alıntı yapılan: justice_for_all - 26 Ekim 2010, 23:14:27
arkadasim sende mplab programi yuklumu?
yüklü degil hocam yarın inş. onuda yükleyeyim Tagli hocamın dediklerinide bir deneyim sonuçları buraya yazarım inş.

ofdan

sen nasıl yaptıgımız anlatırsan hocam mplab den onuda deneyim yarın

justice_for_all

simdi arkadasim mplabi acinca projeden yeni proje olusturcaksin sana derleyici sorar sen ccs yi sececeksin sonra yaptigin programi mplaba yukle sonra derleyeceksin debugger menusunde proteus var onu secip proteus menusu acilir ordan ac deyip yaptigin programi acicaksin sonra view menusunden watch var onu sec orda picin registerleri ve senin degiskenlerinin hepsini gorebilirsin..

yarin yine burda olurum yapamazsan sorarsin...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

justice_for_all

tagli senin dedigin gibi oerr biti 1 oluyor bunu nasil halledebiliriz acaba
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

justice_for_all

#25
arkadasim sorunu hallettim

duzeltirsin bu sekilde


#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)
#define LED PIN_D1
#define BUTON PIN_C1
#define BUTON2 PIN_C2

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


#int_rda
void kesme(void)
{
     

     gelenveri[sayac]=getch();
     
     if(++sayac==12)
     {
         sayac=0;
         cont=1;
     }   

}

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);
lcd_init();
i=0;

while(1){


   if(cont)
   {
      for(i=0;i<12;i++)
         printf("Gelen Veri>%2d\r",gelenveri[  i  ]);
      
      cont=0;
   
   }

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

ofdan

Alıntı yapılan: justice_for_all - 27 Ekim 2010, 00:15:11
arkadasim sorunu hallettim

duzeltirsin bu sekilde


#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)
#define LED PIN_D1
#define BUTON PIN_C1
#define BUTON2 PIN_C2

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


#int_rda
void kesme(void)
{
     

     gelenveri[sayac]=getch();
     
     if(++sayac==12)
     {
         sayac=0;
         cont=1;
     }   

}

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);
lcd_init();
i=0;

while(1){


   if(cont)
   {
      for(i=0;i<12;i++)
         printf("Gelen Veri>%2d\r",gelenveri[  i  ]);
      
      cont=0;
   
   }

}
}
Dün yazma fırsatım olmadı Teşekkür ederim yardımlarınız için sorunu hallettim sayenizde :):)

Alıntı yapılan: Tagli - 26 Ekim 2010, 23:17:11
LCD'nin komut işleme süreleri değişiklik gösterebilir. Belki bazı durumlarda yazım işi erken bittiğinden RCREG taşmadan program ona yetişiyordur. Ama tabi tamamen yanılıyor da olabilirim. OERR'i ekrana yazdırmadan emin olmak mümkün değil.

Kaç byte veri beklediğini biliyorsan, her kesmede gelen veriyi bir değişkene yaz, ve ayrıca o ana kadar kaç byte veri aldığını da bir yerde sakla. Ana programda bu sayacı kontrol edersin ve hedeflenen sayıya ulaşılmışsa hepsini birden ekrana yazdırırsın.

Yardımlarınız için sizede teşekkür ederim Tagli hocam :)

izwirlee_35

peki ya gelen bilginin kaç bayt oldugunu bilmiyorsak yada her seferinde farklı miktarda bayt gönderiyorsa karşı taraf yani bir seferinde 10 bayt bir seferinde 5 bayt gönderiyorsa bunun için ne yapmamız gerekiyor ???
keep learning . . .

tayyar

maksimum kaç byte gelecekse ona göre plan yapıp gelmeyen baytlarda oluşan 0'lı bölgeleri es geçmek olabilir

bu arada yorum yapanlara teşekkürler bendede benzer bir problem vardı ve sayenizde çözdüm :)
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

Klein

#29
Alıntı yapılan: izwirlee_35 - 05 Kasım 2010, 13:10:25
peki ya gelen bilginin kaç bayt oldugunu bilmiyorsak yada her seferinde farklı miktarda bayt gönderiyorsa karşı taraf yani bir seferinde 10 bayt bir seferinde 5 bayt gönderiyorsa bunun için ne yapmamız gerekiyor ???
Genelde şöyle yapıyoruz: Son bilgi geldikten sonra belirli bir süre içinde yeni bilgi gelmemiş ise , alma tamamlanmış kabul ediyoruz.
MODBUS RTU protokolünde bu süre  3 baytlık bilginin gelme süresi olarak değerlendiriliyor. 
9600 bps , no parity , 8 bit data ve 1 stop biti şeklindeki haberleşme konfigürasyonunda 1 baytlık veri için toplam 10 bit kullanılıyor. saniyede gönderebildiğimiz bit 9600 olduğuna göre  saniyede 960 bayt veri gönderebiliriz. 3 aytlık veriyi ise yaklaşık 3.2 milisaniyede göndeririz.
Bu durumda: son veri geldikten sonra 3-4 milisaniye(9600bps için) beklerseniz  yeterli.