Analog bilgiyi seri gönderme

Başlatan matador, 24 Şubat 2012, 12:53:00

matador

Alıcı:

#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,stop=1,parity=n)


signed long m1=0;
signed long m2=0;


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,103,1);
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(m1);
   set_pwm2_duty(m2);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_b(0x00);

   if(getc()=='A')
   {  
       m1=getc();
       output_b(m1);
       set_pwm1_duty(m1);
   }
}


Verici:

#include <pwwm.c>

#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,stop=1,parity=n)

void uyan()
{
   printf("0xAA");
   printf("0xAA");
   printf("0xAA");
   printf("0xAA");
   printf("0xAA");
   
   printf("0x00");
   printf("0x00");
   printf("0x00");
   printf("0x00");
   printf("0x00");
   
   printf("0xFF");
   printf("0xFF");
   printf("0xFF");
   printf("0xFF");
   printf("0xFF");
   
   putc('A');
}

signed long bd=0;
signed long br=0;

void main()
{

   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_DIV_32);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_16,103,1);
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(bd);
   set_pwm2_duty(0);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   while(true)
   {
      set_adc_channel(0);
      br=read_adc();
      bd=hesap1(br);
      set_pwm1_duty(bd);
      uyan();
      puts(bd);
      delay_ms(5);
   }
}


Analogdan okunan verinin alıcı kısmında pwm çıkışına aktarılmasını amaçladım ama yapamadım bir türlü.

Ustalar birde pwwm.c kütüphanesinde pwm için hesaplama yaptırıyorum 511den büyük değerler için normal çalışıyor ama  küçük değerler için normal çalışmıyor.

pwwm.c

signed long br=0;
signed long bt=0;
signed long dr=0;
signed long dt=0;

int16 hesap1(int16)
{
   if(br>511)
      {
         bt=br-511;
         output_high(PIN_B0);
         output_low(PIN_B1);
      }
      if(br<511)
      {
         bt=br-511;
         bt=br*(-1);  =======> Doğrusu bt=bt*(-1);
         output_high(PIN_B1);
         output_low(PIN_B0);
      }
      if((br>510)&&(br<512))
      {
         bt=br-511;
         output_low(PIN_B0);
         output_low(PIN_B1);
      }
    return bt;
}

int16 hesap2(int16)
{
    if(dr>511)
      {
         dt=dr-511;
         output_high(PIN_B2);
         output_low(PIN_B3);
      }
      if((dr<512)&&(dr>510))
      {
         dt=(dr-511);
      }
      if(dr<511)
      {
         dt=(dr-511);
         dt=dt*(-1);
         output_high(PIN_B3);
         output_low(PIN_B2);
      }
      return dt;
}



Ustalar kütüphane hatasını düzelttim bir tek diğer 16f877'ye analogtan aldığım veriyi göndermek kaldı rf ile motor kontrol için.

gokayk

Merhabalar.

Analog ile aldığını 0-255 arası değeri (Analog çözünürlüğüne göre değişir) rf ile normal bilgi gibi gönderebilirsiniz. Değişen tek şey, bu bilginin analog kaynak ile değişmesi.

Bunda sıkıntı nedir?

matador

#2
Alıcı bu değeri almıyor.  Kodların kullanımında mı bir hata yapıyorum anlamadım.

ISIS'te denerken uyarılarda bu yazı çıkıyor [PIC16 MEMORY] PC=0x016A. Attempt to read unimlemented memory location 0x018F ignored. birde cpu load uyarısı var

PIC kendi içinde olmayan bir adresi karşı tarafa nasıl gönderebilir ki?

jackal183

ilk olarak alıcı kısmında alma işlemini interrupt ile yapsan daha iyi olur kanaatindeyim. ikinci olarak da vericiden gönderirken her zaman putc ile gönderiyorsun sadece ilgili değeri puts ile gönderiyorsun, ama alıcı kısmında aynı veriyi getc ile alıyorsun. bu sıkıntı yaratır mı bilemiyorum ama bunları değiştirip denemelisin bence

gokayk

Alıntı yapılan: matador - 29 Şubat 2012, 10:45:11
Alıcı bu değeri almıyor.  Kodların kullanımında mı bir hata yapıyorum anlamadım.

ISIS'te denerken uyarılarda bu yazı çıkıyor [PIC16 MEMORY] PC=0x016A. Attempt to read unimlemented memory location 0x018F ignored. birde cpu load uyarısı var

PIC kendi içinde olmayan bir adresi karşı tarafa nasıl gönderebilir ki?

Kodlarını bir inceleyelim istersen

matador

Kodlar ilk mesajda olduğu gibi herhangi bir yere upload edeyim mi?

gokayk

Gözüme çarpan birkaç nokta var. PWM değerini neden verici kısımda oluşturuyorsun? Verici kısmında okuduğun analog değeri direkt gönder

   while(true)
   {
      set_adc_channel(0);
      br=read_adc();
      puts(br);
      delay_ms(5);
   }


Alıcı modülünde bu değeri alıp almadığını gözlemle, alıyor isen pwm işlemlerini aldığın bu değere göre alıcı devrende yönet. Yani PWM değerini verici modülünde oluşturmana gerek yok.

Uzaktan kumandalı araba fln mı yapıyorsun?

gokayk

Kendi yaptığım programa baktım, kabaca kabaca:
// VERİCİ KISMINDA OLMASI GEREKENLER
while(1)
   {
      set_adc_channel(0);
      giden_adc=read_adc();
      puts('X');     //Şifreleme için gerekli
      puts(giden_adc);    //8 bitlik giden_adc değerini (0-255) göndermiş olduk
      delay_ms(5);
   }

// ALICI KISMINDA OLMASI GEREKENLER
while(1)
   {
      if(getch()=='X')
      {
           gelen_adc=getch();
      }
      // Önemli nokta pwm duty'nin %0'dan %100'e kadar ulaşacağı aralıklarını gözlemlemelisin, atıyorum set_pwm1_duty(0) => %0, set_pwm_duty(100) =>%100
      // Gelen 0-255 arasındaki 8 bitlik adc değerini öyle bir katsayı ile çarpmalısınki 0 geldiğinde pwm duty=0, 255 geldiğinde pwm duty=100 olsun. O da;
      // 100/255=0,392

      pwm_cikis=gelen_adc*0.392;

      set_pwm1_duty(pwm_cikis); //adc'den 0 geldiğinde pwm sinyalinin 1 olan kısmı %0, adc'den 255 geldiğinde pwm sinyalinin 1 olan kısmı yaklaşık olarak %100 olacaktır.

   }


Aklına yatmayan birşey var mı?

matador

Hocam çok teşekkürler komutu yanlış kullanıyormuşum  getc değil getch olacakmış.