pic18f4550 de dahili uart dışında 2. port kullanım sorunu [ÇÖZÜLDÜ]

Başlatan Murat Mert, 23 Nisan 2015, 18:37:20

Murat Mert

S.A.
Sn.Arkadaşlar
Pic18f4550 yi 2 uart port olarak kullanamam gerekiyor. Donanımsal port slave cihazlar kontrol edecek, int2 pini yani portb2 pini de int kesmesiyle rf den gelen ısı bilgisini alacak usb portundan bilgisayara bağlanacak. İsiste yaptığım denemelerde int2 ucundan virtual terminalden data yolluyorum doğru bilgiler gelmiyor. ama donanımsal pininden girilen bilgiyi doğru gösteriyor. deneme kodum aşağıdadır.
Öneri ve görüşlerinizi rica ediyorum. Kolay gelsin.

NOT: invert komutunu denedim. :)

#include <18F4550.h>
#device ADC=10
#use delay(clock=48000000,crystal=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1,errors)
#use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B2,bits=8,stream=PORT2,errors)


int gelen=0;
int gonder=0;
char addd;

#INT_EXT2
void  EXT2_isr(void) 
{
   gelen=getch(PORT2); 
   gonder=gelen; 
}

#INT_RDA
void  RDA_isr(void) 
{
   gelen=getch(PORT1); 
   gonder=gelen; 
}

void main()
{

   enable_interrupts(INT_EXT2);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
 
   while(TRUE)
   {
      output_high(pin_d0);
      putc(gelen,PORT1);
      delay_ms(100);
      output_low(pin_d0);
      delay_ms(200);
   }
}
mert07

RaMu

#use     rs232(baud=19200,parity=N,xmit=PIN_b5,rcv=PIN_b4,bits=8,FORCE_SW) //software uart,


gibi sonuna FORCE_SW yazarsanız
yazılımsal uart olduğu garanti olur.

mesaj birleştirme:: 23 Nisan 2015, 23:50:20

Aslında pinler donanımsal olarak uart pinleri değilse
zaten otomatik olarak software uart oluyor diye hatırlıyorum.

mesaj birleştirme:: 24 Nisan 2015, 00:09:21

Yazılımsal uart kısmından;
virtual terminal ile 7 rakamını gönderdiğinde ¾ gibi bir şekil mi geliyor?
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

PROTECH_

Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

Murat Mert

S.A.
Kolay gelsin. Cevaplarınız için teşekkürler. RaMu hocam FORCE_SW komutunu denedim olmadı aynı saçma değerler geliyor.
PROTECH_ dediğiniz komutu denemiştim aynı maalesef:(

gönderdiğim bilgiler:         alınan bilgiler:
             0x00                          BOŞ 
             0x01                          0x01
             0x02                          0xE0
             0x03                          0xE0
             0x04                          0xF0
             0x05                          0xC0
             0x06                          0xF0
             0x07                          0xF0
             0x08                          0xF8
             0x09                          0xC2
             0x10                          0x E1

Başka pinlerde dış kesmeli yapabileceğim bir pin varmıdır?
               
mert07

RaMu

Problem harici kesme ile
veriyi almaya çalışırken oluyor,
datasheet ten harici kesme kısmını incelersen
harici kesme pini 1den0a veya 0dan1e (nasıl ayarlanırsa) geçtiğinde
harici kesme oluşur,
bu nedenle göndermeye çalıştığın verinin üst 2 (belki sadece 1) biti
veya 1-0 0-1 gibi geçiş olana kadarki bitleri
harici kesme içindeki getc ile alınamayacak demektir.
Bilmiyorum açıklayabildim mi.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

skara1214

fgetch() ve fputc() olarak kullanın, software uart pinlerini giriş çıkış ayarlamalarını yapın
Herkes ölür ama herkes gerçekten yaşamaz

Murat Mert

S.A.
RaMu hocam anladım. B0 veB1 ile ext. kesme ile yapılmış bir proje görmüştüm nette bulamadım bir bulsam hemen alacağım. :) (daha önce almadım lazım olunca :(   )


skara1214 hocam onları da denedim
mert07

MrDarK

Daha önce 1 hardware 3 software usart kullandım CCS ile aslında neden yapamadığını anlamadım fazlasıyla kolay bir uygulama.

Devre şemanı da buraya koyarsan net bir yorum yapabilirim. Fakat en büyük problemin EXT interrupt ayarlarını doğru yapmıyorsun. Usartta veri giderken veri start biti LOW ile başlar. O yüzden senkronizasyonu yakalayamıyorsun sanırım. Hardware Pull-upları devreye sok veya manuel direnc at. Sorunu çözeceksin.

Ayrıca bu tarz uygulamaların parazitlere karşı tehlikeli olduğunu söylemek lazım. Bi kaç uygulamada donan usart donanımlarım vardı bu mantıkta kullandığım. Dikkatli olun :)

Devre şemasını koyarsan daha net yorum yapabilirim. Birde simulasyon yerine gerçek uygulamada denemeni tavsiye ediyorum.
Picproje Eğitim Gönüllüleri ~ MrDarK

Murat Mert

S.A.
Arkadaşlar kesmelerdeki h to l yada l to h ayarları aklıma sonradan geldi yaptım düzeldi. MrDark yazmışsın ama şimdi gördüm. Çalışan deneme kodum aşağıda lazım olan arkadaşlarımın kullanması için.

Sn. MrDark kardeşim kafa bazen dalıyor :)

Yorumları olan arkadaşların yine de yorumlarını beklerim. Kolay gelsin.

#include <18F4550.h>
#device ADC=10
#use delay(clock=48000000,crystal=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1,errors)
#use rs232(baud=9600,parity=N,xmit=PIN_B3,rcv=PIN_B2,bits=8,stream=PORT2,errors)



int gelen=0;
int gonder=0;
char addd;
int1 b=0;

#INT_EXT2
void  EXT2_isr(void) 
{
       gelen=fgetc(PORT2);
      gonder=gelen;
   b=1;
}

#INT_RDA
void  RDA_isr(void) 
{
   addd=fgetc(PORT1); 
   gonder=addd; 
   b=1;
}

void main()
{ 
   ext_int_edge( 2, H_TO_L); ///BU KISIMI İLAVE EDİNCE SİMİLASYON ÇALIŞTI
   enable_interrupts(INT_EXT2);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   
   while(TRUE)
   {
      output_high(pin_d0);
      if(b)
      {
      putc(gonder,PORT2);b=0;
      }
     //delay_ms(50);
      output_low(pin_d0);
     // delay_ms(50);
   }
}
mert07

RaMu

Alıntı yapılan: MrDarK - 24 Nisan 2015, 17:20:06
...Fakat en büyük problemin EXT interrupt ayarlarını doğru yapmıyorsun. Usartta veri giderken veri start biti LOW ile başlar. O yüzden senkronizasyonu yakalayamıyorsun sanırım. Hardware Pull-upları devreye sok veya manuel direnc at. Sorunu çözeceksin. ...

Alıntı yapılan: Murat Mert - 24 Nisan 2015, 18:20:06
ext_int_edge( 2, H_TO_L); ///BU KISIMI İLAVE EDİNCE SİMİLASYON ÇALIŞTI
 


Bence güzel bir deneyim ve geri bildirim oldu,
faydalı bir çalışma.
Ama veri start biti kesinlikle her zaman 0 ile mi başlar bunu net olarak öğrenmek istiyorum.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

z

Asynchronous Communication"da  aksi düşünülemez.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Murat Mert

S.A.
Sn. RaMu hocam olayı şöyle çözdüm:
Seri iletişimde rx-tx bağlıyken normalde high konumda bulunuyor data geldiğinde high to low oluyor yani yüksekten düşüğe. Ya ben niye bunu aynı kesme içinde başka bir pin ile iletişim yaptırmıyorum geldi. Bir pnp transistörü uart pinine bağlayarak portb2 harici kesmesini aktif ettim kesmenin içinde de portb4 ucunu rastgele rx ucu yapıp denedim pat diye çalıştı.
Kendi kendime ulen ext kesme için low to high yada high to low aktifliği var ya dedim (bazen insanın aklı ya uçarken yada kaçarken geliyormuş  :)  )  iletişimde high to low olduğu için onun komutunu koydum
simülasyon çalıştı. detaylı düşünmeyip not almamanın sonuçları. Hayırlısı artık. Kolay gelsin.
mert07