RS845 ile picler arası seri iletişim sorunu

Başlatan etokar, 16 Temmuz 2013, 22:06:07

etokar

Hocam bu şekilde bir program yazdım fakat stabil çalışmıyor. İsiste bazen olması gerektiği gibi çalışıyor fakat butonlara ikinci basışımda tepki vermiyor. HSEROUT komutu ile sadece tek bir byte data gönderebildim ya da alıcı tarafında HSERIN komutu ile sadece tek bir byte data alabildim. Dolayısı ile sorgu cevap şeklinde karşılıklı haberleşme yaptıramadım. Sorun nerede acaba?
Saygılarımla.

ete

#16
Çok büyük hata yok programda. Senaryo yazmışsın ama sanki program yazar gibi fazla detay vermişsin.
Daha basit yazabilirdin. Her neyse. Şimdilik haberleşme kısmını çalışır hale getirdim. Birazda programda kısaltmalar yaptım.
Öncelikle hemen belirteyim. RS485 kullandığınız zaman yollanan bilginin peşine bir adet Line Feed (10) ve bir RETURN (13) ekleyin. AKsi halde sistem düzgün çalışmayacaktır. Bunları ekledim
Kısaltmalara gelince,
Pek çok kişinin yaptığı kusurlardan birisini sende yapmışsın.
Bit bazında bir değişkenin yalnızca iki alternatifi vardır. Ya sıfır olmak yada 1 olmak gibi.
Sıfır olma konumuna sen değer verirsen bir olduğundaki değerinide if komutu ile verirsen boşuna iki if kullanmamış olursun.
Örnek veriyorum.
IF GELEN=1 then
   TOGGLE BAK
   IF BAK=0 Then KIME=1
   IF BAK=1 Then KIME=11
ENDIF
şeklinde yazılmış bir satır gurubunu şöyle yapabilirsin.
IF GELEN=1 then
   TOGGLE BAK:KIME=1
   IF BAK=1 Then KIME=11
ENDIF
Burada BAK=0 konumuna direk KIME=1 şeklinde değer vererek tanımlamış olduk. BAK=0 ise verdiğimiz tanımlama doğru olacaktır. Yok BAK=1 ise zaten alttaki if satırı nedeni ile KIME=11 olacağı için iki tane if satırı kullanmamış oluruz.

Daha fazla kısaltma yapılabilir programında.
Örnek vermek gerekirse, Tuş takımı taramasında While B1=0:wend, While B2=0:wend ... gibi satırlar var. Bunların sayısı toplam 20 adet. Bu kadar satır yerine tek bir satırla en azından 15 tanesini silebilirsin.
GOSUB GONDER ile biten bu kontrol kısımlarındaki While...:WEND satırlarını sil ve GONDER etiketinin son satırına,
WHILE B1=0 or B2=0 or B3=0 or B4=0 or B5=0:WEND
şeklinde bir satır ilave et hepsinin yerine geçmiş olur. Dediğim gibi yalnızca GOSUB GONDER komutu olan IF satırlarındaki While..:Wend satırlarını sileceksin.
Programda eksik komut bulunması kuvvetle muhtemel. Mesela mic tuşuna basınca mic toggle yapıyor ama karşıya bir bilgi yollanmadığı için Student'deki PORTA.1 ledi yanmıyor. Bu bir eksiklik olsa gerek. Her neyse şu anda haberleşme çalıştığına göre eksiklerini bulman kolyalaşır sanırım.
Birde İsis de değişkenlerin değerlerini izleyebilirsin. Ben bazılarını ekrana gertirdim gerekirse ilaveler yapabilirsin.

Ete

etokar

Hocam tüm yardımlarınız için sonsuz minnetlerimi sunarım. Çok şükür sistemi sorunsuz bir şekilde çalıştırabildim. Bahsini ettiğiniz tüm eksiklikleri giderdim. Öğrenci kısmını şu hale getirince sorunsuz çalıştı;

BASLA:
    GOTO BASLA

DISABLE
INT:
    GIE=0
    HSERIN 10,ATLA,[WAIT("ETO"),KIME]
    IF KIME=KIMLIK THEN HIGH SPK
    IF KIME=KIMLIK+50 THEN LOW SPK
    IF KIME=KIMLIK+100 THEN HIGH MIC
    IF KIME=KIMLIK+150 THEN LOW MIC
    IF KIME=255 THEN HIGH SPK
    IF KIME=254 THEN LOW SPK
    IF KIME=253 THEN
        LOW SPK:LOW MIC
    ENDIF
    IF 100<KIME>116 AND KIME<>(KIMLIK+100) THEN LOW MIC
ATLA:
    TEMP=RCREG
    RCIF=0
    GIE=1
    Resume
    enable
END

Önceki programda kesme kısmında sadece gelen datayı KIME isimli değişkene yazdırıyordum. Program kesmeden çıktığında gelen dataya yani KIME değişkenine bakarak program işliyordu, daha doğrusu böyle işlemesi gerekiyordu fakat program istediğim şekilde çalışmıyordu. Sebebi sizce ne olabilir? Bu son hali ile tüm işlemler kesme içerisinde tamamlanıyor. Kesme oluşmadığı anlarda sürekli olarak BASLA:GOTO BASLA kısır döngüsünde olması herhangi bir sorun teşkil eder mi? Son olarak şöyle bir ekleme yapmışsınız;

KIMLIK VAR BYTE 56
KIME VAR BYTE 57
EMIR VAR BYTE 58
YANIT VAR BYTE 59
SW VAR BYTE 60
SW1 VAR BYTE 61
SW2 VAR BYTE  62
TEMP VAR BYTE 63

Bu 56'dan 63'e kadar olan rakamlar ne için kullanılıyor, neyi ifade ediyor bilemedim. Anlatabilir misiniz?
Saygılarımla

etokar

Hocam bu arada şunu da belirteyim; TOGGLE MICC yazdığım satır sadece master panelin mikrofonunu açıp kapatıyor, öğrencilere herhangi bir bildirim yapmıyor. Öğrencilerin dinlemelerini kontrol eden 15 adet tuş, fonksiyon tuşuna basıldığında mikrofon kontrollerine dönüşüyor, gönderilecek data ona göre belirleniyor.
Saygılarımla

ete

#19
Tamam anladım. Sonradan bir kaç değişiklik daha yapmıştım. İlk yüklediğimi mi kullandın bilemiyorum ama özellikle ikinci yüklediğimde (ilk dosyayı yenilemiştim) student kısmında USART dan gelen bilgiyi GELEN isimli ikinci bir değişkene aktardım. Böylece sistem daha stabil çalışmaya başladı.
Hatta senin MIC kısmıda çalışmaya başladı ve MIC ledi yandı. Şemaya FUNC ledi ekledim. Oda çalışıyor.
Şayet birinciyi yükledi isen bu son halinide aynı yerden yüklemeni öneririm.

Değişkenlerin yanına koyduğun onların pic hafızasında yerleşeceği adresleri belirler. Böylece onları ISIS de izleyebilirsin. Bende bunu yaptım. Yolladığım ISIS şemasını çalıştırıp sonra yukarıdan watch window'u açarsan dediklerimi daha iyi anlarsın. Hatta bu otomatik açılması gerekir sanırım.

Ete

etokar

Hocam yardımlarınız ile devremi tam istediğim gibi çalıştırdım çok şükür. Bir konu daha danışmak isterim. Devre matris yöntemiyle sürekli olarak butonları tararken aynı zamanda karşılıklı haberleşme yaparak 15 adet slave cihaza "talebin varmı?" karşılığında "var veya yok" komutlarını işleyebilir miyim? Bir deneme yaptım bununla ilgili. Butonlar taranırken talep sorgusunu aktif et butonunu da ekledim. Aktif değilken çok güzel çalışıyor. Aktif edilmiş ise örneğin buton1 kontrol edilmesinin ardından 1 kimlik numaralı cihaza sorgu yapıp cevap alıyor ve çıkışa aktarıyor, aynı işlemi diğer 14 adet buton kontrolünün ardından yapmaya devam ediyor. Fakat matris inanılmaz yavaşlıyor. Nasıl bir çözüm önerirsiniz?
Saygılarımla

ete

Çok yüklü bir matris tarama sistemin var. Epeyce vakit alıyordur bir çevrim. Yapılacak işlerdenbirisi işlemci frekansını artırarak birim zamanda yapılan iş sayısını artırmak olabilir.
İkincisi şemaya bakınca zaten matris sistemini kesmeye uygun yapmışsın. Bence tarama işini kesmeye bağla yapılacak işleri ise kesmeye uygun hale getir.
PORTB 4-7 (port değişiklik ) kesmesi oluştuğu zaman bir tuşa basılmış anlamına gelecek ve basılan tuşu tespit edeceksin.
Sonra kesmeden çıkıp hangi tuşa basılmış ise işlemi yapacaksın.  Tabiiki kesmenin oluşabilmesi için tarama işinide yapmak gerekiyor. Ama işlem yapmadan tarama yaptıracaksın. Örnek vermek gerekirse;
A=0
Gosub Delay (For I=0 to 1000 :next :return)
A=1
B=0
Gosub Delay
B=1
C=0
Gosub Delay
C=1
D=0
Gosub Delay
D=0
return
şeklinde bir tarama yaptırabilirsin. Bu tarama esnasında bir tuşa basılırsa otomatikman program kesmeye atlayacak ve sende orada hangi tuşa basıldığını tespit edeceksin. Birde TUS diye bit değişkeni tanımlarsan TUS=1 ise yeni tusa basılmış anlamına gelir. Sonra mevcut if satırlarını çalıştırırsın.
IF TUS=1 and B1=0 then
....
TUS=0
Endif
şeklinde halledersin.
BU şekilde olur ama işini kolyalaştırır ve hızlandırı mıu bilemiyorum. Yazmadan yada denemeden anlaşılmaz bu. Bence daha iyi çalışır en azından tuş atlama yada algılama sorunu olmaz.

Başkada bir yol aklıma gelmiyor maalesef.

Ete


zeus48

Arkadaşlar mrb konu seri iletişimken benimde bir sorum olacak.
SEROUT2  protokolüyle gönderdiğim datayı  HSERIN  ile alabilirmiyim.

greatgonzo


zeus48


Powered by EzPortal