Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Bluetooth veri aktarımı sorunu

Başlatan spykoman1, 05 Şubat 2015, 09:42:19

spykoman1

Arkadaşlar PİC16F877a ile bluetooth modülünden veri gönderiyorum pice fakat bir süre sonra sistem kitleniyo resetlemek gerekiyo sorun ne olabilir sizce ? Veriler kusursuz geliyor fakat donuyo bi süre sonra ?  Pic'in rx ine pull up direncide attım ama yemedi

#include <16f877a.h>
#fuses HS,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOCPD,NOWDT
#use delay (clock=20000000)
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1)

CHAR l='s';
signed INT8 s=0;

#INT_timer0  // Timer0 kesmesi
void  timer0_kesme ()   // Kesme fonksiyonu ismi
{
   IF (s==10)
   {
      output_toggle (pin_a1);
      s = - 1;
   }

   s++;
}

#INT_rda   // RX ucuna veri gelince meydane gelen kesme

void serihaberlesme_kesmesi ()
{
   disable_interrupts (INT_rda); // int_rda kesmesini pasif yap
   l = getc ();
   
   IF (l == 'B')
   {
      output_low (pin_a0);
      output_low (pin_b4);
      printf ("\n\rRole 1 pasif.\n\rRole 2 pasif.\n\r");
   }

   else IF (l == 'F')
   {
      output_high (pin_a0);
      output_low (pin_b4);
      printf ("\n\rRole 1 aktif.\n\rRole 2 pasif.\n\r");
   }

   else IF (l == 'C')
   {
      output_high (pin_b4);
      output_low (pin_a0);
      printf ("\n\rRole 1 pasif.\n\rRole 2 aktif.\n\r");
   }

   else IF (l == 'D')
   {
      output_high (pin_a0);
      output_high (pin_b4);
      printf ("\n\rRole 1 aktif.\n\rRole 2 aktif.\n\r");
   }
}

void main ( )
{
   setup_timer_1 (T1_DISABLED); // T1 zamanlayıcısı devre dışı
   setup_timer_2 (T2_DISABLED, 0, 1); // T2 zamanlayıcısı devre dışı
   setup_CCP1 (CCP_OFF); // CCP1 birimi devre dışı
   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256); // Timer0 ayarları yapılıyor
   set_timer0 (60); // TMR0 değeri belirleniyor
   enable_interrupts (INT_timer0); // int_timer0 kesmesini aktif yapar
   enable_interrupts (GLOBAL); // Aktif edilen tüm kesmelere izin ver
   
   delay_ms (1);

   WHILE (true)
   {
      enable_interrupts (INT_rda);
   }
}

MrDarK

1- Timer'ı ne amaçla kullanıyorsun
2- Haberleşme kesmesi içinde disable_interrupts (INT_rda); // int_rda kesmesini pasif yap kullanmana gerek yok
3- İnt içinde çok fazla kalınmasını doğru bulmuyorum. Ana programda yaptırın işlemleri boşu boşuna beklemesin ana program :)
Picproje Eğitim Gönüllüleri ~ MrDarK

spykoman1

1) Timer0 ı  sistem çalışıyomu diye durmadan bi led yanıp sönsün diye koydum.

2)tavsiyeniz üzerine  İnt_rda yı kapatıp tüm getc komutlarını  void main içine çektim , program hata vermedi ama bu sefer her komutta kesinlikle donmaya başladı.(Komutları  Android Bluetoot RC Car uygulamasından gönderiyorum)

Teşekkürler yorum için :)

iqsuz

hocam sorununu çözemedim fakat eğer illaki disable_interrupt(xx) kullanmak istiyorsan enable_interrupt(xx) komutunu kesme fonksiyonunun en son satırına yazman daha faydalı olur.

void timer0_inter(){
disable_interrupt(INT_TIMER0);
....




....
enable_interrupt(INT_TIMER0);
}

MrDarK

Benim tavsiyem int_rda'yı kapat değildi yanlış anlamışsın, en iyisi senin için düzelteyim

#include <16f877a.h>
#fuses HS,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOCPD,NOWDT
#use delay (clock=20000000)
#use rs232 (baud=9600, xmit=pin_c6, rcv=pin_c7, parity=N, stop=1)

volatile char l='s';
signed INT8 s=0;
volatile char yeni_data_geldi = 0;
#INT_timer0  // Timer0 kesmesi
void  timer0_kesme ()   // Kesme fonksiyonu ismi
{
   IF (s==10)
   {
      output_toggle (pin_a1);
      s = - 1;
   }

   s++;
}

#INT_rda   // RX ucuna veri gelince meydane gelen kesme

void serihaberlesme_kesmesi ()
{
   l = getc ();
   yeni_data_geldi = 1;
}

void main ( )
{
   setup_timer_1 (T1_DISABLED); // T1 zamanlayıcısı devre dışı
   setup_timer_2 (T2_DISABLED, 0, 1); // T2 zamanlayıcısı devre dışı
   setup_CCP1 (CCP_OFF); // CCP1 birimi devre dışı
   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256); // Timer0 ayarları yapılıyor
   set_timer0 (60); // TMR0 değeri belirleniyor
   enable_interrupts (INT_timer0); // int_timer0 kesmesini aktif yapar
      enable_interrupts (INT_rda);   
enable_interrupts (GLOBAL); // Aktif edilen tüm kesmelere izin ver
   
   delay_ms (1);

   WHILE (true)
   {
	   IF (yeni_data_geldi == 1)
	   {
	       yeni_data_geldi = 0;
		   IF (l == 'B')
		   {
			  output_low (pin_a0);
			  output_low (pin_b4);
			  printf ("\n\rRole 1 pasif.\n\rRole 2 pasif.\n\r");
		   }

		   else IF (l == 'F')
		   {
			  output_high (pin_a0);
			  output_low (pin_b4);
			  printf ("\n\rRole 1 aktif.\n\rRole 2 pasif.\n\r");
		   }

		   else IF (l == 'C')
		   {
			  output_high (pin_b4);
			  output_low (pin_a0);
			  printf ("\n\rRole 1 pasif.\n\rRole 2 aktif.\n\r");
		   }

		   else IF (l == 'D')
		   {
			  output_high (pin_a0);
			  output_high (pin_b4);
			  printf ("\n\rRole 1 aktif.\n\rRole 2 aktif.\n\r");
		   }
	    }
   }
}
Picproje Eğitim Gönüllüleri ~ MrDarK

spykoman1

#5
Arkadaşlar sorunu çözdüm sanırım şu an sorunsuz  çalışıyor. Benim uygulamam tuştan elimi kaldırmadığım sürece 50 ms de bir tekrar gönderiyordu komutu. Onu her basmaya bir komut şeklinde ayarladım düzeldi. İlk haliyle hızı falanmı yetmiyordu bilmiyorum ama durum bu teşekkür ederim hepinize.

MrDark kardeşim senin söylediğinde kafama çok yattı şuan onuda denicem , daha sağlıklı bi sistem olur gibime geldi senin dediğin gibi yaparsam