RS845 ile picler arası seri iletişim sorunu

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

etokar

Arkadaşlar merhaba,
Bir projem var fakat bir türlü usart haberleşmesini yaptıramadım. Projem şöyle;
1 adet öğretmen paneli ve 15 adet öğrenci paneli var. Öğretmen panelinde 20 adet buton var. 15 tanesi öğrenci seçme butonları, 1 tanesi ALL butonu, 1 tanesi RESET butonu, bir tanesi MİKROFON butonu, 1 tanesi FONKSİYON butonu ve 1 tanesi de TALEP DURDUR butonu. Öğrenci panelinde ise 1 tane TALEP butonu var.
Öğretmen panelindeki 15 adet butona basıldığında basılan butonun kırmızı ledi yanacak ve o butonun basıldığı öğrencinin adresine dinlemeyi aç komutu gönderecek. Aynı butona tekrar basıldığında dinlemeyi kapat komutu gönderecek ve paneldeki ledi söndürecek. ALL butonuna basıldığında tüm ledleri yakacak ve hepsine tek bir komutla dinlemeyi aç yollayacak. Hepsi açıkken ALL tuşuna basılırsa hepsine dinlemeyi kapat komutu gönderilecek ve tüm ledler sönecek. FONKSİYON tuşuna basıldığında fonksiyon ledi yanacak ve 15 adet buton öğrencilerin mikrofon girişini kontrol edecek. Yanlızca bir adet öğrencinin mikrofonu açık olabileceğinden hangi öğrencinin butonuna basılırsa önce tüm öğrencilere mikrofonu kapat komutu ve hemen arkasından seçili öğrenciye mikrofonu aç komutu gönderilecek. FONKSİYON butonuna tekrar basıldığında fonksiyon ledi sönecek ve 15 adet buton yine öğrencilerdeki dinlemeyi kontrol edecek. MIC butonu öğretmenin mikrofonunu kontrol edecek. Öğretmenin mikrofonu öğrencilerden bağımsız olacak, yani sadece bir öğrencinin mikrofonu aktif olurken aynı zamanda öğretmeninki de aktif olabilecek. Bunu da bir ses mikseri halledecek. TALEP DURDUR butonuna basıldığında öğrencilerin konuşma talebinde bulunmaları engellenecek, öğrenci panelinde bulunan talep butonunun aktiflik ledi sönecek. RESET tuşuna basıldığında tüm öğrencilerim mikrofon ve dinlemeleri kapanacak. Proje bu şekilde.
Öğretmen panelinde iki adet mikroişlemci kullanıyorum. 1 tanesi 16F877, diğeri 16F628. 16F877 butonları, mikrofon ve dinleme ledlerini kontrol edecek ve bunlara komutları gönderecek. Sadece data gönderme olacak alma olmayacak. 16F628 ise sürekli olarak 15 adet öğrenciye mikrofon talebin var mı sorgusu yapacak. 16F877 data göndereceği zaman meşgul çıkışını aktif ederek 16F628'i RB0 kesmesine sokacak ve data trafiğini kesecek, ardındn datayı yollayacak. Data yollandığında 16F628'i kesmeden çıkararak tekrar sorgu yapmasına izin verecek. TALEP DURDUR butonuna basıldığında 16F628 kesmeye sokularak trafik durdurulacak ve kimse talepte bulunamayacak. Algoritma bu şekilde.

Devrenin resmini ve kodları ekte veriyorum. Üstadlardan neden haberleştiremediğim konusunda bilgi bekliyorum.
Saygılarımla.

etokar

Haberleşmeyi bir türlü sağlayamadım nerede hata yapıyorum acaba? 1 haftadır sabah ezanına kadar üzerinde çalışıyorum fakat hala haberleşme kısmını çalıştıramadım. Değerli bilgi ve fikirlerinize ihtiyacım var.
Saygılarımla

ete

Epeyce komplike bir proje. Mantığını çözmek gerçekten zor. Bu nedenle yalnızca haberleşme kısımlarına baktım.
Büyük bir sorun göremedim.
Ancak bu tür sistemlerde bir mater - Slave ilişkisi olması gerekir. Bu ilişki içinde bir yönetici olmalı bütün alışveriş trafiğini bu yönetici yönetmelidir. Bu işi yapabilmesi içinde mutlaka emir verip emrin alındığının onayını alması yani iki yönlü haberleşme yapması gerekir. Aksi taktirde iş çorbaya döner. Bu projede de sanki ipin ucu kaçmış gibi.
Sitede bir çalışma yapmıştık. O projeyi inceledinmi bilemiyorum ama incelemedin ise incelemeni öneririm.
Her ne kadar başlığı RF sistemler diye başlasada çalışmanın temeli RS485 üzerine kuruludur.

İşte linki,
http://etepic.com/index.php/topic,57.0.html

Ete

etokar

Hocam ilginiz ve cevabınız için teşekkür ederim. Hem paneldeki butonları kontrol edecek hem de slave cihazlardaki talepleri kontrol edecek bir algoritma yaratamadığımdan öğretmen panelinde 2 adet işlemci kullandım. Bu konuda bir fikir verebilir misiniz? Teşekkürler
Saygılarımla

ete

Aslında komplike işleri severim. Akıllıca düşünmeyi ve plan yapmayı gerektirir. Senin projen konusunda bir yorum yapabilmek için konuya hakim olmam gerekir. Şu anda , bu konuda ki açıklamalarınla bu işi yapmam mümkün değil. Önce bir senaryo yada çalışma prensibi yazman gerekir. Bu prensip bir yerde programın yazılmış halinin lafla ifadesidir. Madde madde bunları yazarsan kim ne yapacak yada yapmalı anlaşılır ve bizde yorum yapacak hale gelebiliriz yoksa bodoslamadan konuya dalınca kopukluk oluyor. Hikaye gibi açıklama pek işe yaramaz bana işlem sırasınıda içeren senaryo gerekir. Bu sisteme örnekler verdiğimi hatırlıyorum. Algoritma kısmına olabilir. Aslında örneğede gerek yok. Ne demiştik işlem sırasınıda içeren programın lafla anlatımı şeklindeki açıklamam her şeyi açıklıyor. Basit bir led yak söndür programı için şöyle bir şey yazabilirdik.
- sigorta ayarlarını ver
- çalışma frekansını define ile tanımla
- varsa özel registerleri (cmcon - option_reg) gibi ayarla
- tris registerleri ile giriş çıkışları düzenle
- program değişkenlerini tanımla
- açılış gecikmesini ver
- basla etiketi ile ana programa başla
- led i yak
- 200 ms bekle yandığı görülsün.
- ledi söndür
- 200 ms bekle söndüğü güzüksün.
-tekrar basla satırına giderek işlemi devam ettir.
Bu bir senaryodur. Programcı bu satırları kolaylıkla programa dönüştürebilir ve hata yapmamışöise o programda doğru bir şekilde çalışır.
Sende bunu önce kendin için yap. Buraya koy demiyorum ama sorununa çözüm bulamıyorsan o zaman buraya koy derim. Başka türlü ne yapmak istediğini bilemeyiz. Bilirsek de hata takibi yapmak kolaylaşır.

Ete

etokar

#5
Tamam hocam şu an senaryoyu yazıyorum. Biraz uzun olacağından gecikeceğim.
Şu konuya bir açıklık getirebilir miyiz hocam? Haberleşme kısmında öğretmen panelindeki buton ve ledlere bağlı olan 877 sadece data gönderecek yani almayacak. HSEROUT ["E","T","O",#KIME,#EMIR] şeklinde bir komutla kimin id sini gönderdiysem o emir komutuna bakacak ve dinleme çıkışını kontrol edecek, geri bildirim yapmayacak. Haberleşme tek yönlü olacak. Bahsettiğim 628 ile yapılan talep sorgusunu ayrı donanımlarla ve ikinci bir hat ile kendi aralarında haberleştireceğim. Şu an bu konuyu hariç tutarak sadece tek yönlü haberleşme yaptıracağım. Sizin dersleriniz ve konularınızı inceleyerek bu noktalara gelebildim. Hocam eklediğim bu dosyaların haberleşme kısımlarına bir göz atabilir misiniz? neden haberleşemiyorum acaba?
Saygılarımla

ete

Yanlışın burada.  Emir yollayac da alıp almadığını nasıl anlayacak.
Yolladı emri ama diğer işlemci o anda yollanan emri almadı ise hiç bilmeden diğerine emir yollayacak. Onay almak rs485 de basit bir olay neden ısrar ediyorsun. ? Tabiiki proje senin projen ne istersen onu yaparsın ama bence yanlış düşünce.
Ete

etokar

Hocam emirin karşılığını verdirmek dediğiniz gibi zor değil. Fakat hepsini aç, hepsini kapat gibi broadcast komutların karşılığını nasıl alacağım?15 cihaza birden tek komut göndererek hepsine aynı anda açıl komutu verdiğimde hepsi yine aynı anda açıldım diye dönüş yaparsa trafik nasıl kontrol edilecek? Takıldığım nokta burası. Bu konuda ne önerirsiniz? Saygılarımla

etokar

Bahsettiğiniz gibi karşılıklı haberleşme de yaptım fakat netice aynı. İsis'te data iletişimi görünüyor fakat komut algılanmıyor. Acaba sigorta ve define ayarlarını mı yanlış yapıyorum? Usart kullanacağımdan dahili pull-up ları iptal ediyorum, yanlış mı biliyorum?

Ayarlar şöyle;


16F877 için:

@ DEVICE PIC16F877A
@ DEVICE PIC16F877A, WDT_OFF
@ DEVICE PIC16F877A, PWRT_ON
@ DEVICE PIC16F877A, PROTECT_ON
@ DEVICE PIC16F877A, XT_OSC
@ DEVICE PIC16F877A, BOD_OFF
@ DEVICE PIC16F877A, CPD_ON
@ DEVICE PIC16F877A, LVP_OFF

INCLUDE "MODEDEFS.BAS"

CMCON=7
ADCON1=7
OPTION_REG.7=%10000000
TRISA=0
TRISB=%00111110
TRISC=%10000000
TRISD=0
TRISE=0
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_SPBRG 25
DEFINE HSER_CLROERR 1

VERI1   VAR BYTE
VERI2   VAR BYTE
VERI3   VAR BYTE
VERI4   VAR BYTE
KIME    VAR BYTE
KONT    VAR BYTE
EMIR    VAR BYTE
KIMDEN  VAR BYTE
YANIT   VAR BYTE
TEMP    VAR BYTE

TUMU    CON 255
BITTI   CON 254
MICBIT  CON 253
TAMBIT  CON 252

SYMBOL  DTA1=PORTA.0
SYMBOL  CLK1=PORTA.1
SYMBOL  AKTAR1=PORTA.2
SYMBOL  DTA2=PORTE.0
SYMBOL  CLK2=PORTE.1
SYMBOL  AKTAR2=PORTE.2
SYMBOL  B1=PORTB.1
SYMBOL  B2=PORTB.2
SYMBOL  B3=PORTB.3
SYMBOL  B4=PORTB.4
SYMBOL  B5=PORTB.5
SYMBOL  FONKLED=PORTC.1
SYMBOL  MICC=PORTC.2
SYMBOL  TRPIN=PORTC.5
SYMBOL  A=PORTD.0
SYMBOL  B=PORTD.1
SYMBOL  C=PORTD.2
SYMBOL  D=PORTD.3

CLEAR
VERI1=0:VERI2=0
VERI3=0:VERI4=0
KIME=0:EMIR=0
KIMDEN=0:YANIT=0
TEMP=0


16F628 için:

PORTA=0:PORTB=0
TRISA=%00101111   
TRISB=%00000010

@ DEVICE PIC16F628A                               
@ DEVICE PIC16F628A, WDT_OFF
@ DEVICE PIC16F628A, PWRT_ON
@ DEVICE PIC16F628A, PROTECT_ON
@ DEVICE PIC16F628A, MCLR_ON
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT

INCLUDE "MODEDEFS.BAS"

define OSC 4
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_SPBRG 25
DEFINE HSER_CLROERR 1

OPTION_REG=128
CMCON=7

SYMBOL TRPIN=PORTB.0
SYMBOL SPK=PORTB.3
SYMBOL MIC=PORTB.4

KIMLIK  VAR BYTE
KIME    VAR BYTE
EMIR    VAR BYTE
TEMP    VAR BYTE
YANIT   VAR BYTE

CLEAR
KIMLIK=PORTA AND 15
KIME=0
EMIR=0
TEMP=0
YANIT=0

etokar


etokar

hserin ve hserout komutlarını mı yanlış kullanıyorum yoksa

master tarafında:
HSERIN ,10,S1,[WAIT("ETI"),#KIMDEN,#YANIT]
HSEROUT ["E","T","O",#KIME,#EMIR]

slave tarafında:
HSERIN ,10,BASLA,[WAIT("ET0"),#KIME,#EMIR]
HSEROUT ["E","T","I",#KIMLIK,#YANIT]

ete

Etokar,
Öncelikle senaryonu bitir detaysız olsa bile buraya koy ki ona göre düşünelim.
Bir yorum yapıyoruz yok şöyle olacak diyorsun. Bu nedenle önce senaryoyu görelim.
Haberleşme hızı nedir bu arada?
877 de çalışma frekansı belirtilmemiş. Özellikle haberleşme içeren programlara bunu eklemeyi ihmal etmeyin. Yoksa işlemci kafasına göre bir hızda bitlerin veriliş yada alınış sürelerini ayarlar.

Ete

etokar

#12
Hocam kusura bakmayın biraz geç oldu cevap yazmam. Kodları ve isis şemasını ekliyorum. Senaryo biraz uzun oldu, yanlış mı anladım senaryo yazma işini bilemedim. Sizin takdiriniz.
Senaryo şöyle;

etokar

Master senaryosu;

-   Sigorta, define ve özel registerleri ayarla
-   Değişkenleri tanımla
-   Tüm sistemin hazır hale gelmesi ve senkron oluşması için iletişim hattını sustur ve tüm cihazlara sıfırlama komutu gönder

-   BASLA etiketi
-   Matris yöntemiyle butonları tara
-   KONT=0
-   A=1
-   Eğer B1=1 ise TOGGLE VERI1.0, eğer VERI1.0=1 ise KIME=1, eğer VERI1.0=0 ise KIME=51, GONDER isimli etikete dallan
-   Eğer B2=1 ise TOGGLE VERI1.1, eğer VERI1.1=1 ise KIME=2, eğer VERI1.1=0 ise KIME=52, GONDER isimli etikete dallan
-   Eğer B3=1 ise TOGGLE VERI1.2, eğer VERI1.2=1 ise KIME=3, eğer VERI1.2=0 ise KIME=53 , GONDER isimli etikete dallan
-   Eğer B4=1 ise TOGGLE VERI1.3, eğer VERI1.3=1 ise KIME=4, eğer VERI1.3=0 ise KIME=54, GONDER isimli etikete dallan
-   Eğer B5=1 ise TOGGLE VERI1.4, eğer VERI1.4=1 ise KIME=5 , eğer VERI1.4=0 ise KIME=55, GONDER isimli etikete dallan
-   A=0
-   B=1
-   Eğer B1=1 ise TOGGLE VERI1.5, eğer VERI1.5=1 ise KIME=6, eğer VERI1.5=0 ise KIME=56, GONDER isimli etikete dallan
-   .
-   .
-   .
-   Eğer B5=1 ise TOGGLE VERI2.1, eğer VERI2.1=1 ise KIME=10, eğer VERI2.1=0 ise KIME=60, GONDER isimli etikete dallan
-   B=0
-   C=1
-   Eğer B1=1 ise TOGGLE VERI2.2, eğer VERI2.2=1 ise KIME=11, eğer VERI2.2=0 ise KIME=61, GONDER isimli etikete dallan
-   .
-   .
-   .
-   Eğer B5=1 ise TOGGLE VERI2.6, eğer VERI2.6=1 ise KIME=15 ,eğer VERI2.6=0 ise KIME=65, GONDER isimli etikete dallan
-   C=0
-   D=1
-   Eğer B1=1 ise TOGGLE öğretmen mikrofonu
-   Eğer B2=1 ise ALL isimli etikete dallan
-   Eğer B3=1 ise RST isimli etikete git
-   Eğer B4=1 ise FONKLED yak, FONKS isimli etikete git
-   Eğer B5=1 ise MICIPTAL isimli etikete dallan
-   D=0
-   BASLA isimli etikete git

-   FONKS etiketi
-   KONT=1
-   A=1
-   Eğer B1=1 ise TOGGLE VERI3.0, VERI3 değişkeninin diğer bitlerini 0 yap, VERI4=0, eğer VERI3.0=1 ise KIME=101, eğer VERI3.0=0 ise KIME=151, GONDER isimli etikete dallan
-   .
-   .
-   .
-   Eğer B5=1 ise TOGGLE VERI3.4, VERI3 değişkeninin diğer bitlerini 0 yap, VERI4=0, eğer VERI3.4=1 ise KIME=105, eğer VERI3.4=0 ise KIME=155, GONDER isimli etikete dallan
-   A=0
-   B=1
-   Eğer B1=1 ise TOGGLE VERI3.5, VERI3 değişkeninin diğer bitlerini 0 yap, VERI4=0, eğer VERI3.5=1 ise KIME=106, eğer VERI3.5=0 ise KIME=156, GONDER isimli etikete dallan
-   .
-   .
-   .
-   Eğer B5=1 ise TOGGLE VERI4.1, VERI4 değişkeninin diğer bitlerini 0 yap, VERI3=0, eğer VERI4.1=1 ise KIME=110, eğer VERI4.1=0 ise KIME=160, GONDER isimli etikete dallan
-   B=0
-   C=1
-   Eğer B1=1 ise TOGGLE VERI4.2, VERI4 değişkeninin diğer bitlerini 0 yap, VERI3=0, eğer VERI4.2=1 ise KIME=111, eğer VERI4.2=0 ise KIME=161, GONDER isimli etikete dallan
-   .
-   .
-   .
-   Eğer B5=1 ise TOGGLE VERI4.6, VERI4 değişkeninin diğer bitlerini 0 yap, VERI3=0, eğer VERI4.6=1 ise KIME=115, eğer VERI4.6=0 ise KIME=165, GONDER isimli etikete dallan
-   C=0
-   D=1
-   Eğer B1=1 ise TOGGLE öğretmen mikrofonu
-   Eğer B2=1 ise ALL isimli etikete dallan
-   Eğer B3=1 ise RST isimli etikete git
-   Eğer B4=1 ise FONKLED söndür, BASLA isimli etikete git
-   Eğer B5=1 ise MICIPTAL isimli etikete dallan
-   D=0
-   FONKS isimli etikete git

-   GONDER etiketi
-   MAX485 entegresini gönderme moduna geçir
-   PAUSEUS 5
-   HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
-   HSEROUT ["E","T","O",#KIME]
-   HSEROUT ["E","T","O",#KIME]
-   PAUSEUS 5
-   MAX485 entegresini alma moduna geçir
-   Eğer KONT=0 ise VERI1 ve VERI2 değişkenlerini 595'lere aktar dinleme ledlerini gör
-   Eğer KONT=1 ise VERI3 ve VERI4 değişkenlerini 595'lere aktar mikrofon ledlerini gör
-   GECIKME isimli etikete dallan

-   ALL isimli etiket
-   MAX485 entegresini gönderme moduna geçir
-   PAUSEUS 5
-   Eğer tüm dinlemeler aktifse tüm dinlemeleri kapat
-   Kod olarak;
-   HIGH TRPIN
-   PAUSEUS 5
-   IF VERI1=255 & VERI2=127 THEN
-   VERI1=0:VERI2=0
-   HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
-   HSEROUT ["E","T","O",#BITTI]
-   HSEROUT ["E","T","O",#BITTI]
-   ELSE
-   VERI1=255:VERI2=127
-   HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
-   HSEROUT ["E","T","O",#TUMU]
-   HSEROUT ["E","T","O",#TUMU]
-   ENDIF
-   PAUSEUS 5
-   LOW TRPIN
-   VERI1 ve VERI2 değişkenlerini 595'lere aktar dinleme ledlerini gör
-   GECIKME isimli etikete dallan
-   RESET isimli etiket
-   VERI1, VERI2, VERI3 ve VERI4 değişkenlerini sıfırla (dinleme ve mikrofon ledlerini söndürmek için)
-   FONKLED=0
-   Tüm dinlemeleri ve mikrofonları kapat
-   VERI1,  VERI2, VERI3 ve VERI4 değişkenlerini 595'lere aktar dinleme ve mikrofon ledlerini gör
-   Kod olarak;
-   VERI1=0:VERI2=0
-   VERI3=0:VERI4=0
-   HIGH TRPIN:LOW FONKLED
-   PAUSEUS 5
-   HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
-   HSEROUT ["E","T","O",#TAMBIT]
-   HSEROUT ["E","T","O",#TAMBIT]
-   PAUSEUS 5
-   LOW TRPIN
-   SHIFTOUT DTA1,CLK1,1,[VERI2]
-   SHIFTOUT DTA1,CLK1,1,[VERI1]
-   HIGH AKTAR1:PAUSEUS 5:LOW AKTAR1
-   SHIFTOUT DTA2,CLK2,1,[VERI4]
-   SHIFTOUT DTA2,CLK2,1,[VERI3]
-   HIGH AKTAR2:PAUSEUS 5:LOW AKTAR2
-   GECIKME isimli etikete dallan
-   BASLA isimli etikete git

-   GECIKME isimli etiket
-   FOR X=0 TO 1800
-   PAUSEUS 100
-   NEXT
-   X=0
-   RETURN
-   Programı bitir (END)

etokar

Slave senaryosu;

-   Sigorta, define ve özel registerleri ayarla
-   Kesme ayarlarını yap
-   Değişkenleri tanımla
-   Kesme oluştuğunda INT isimli etikete git
-   KIMLIK değişkenini PORTB.7, PORTB.6, PORTB.5, PORTB.4 ile dip switch vasıtasıyla belirle
-   Eğer KIMLIK=0 ise kesme ayarlarını kapat
-   MAX485 entegresini alma moduna geçir

-   BASLA etiketi
-   Eğer seri olarak gelen KIME datası KIMLIK datasına eşitse dinlemeyi aç
-   Eğer seri olarak gelen KIME datası KIMLIK+50 ise dinlemeyi kapat
-   Eğer seri olarak gelen KIME datası KIMLIK+100 ise mikrofonu aç
-   Eğer seri olarak gelen KIME datası KIMLIK+150 ise mikrofonu kapat
-   Eğer seri olarak gelen KIME datası 100'den büyük 116'dan küçük ise ve KIME datası KIMLIK+100 değilse mikrofonu kapat. Bunun sebebi bir başka dinleyicinin mikrofonu aktif edilmişse kendi mikrofonu kapanmalıdır.
-   Eğer seri olarak gelen KIME datası 255 ise ALL komutunun karşılığı olarak dinlemeyi aç.
-   Eğer seri olarak gelen KIME datası 254 ise BITTI komutunun karşılığı olarak dinlemeyi kapat.
-   Eğer seri olarak gelen KIME datası 253 ise TAMBIT komutunun karşılığı olarak dinlemeyi ve mikrofonu kapat.
-   BASLA isimli etikete git

Powered by EzPortal