2 pic arası seri iletişim

Başlatan tayyar, 19 Ekim 2010, 20:43:06

tayyar

Selamlar;

iki pic arasında seri iletişim kurmaya çalışıyorum. Seri iletişimi halledebilirsem sonrasında 75176 ile rs485 e geçeceğim.

Ancak seri kesmede takıldım.

Şöyleki birinci pic 9 dan başlayarak 250ms aralıklarla ve 9 un üstüne sürekli 1 ekleyerek bulduğu sonucu seri olarak 2. pice gönderiyor sonrasında 2. pic aldığı sayıya 1 ekleyerek virtual terminale gönderiyor

2 picide virtual terminallerden izliyorum 1. pic in çıkışı stabil gidiyor virtual terminalde ama 2. pic düzensiz ve alakasız değerler gösteriyor.

INT_RDa ile seriden veri geldiğinde interrupta göndermeyi denedim, interrupt alt programı içerisinde led toggle ettim ancak bi türlü interrupta girmedi. Serdar çiçeği kitabına bakıyorum ama oradada açıklayıcı bir örnek (en azından bana açıklayıcı gelmedi) vermemiş. nedir hatam eksiğim anlayamadım

Bilgisi olan arkadaşlar bakıp fikirlerini söylerlerse sevinirim

kodlar şöyle:

Verici için:
#include <main.h>
#include <stdio.h>

int16 temp=9;

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   
 While(true)
 {
 
   printf("%Lu",temp);
   delay_ms(250);
   temp=temp+1;
       
 }
}



Alıcı için:
#include <main.h>
#include <stdio.h>
#use fast_io(b)

int16 temp=0;
int1 i=FALSE;

#int_RDA
void  RDA_isr() 
{
disable_interrupts(int_rda);
i=1;
temp=getc();
}

void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   enable_interrupts(GLOBAL);


   set_tris_b(0x00);
   output_b(0x00);
    
      while(true)
      {
      enable_interrupts(INT_RDA);
      
      if(i)
      {
   temp=temp+1;
   output_toggle(pin_b0);
   printf(":%Lu",temp);
      i=0;
      }
      }
}



İsis sim. ve kod dosyaları burada
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

JKramer

Aldığınız ascii karakterlerin decimal karşıkları ekrana yazılıyor. http://www.asciitable.com/ adresindeki tablodan bakarsanız yazılanların alakasız olmadığını göreceksiniz :).

Diğer bir sorun; printf ile "10" gönderdiğinizde "1" ve "0" gönderiyorsunuz ancak alıcıda getc() bir karakter alıyorsunuz. Dikkat ederseniz 11,12,13... gönderirken alıcıda hep 50 yazılıyor ekrana, yani "1"'in karşılığı 49 ve +1 ile 50.

Printf yerine circular buffer yapılarına bir göz atın, örnek programlar example klasöründe mevcut. Birkaç tane de adres vereyim:

https://www.ccsinfo.com/forum/viewtopic.php?t=36486
http://www.ccsinfo.com/forum/viewtopic.php?p=31348

Temel olarak vericide ve alıcıda birer adet tampon var. Verici, göndereceği bilgileri tampona atıyor, her bir uygun zamanda tamponda sırada bekleyen bilgi gönderiliyor. Alıcıda da benzer şekilde gelen bütün bilgiler tampona alınıyor, siz her bir uygun zamanda tampondaki bilgileri alıp işliyorsunuz. Böylece programın akışı etkilenmeden veri kaybı vb. sorunlar ortadan kalkmış oluyor.