18f4620 Sorunu

Başlatan fm, 06 Mayıs 2013, 20:31:05

fm

Merhaba. 2 PIC arasında biri master(18f4620) diğeri slave(16f877A) olmak üzere bir devre kurdum. Devrede 2 PIC arasında rs232 iletişimi gerçekleştirmek istiyorum. Ancak iletişim kuramadım. Daha önce bu devreyi 16F877A ve 16F876A lar ile denedim sorunsuzca çalışıyor. Sorun ne olabilir. 18F4620 için bilmediğim bir durum olabilir mi. Devreyi ve kodları eklemem gerekirse ekleyebilirim.

Saygılarımla..

f15eagle

baudrate aynı mı diyeceğim fakat daha önceden yaptığınızdan bunları kontrol etmişssinizdir. Bence kodları paylaşmanızda fayda var.
Ayrıca 18f'de pll kullanıyor musunuz ?

fm

Hocam tasarımı ve kodları ekledim.


MASTER KOD:
// BU PROGRAMDA KESMEYE GEREK YOKTUR.

// DİKKAT YAZDIRMA ZAMANLARI SİMULASYONU HIZLANDIRMAK AMACI İLE 2MS YAPILMIŞTIR.

#include <18F4620.h>
#include <string.h>

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
//!#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=1000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd TRUE
#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // donanımsal rs232 iletşimi ayarları
//#use rs232(baud=9600, xmit=pin_A0, rcv=pin_A1, parity=N, stop=1, STREAM= iletisim_2)   // yazılımsal rs232 ilitişimi ayarları

char giris[];
//!char slave[30];
//!char paket[50];
int i,kb;
//char *k;

void main()
{
   setup_adc_ports (NO_ANALOGS) ;
   setup_adc (ADC_OFF) ;
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_comparator (NC_NC_NC_NC) ;
   //setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
     
   set_tris_a (0x00);
   output_a (0x00) ;
   
   set_tris_b (0x00);
   output_b (0x00) ;
   
   set_tris_c (0x80);
   
   set_tris_d (0x00);
   output_d (0x00);
   
   lcd_init();
   //delay_ms(2);
   
   i=0;
   kb=0;
   
   printf(lcd_putc,"\fLutfen");  //asıl programda bu kısım olmayacak. Burası sadece şu anda olayı kavramak için var.
   printf(lcd_putc,"\nBekleyiniz");
   delay_ms(2);
   printf(lcd_putc,"\fOkuma Yapiliyor");
   delay_ms(2);

   while (1)
   {
      output_high(pin_d2);
      output_low(pin_d3);
      
      putc(i);

      kb=kbhit(); 
      if(kb==1)
      {  
         output_low(pin_d2);
         output_high(pin_d3);
      
         gets(giris);
         delay_ms(2);
         
         //slave[i]=giris;
         
         
            
         printf(lcd_putc,"\f%d numarali",i);
         printf(lcd_putc,"\nslave okunuyor");
         delay_ms(2);
         printf(lcd_putc,"\f%s",giris);
         delay_ms(2);

         //i++;
         kb=0;
       }
      
      //if(i==3)
      //{
      //i=0;
         
         //printf(lcd_putc,"\f%s",slave[0]);
         //printf(lcd_putc,"\n%s",slave[1]);
         //delay_ms(50);
         //printf(lcd_putc,"\f%s",slave[2]);
         //delay_ms(50);
         //sprintf(paket,"%s,%s",slave[0], slave[1]);
         //fprintf(iletisim_2,paket);
//!      fprintf(iletisim_2,"%s,%s,%s\n\r",slave[0], slave[1], slave[2]);
      
      //}
   }   
}

 


SLAVE KOD:
#include <16F876A.h> // PIC 16F876A programa tanıtılıyor
#include <ds18b20.c> // DS18B20 sıcaklık sensörleri programa tanıtılıyor  

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

//!#define use_portb_lcd TRUE // kapatılmış ise bu komutlar devrede lcd yoktur
//!#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

char bayrak;
float sicaklik_ust,sicaklik_alt;
int secici;

#int_rda //seri haberleşme kesmesi
void seri_haberlesme()
{  
   enable_interrupts(int_rda);
   secici=getc();
   if (secici == 0) // giris ve veriye atanan string ifadeler aynı ise sonuc 0 döndürür.
   {
      bayrak = 1;
   }
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc (adc_off) ;
   //setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_comparator (NC_NC_NC_NC) ;
   setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;

   set_tris_a(0xFF);
   
   set_tris_b(0x00);
   output_b (0x00); 
   
   set_tris_c (0x88);
  
   //lcd_init ();   // kapatılmış ise bu komutlar devrede lcd yoktur
     
   enable_interrupts (int_rda);
   enable_interrupts (GLOBAL);
   
   //printf(lcd_putc,"\fTest Olcumu Icin"); // kapatılmış ise bu komutlar devrede lcd yoktur
   //printf(lcd_putc,"\nButona Basin");
   //delay_ms(250);
   
   while (1)
   {
      output_high(pin_C5); // sinyal beklerken kırmızı led yanacak.
      output_low(pin_C4);  // sinyal beklerken yeşil led yanmayacak.
      
      sicaklik_ust=ds1820_read();
      delay_ms(1);
      sicaklik_alt=ds1820_read1();
      delay_ms(1);
 
//!     if(input(pin_C3))
//!     {
//!         delay_ms(2);
//!         while(input(pin_C3));
//!         lcd_init ();
//!         delay_ms(1);
//!         printf(lcd_putc,"\fTest Olcumu");
//!         printf(lcd_putc,"\nYapiliyor");
//!         delay_ms(250);
//!         printf(lcd_putc,"\fSicaklik1=%1.1f%cC",sicaklik_ust,223);  
//!         printf(lcd_putc,"\nSicaklik2=%1.1f%cC",sicaklik_alt,223);
//!         delay_ms(500);
//!     }
      
     if (bayrak == 1)
     {
         delay_ms(2);
         
         output_low(pin_C5);
         output_high(pin_C4);
         delay_ms(250);
         printf("%f,%f\n\r",sicaklik_ust,sicaklik_alt);
        
//!      sprintf(data,"%f,%f",sicaklik_ust,sicaklik_alt); //bilgiyi paket haline getirdik.   
//!      k = data; // yukarda veri1'e "data" stringi atandı. Burada k="data" oluyor.  
//!      do
//!      {
//!         putc(*k);   // veri dizisinin tüm elemanlarını yolla
//!      }while(*(++k) != '\0');  
//!       putc(13); // gets için sonlandırma kodu. klavyedeki Enter tuşu  
       
      }
      bayrak=0;
  }

}

Gökhan BEKEN

18f4620 nın kristali 1mhz ayarlanmış, belki aynı frekansta denerseniz işe yarayabilir. Ayrıca transistörleri neden bağladınız, direkt çapraz bağlarsanız çalışması lazım.
Özel mesaj okumuyorum, lütfen göndermeyin.

fm

Hocam orda deneme yaparken 1MHz ye çekmiştim. Normalde her iki pic için de dediğiniz gibi aynı olacak(4MHz).
Aslında bu sistemin bir parçası. Sistemde birden fazla slave i bağlamak amacımız. Transistörler o yüzden var.

fm

Ayarlarda bulunan #FUSE WRT ya da #FUSE WRT_%50 komutlarından hangileri varsa picler için kaldırıldığı zaman sorun ortadan kalktı.

since1990

Hocam isinize karismak gibi olmasin ama birden fazla slave var ise 485 i tercih etmeniz daha mantikli olmaz mi? 485 icin
Sn75176 cok ucuz ve kullanisli bir entegre, tavsiye ederim. Kodlarinizdada kucuk degisiklkkler yaparak kullanabilirsiniz.
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

fm

Hocam haklısınız ama 485 ile iletişimi bir ay boyunca hem kitaplardan hemde forumdan araştırdım. Ama yalnızca master ve tek slave arasında tek yönlü iletişim kurabildim. Çift yönlü denemelerim hiç sonuç vermedi. O yüzden böyle kurmaya karar verdik.

since1990

485 haberlesmesi half dublextir cunku, 2 tane 485 entegresi veya 1tane 491 kullanirsan dublex (rs422) diye gecer yine cok yonlu olur ki de ve re pinlerinin zamanlamasini iyi ayrlayabilirsen verimli bir haberlesme yaparsin
Iyi calismalar.
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

fm

Dediğiniz şeyleri denedik hocam. Hatta forumda bile konu açıp danıştım kodları devreyi paylaştım ancak çalıştıramadık devreyi..