seri iletişimde kesme

Başlatan mech, 04 Haziran 2008, 09:51:14

mech

Şu ana kadar hiç kesme kullanmadım. Seri iletişimde iletişimin ne zaman başladığına dair sorunlar çıkıyor. Birkaç yerde interrupt kullanılarak seri iletişimin yapıldığını gördüm. Şimdi araştırdım bişey bulamadım. Serout komutu ile interupt'ı nasıl beraber kullanabiliriz.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

Maxim

harika bir başlık açmışsın ,
bende aynı sıkıntıyı yaşıyorum ,
şu problemi çözelim ..

Tom

Valla bencede süper bir başlık ben seri iletişimi proğramla yaptım ama pic in kendi seri iletişim donanımını kullanmak çok daha iyi.Aksi taktirde zamanlamaları tutturmak çok zor.
  Bu konuyu birlikte araştıralım ve bilgileri paylaşalım arkadaşlar.
Önegin ben pic olarak 18F452 kullanıyorum.Ve seri iletişimide ds1307 nin saat projesinde kullanacagım.

mech

Ben iki hat üzerinden iletişim kurarak yapıyorum aslında bu işi. Bugün çok uğraştım, iletişimi bi şekilde kurdum. Şöyle ki;
Bir pic için giriş ve çıkış pini tanımlanıyor. Diğer pice bir şifre niteliğindeki veriyi defalarca gönderiyor. Ta ki, diğer pic gönderen pic'in giriş pinini high yapana kadar. Karşıdaki pic bu pini veriyi aldığında daha doğrusu şifre tuttuğunda high yapıyor. Bu andan itibaren demin bilgi gönderen pic serin ile beklemeye geçiyor. Artık veri almaya hazır. Karşıdaki pic veriyi defalarca gönderiyor taki bu sefer bu picin giriş pini high olana kadar. Yani hep aynı olay vuku buluyor. Böylece seri haberleşme sınırlarda yapılmış olup garanti aktarılıyor. Hız modunu 16780 kullanıyorum.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

Gurkan-Demirbas

Alıntı yapılan: "mech"Serout komutu ile interupt'ı nasıl beraber kullanabiliriz.
Kullanamazsın; Serout veya Serin komutları; herhangi bir input/output pinini, software olarak seri haberleşme pini gibi davranmasını sağlar.
Interrupt'ı ancak hardware serial com'da kullabilirsin. Hali hazırda hardware serial com varken ben şahsen software serial com kullanmıyorum. Birden fazla seri haberleşme yapılacaksa ok kabulum.

Ama "yok ben illa da Software kullanacam ve intrrupt'ı da kullanacam" diyosan eğer; absürt ve de bir okadar da aptalca bir fikir verebilirim belki; gerçi hiç deneme ihtiyacı duymadım ama......
Serin ve Serout komutlarını kullanmadan kendin software ile PortB'de bir seri in veya seri out pini konfigüre et; ve Interrupt on PortB Change özelliğini kullanarak, interrupt yarat...
Ama olmaz, bu da olamaz ki; bu sefer de baud rate tutmaz.

Neyse, kolay gelsin

ErsinErce

Dahili usart modülünü kullanmadan da gerçekleştirebilirsiniz ama boşuna vakit kaybı olur, donanımınızı dahili usart modülünü kullanacak şekilde ayarlayın gerisini hserout hserin komutlarıyla kısa zamanda yapabilirsiniz

Gurkan-Demirbas

Alıntı yapılan: "cynetron"Dahili usart modülünü kullanmadan da gerçekleştirebilirsiniz ama boşuna vakit kaybı olur,

Hocam dahili USART ile kesme konusunda sorun yok;
Sorun bunu kullanmadan kesme yaratabilmenin formülü nedir?  ifadene göre bu mümkün, eğer söyleyebilirsen bilgilenmiş oluruz.

Soruyu netleştireyim;
Herhangi bir I/O portunu programsal olarak (hw değil!..) RX (receive) yaptık. Bu pine seri bilgi geldiğinde nasıl kesme oluşacak? ve ISR'ye nasıl dallanacak? ve de baud rate'i senkronize edip bilgiyi sağlıklı biçimde alacak?
Buyurun söz sizin

Gürkan

ErsinErce

O sözümden INTERRUPT kullanarak herhangi bir pinden seri bilgi almayı kastetmedim o şekilde anlaşıldıysa özür dilerim.

Tabi yapısal birkaç konuyu açıklamada fayda var galiba;

1) Kesmeyi yazılımsal oluşturamazsın mutlaka donanımsal bir yapıya bağlı olması lazım (Timer, USART, PortB Change, INT0, CCP, vs.)

2)Eğer seri bilgiyi aldığında bir kesme yaşanmasını istiyorsan USART kullanmak zorundasın

3)Seri bilgiyi almaya başlarken kesmeye sokabilirsin. Bunlar INT0, INT1, INT2, PORTB 4~7Change, CCP, Timer0, Timer1. Gerekli ayarları yaparak bütün hepsiyle kesme oluşturabilirsin hepsininde portlarla bağlantıları var.

4)Yada belli süre aralıklarında bilgi bekler, karşı tarafın gönderme zamanını veya tekrarlamasını ona göre ayarlasın

Umarım açıklayıcı olmuştur...

mech

Evet, Isis'te denemelerime göre hserout in komutları oldukça başarılı. Peki Interrupt kullanmanın ne faydası var bize. Kullanmadan da çalışıyor.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

Tom

Gördüğüm kadarı ile hep basıc komutlarından bahsediosunuz.Ama kardeşiniz asm kullanıo peki o ne yapacak:-)Sözün özü örneğin pıc18f452 için portc,3 ve portc,4 uçları seri data ve clock uçları , bu uçlara göre asm dilinde sadece örnek verecek arkadaşım yokmu.
  mesela data yı dış ortama nasıl gönderecez.Ben pic in seri donanımını kullanmadan şu şekilde yapıyorum,
1-  clock=0 iken data portu olarak seçtiğimiz uca veriyi aktarıyorum ve clock pals ile veriyi dış ortama aktarıyorum.Yalnız daha önce data portunu çıkış olarak yönlendiriyorum.
2-Datayı dış ortama gönderdikten hemen sonra bu sefer data ucunu giriş olarak yönlendiriyorum.Dış ortamdan alındı bilgisini yine bu data ucundan clock pals ile alıyorum.( yani data=0)
 Eger alındı bilgisi =0 ise gönderdiğim veri dış ortama dogru bir şekilde gitmiş demektir.Eger data=1 ise data dış ortama gönderilememiş veya dış ortam gönderdiğim bilgiyi alamamış demektir, o zaman aynı veriyi tekrar gönderiyorum.
 İşte programla seri port olarak tanımladıgımız bir port tan veri bu şekilde aktarılıyor.
  Aynı işlemi pic orjinal seri portuyla nasıl yaparız bu şekilde açıklasak arkadaşlar , sanırım konuyu daha iyi anlayacagız...

mech

asm bilmiyorum ama Isiste yaptığım devre normalde çalışmadı.
Sadece veri gönderiyor. Gelen veriyi kontrol edip led yakacak. Ama çalışmadı. Sorun nedir acaba.
Device=16F628
XTAL 4
ALL_DIGITAL true
HSERIAL_BAUD = 2400        ' Set baud rate to 9600
HSERIAL_RCSTA = %10010000 '
HSERIAL_TXSTA = %00100000 
HSERIAL_CLEAR = On 
'HSERIAL_SPBRG=11 ' 115200 Bauds
Dim a As Word
Dim b As Word
Dim c As Word


TRISB.0=0
Low PORTB.0

dev:
HSerIn 50, dev, [a,b,c]
If a=831 And b=832 And c=833 Then High PORTB.0
GoTo dev


Device=16F877
XTAL 4
ALL_DIGITAL true
 HSERIAL_BAUD = 2400        ' Set baud rate to 9600
 HSERIAL_RCSTA = %10010000  ' Enable serial port and continuous receive
 HSERIAL_TXSTA = %00100000  ' Enable transmit and asynchronous mode 
 HSERIAL_CLEAR = On         ' Optionally clear the buffer before receiving
DelayMS 2000
dev:
HSerOut [831,832,833]
GoTo dev
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

Gurkan-Demirbas

Alıntı YapO sözümden INTERRUPT kullanarak herhangi bir pinden seri bilgi almayı kastetmedim o şekilde anlaşıldıysa özür dilerim.
Hocam özür dilemesi gereken biri varsa o da benim; sanırım konuyu ben yanlış yorumladım ve yanlış algıladım.
Verdiğin 4 madde'ye de tamamen katılıyorum.
Alıntı YapPeki Interrupt kullanmanın ne faydası var bize. Kullanmadan da çalışıyor.
Interrupt kullanmanın manası şudur: Bir yerde müdürsün diyelim ve altında çalışan ve belli sorumluluğu olan biri var; diyelimki bu adam telefonlara bakıyor. Belirli aralıklarla adama gidip "bana telefon eden varmı?" diye sormak mı daha iyidir, ki bu durumda aralık uzun ise gelen telefonu kaçırma ihtimalin var; yoksa telefon geldiğinde adamın hemen sana haber vermesini mi tercih edersin?
eğer işlerin çok yoğun değil ise; belirli periodlarla bunu adama sorarsın; ama işlerin yoğunsa, işlerini ikide birde yarım bırakıp adama sormak çok mantıklı mıdır?
Interrupt da budur zaten, işlemciyi uyarmak ve alarm vermek için kullanılır. İşlemcinin zamanını almaz.
Alıntı Yap1- clock=0 iken data portu olarak seçtiğimiz uca veriyi aktarıyorum ve clock pals ile veriyi dış ortama aktarıyorum.Yalnız daha önce data portunu çıkış olarak yönlendiriyorum.
Hocam senin dediğin senkron haberleşme; tamam buna itirazım yok ama ya bilgiyi RF gönderiyorsan; arası 1 km olan iki işlemcinin RF'le haberleşmesinde bir de senin bahsettiğin senkronizasyon clock'unu göndermen gerekir, ki USART varken çok mantıksız olur bu.

Biz Asenkron haberleşmeden bahsediyoruz
USART = Universal Serial Asynchronous Receiver Transmitter
Alıntı YapAynı işlemi pic orjinal seri portuyla nasıl yaparız bu şekilde açıklasak arkadaşlar , sanırım konuyu daha iyi anlayacagız...
Kullandığın Pic'in Master Synchronous Serial Port'unu kullanarak yapabilirsin; pic'in datasheet'ini incele.

Gürkan

mech

Alıntı yapılan: "mech"asm bilmiyorum ama Isiste yaptığım devre normalde çalışmadı.
Sadece veri gönderiyor. Gelen veriyi kontrol edip led yakacak. Ama çalışmadı. Sorun nedir acaba.
Device=16F628
XTAL 4
ALL_DIGITAL true
HSERIAL_BAUD = 2400        ' Set baud rate to 9600
HSERIAL_RCSTA = %10010000 '
HSERIAL_TXSTA = %00100000 
HSERIAL_CLEAR = On 
'HSERIAL_SPBRG=11 ' 115200 Bauds
Dim a As Word
Dim b As Word
Dim c As Word


TRISB.0=0
Low PORTB.0

dev:
HSerIn 50, dev, [a,b,c]
If a=831 And b=832 And c=833 Then High PORTB.0
GoTo dev


Device=16F877
XTAL 4
ALL_DIGITAL true
 HSERIAL_BAUD = 2400        ' Set baud rate to 9600
 HSERIAL_RCSTA = %10010000  ' Enable serial port and continuous receive
 HSERIAL_TXSTA = %00100000  ' Enable transmit and asynchronous mode 
 HSERIAL_CLEAR = On         ' Optionally clear the buffer before receiving
DelayMS 2000
dev:
HSerOut [831,832,833]
GoTo dev
evet arkadaşlar acaba neyi yanlış ya da eksik yapıyorum. Bu devre isiste çalışırken neden gerçek devrede çalışmıyor. Kesmeyle de denedim yine aynı. Teşekkürler...
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

Gurkan-Demirbas

kolay gelsin
Gürkan


DÜZELTME : Hocam ben PBP kullanıyorum, proton'a tamamen yabancıyım; sanırım proton'da tanımlamalar farklı, özür diliyorum

mech

Tamam arkadaşlar bir özür faslıdır gidiyor. güzel de benim sorunuma bi baksaydık.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır