birden fazla f628 haberleştirme yardım

Başlatan mikro29, 06 Haziran 2007, 12:52:12

mikro29

merhaba,
başlıktada bahsettiğim gibi birden fazla pic' i haberleştirmeye (kablolu )çalışıyorum... ETE hocanın derslerindeki haberleşme devresini gerçek ortamda yaptım 2 pic normal şekilde haberleşiyor buraya kadar anormal bi durum yok yalnız alıcı tek,  verici üniteleri artırınca (2 yapınca problem yok 3 verici yapınca problem )  çalışan piclerde daha çalışmıyor yardımlarınızı bekliyorum...

'****ALICI*****
PORTA=0
PORTB=0
TRISA=%00100000 'A portu A.0 giris digerleri çıkıs yapıldı.
TRISB=%00000001 'B portu tamamı çıkıs yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628 'islemci 16F628
@ DEVICE pic16F628, WDT_on 'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE pic16F628, MCLR_OFF 'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'---------------------------degiskenler------------------------------
AL VAR BYTE
GIRIS VAR PORTb.0
'-----------------------------B A S L A N G I Ç ---------------------------
CMCON=7
CLEAR
PAUSE 100
PORTB=0 'tüm çıkıslar low seviyesinde
'-------------------------------------------------------------------------------
BASLA:
SerIn2 GIRIS,396,[WAIT ("ETE"),AL]
IF AL=33 THEN
toggle portb.5
ENDIF
IF AL=66 THEN
TOGGLE portb.1
ENDIF
IF AL=44 THEN
TOGGLE portb.2
ENDIF
PAUSE 200
GOTO BASLA
END


'***********VERİCİ ÜNİTE************

@ DEVICE pic16F628 'islemci 16F628
@ DEVICE pic16F628, WDT_on 'Watch Dog timer kapalı
@ DEVICE pic16F628, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off 'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'------------------------------------------------------------------------------
CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
OPTION_REG.7=0 'Dahili pull-up lar AKTF yapıldı ayrıca pull-up direncine gerek yok
PortA=0
TrisA=%00000000
porta=%00000000
PortB=%00000000
TrisB=%11111011
'------------------------------------------------------------------------------
SYMBOL CIKIS=PORTb.2
SYMBOL TUS1=PORTB.3
'SYMBOL ROLE=PORTA.1
VER VAR BYTE
SAY VAR BYTE
PAUSE 200
VER=0
'------------------------------------------------------------------------------
SEROUT2 CIKIS,396,[REP$AA\5,REP$00\5,REP$FF\5]
BASLA: 
VER=0
IF TUS1=0 THEN
VER=44
gosub gonder
WHILE TUS1=0
WEND
endIF
PAUSE 100
SEROUT2 CIKIS,396,[REP$AA\5,REP$00\5,REP$FF\5]
GOTO BASLA
'-------------------------ALT PROGRAMLAR---------------------------------------
GONDER:
SEROUT2 CIKIS,396,["E","T","E",ver]
SEROUT2 CIKIS,396,["E","T","E",ver]
return
END

OG

Birden fazla verici aynı hatta ise gönderme sırasını nasıl tayin edecek? Bunları bir sıraya sokmaz isen üst üste çakışır. Alıcıda da bir zaman sınırı yok.
SerIn2 GIRIS,396,[WAIT ("ETE"),AL]
Data gelmezse veya anlamsız/karışık birşeyler gelirse hep bu satırda kalır, ilerleyemez, timeout vermen gerekir.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Ziya

1 master, diğerleri slave senkron seri port kullan. Forumda ccs için senkron slave rutin örneği var. Senkron Master rutinini kendin yaparsın.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

mikro29

OG hocam ilginiz için çok teşekkürederim.
programda nasıl bi değişiklik yapmam gerekli yardımlarınızı bekliyorum

mikro29

Alıntı yapılan: "Ziya"1 master, diğerleri slave senkron seri port kullan. Forumda ccs için senkron slave rutin örneği var. Senkron Master rutinini kendin yaparsın.
ZİYA hocam CCSbilmiyorum picbasic de bu işi nasıl yapabilirim

Ziya

malesef pbp yu hiç kullanmadım. Assembler olarak ekleyebilirsin belki.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

OG



Aslında senin devrende tüm üniteler hem alıcı hem verici olmalı, hepsi hem gönderme yapabilmeli hem alış. Bunun için varsa alıcı için fazladan bir pin daha kullanarak veriş portu (transistöre giden) verici için de alış portu kullanabilir ve sırası ile haberleştirebilirsin.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

vale9

mikro29; OG hocamın bahsettiği soruna katılıyorum. Hatta herkes aynı anda data gönderemez. Başlangıçta vericiler aynı anda gönderiyor. Bunun için her verici random bir sayı kadar bekleyip data yollayabilir veya verici programına hatta data varsa bu data bitene kadar bekle diyebilirsin.

Ama asıl önemli sorun haberleşmede büyük hatalar çıkabileceği. Mesela alıcıda "pause 200" diye birşey var, eğer bu döngünün sonuna doğru bir veri gelirse, alıcı bunun son bitlerini görebilecek ve senin "ETE" diye yazdığın headeri alamadığı için kilitlenecek. Sen ne kadar fazla sayıda ard arda tekrarlasan da mutlaka hata olacak. Bunu engellemek için ben aşağıdaki yöntemi kullanıyorum ve işe yarıyor.

Gönderme:
DENEME:

    IF BUTTON=1 THEN 
        M=126
        GOSUB SEND
    ENDIF

    GOTO DENEME

SEND:

    IF RX=1 THEN SEND                           ' hatta veri varsa bekle
    
    HIGH TX                                     ' interrupt yolla
    PAUSE 500                                   ' 500 ms bekle

    SEROUT2 TX,1646,["M",M]                     ' 600 baud 8n1 no-parity
    LOW TX                                      ' tx ucunu sıfırla
    
    RETURN


Alma:
DENEME:

    IF RX=1 THEN 
        GOSUB RECEIVE
    ENDIF

    GOTO DENEME

RECEIVE:

    SERIN2 RX,1646,1000,G_3,[WAIT ("M"),M]      ' 600 baud 8n1 no-parity  
    PAUSE 100                                   ' 100 ms bekle
G_3:

    RETURN
Hayat 1'ler ve 0'lardan ibarettir.

Ziya

Multimaster olacaksa, senkron haberleşmede her bir mcu da fazladan bir bacak meşgul hattı için kullanılır ve birbirlerine ve pullup dirençle Vcc ye bağlanır. Başlangıçta bütün mcular senkron slave durumundadır. Veri göndermek isteyen meşgul hattını Vcc de görürse bu hattı 0 a çeker, senkron master durumuna geçip verileri gönderir, işlemi bitirince senkron slave geçip meşgul hattını bırakır (bacak yönünü giriş yaparak). 100 binde bir ihtimalle hat çakışması yaşanabilir. Bu sorunu tespit etmek için için de karşıdan (alıcıdan) onay beklenebilir. Data ve clock hatları küçük değerli birer direnç üzerinden hatta bağlanması, çakışma durumunda portun hasar görmesini engelleyebilir.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

mikro29

verdiğiniz bilgiler için teşekkür ederim deneme yapıyorum

mavi

bence bir master  yani efendi olmadan bu iş yürümez buna benzer bişi şu an yapmaya çalışıyorum.max 485 ile 2400 metreye veri gönderebiliyorum ama şu an ihtiyacım tek yönlü sorunum yok ama eğer çift yönlü olsaydı tercihim full dublex bağlantı olurdu. www.alldatasheet.com da max 485 datasheeti var bakabilirsin piyasa karşılığı 75176 dır.

Full duplex bağlantıda  hiç bir birim kendi arasında görüşemez yalnız efendi ile görüşebilirler.efendi kime konuş derse o konuşur. aynı hatta 32 adet birim bağlanabilir.Bu sitede buna benzer bir bağlantı devresi verilmişti.


birimlerden aldığı veriyi işleyip tekrar ilgili birimlere dağıtır.

Şu an altı uzak birimim var ama başlangıc tahmin ediyorum 4 ayda bu birimler 40 ı elliyi bulur. tam diktatör bir efendi icat edecez demektir.

Belki fikir verir diye yazdım....

başarılar...
Telecommander Monster Of Network

vale9

Ben tek kablo üzerinden half-duplex çalıştırıyorum. 256 ünite 1200 metreden haberleşebiliyor.
Hayat 1'ler ve 0'lardan ibarettir.

mikro29

arkadaşlar hala çözüm bulamadım proteusta herşey normal gerçek ortamda 2 veya 3 adet pic ile haberleşebiliyorum toplam 16 pic olması lazım acaba programdamı hata yapıyorum yoksa yaptığım devredemi
TRISA=%00000000
TRISB=%10000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000100
PORTA=%00000000
PORTB=%00000000
PORTC=%00000000
PORTD=%00000000
PORTE=%00000000
@ DEVICE PIC16F877
@ DEVICE PIC16F877, WDT_ON
@ DEVICE PIC16F877, PWRT_ON
@ DEVICE PIC16F877, PROTECT_OFF
@ DEVICE PIC16F877, XT_OSC
'--------------ATAMALAR----------------
INCLUDE "MODEDEFS.BAS"
ADCON1=7
OPTION_REG.7=1
define OSC 4
'---------------------------degiskenler------------------------------
AL VAR BYTE
GIRIS   VAR PORTE.2
KML1    VAR PORTD.1
KML2    VAR PORTD.0
KML3    VAR PORTC.3
KML4    VAR PORTC.2
KML5    VAR PORTC.1
KML6    VAR PORTC.0
KML7    VAR PORTD.2
KML8    VAR PORTD.3
KML9    VAR PORTC.4
KML10    VAR PORTC.5
KML11    VAR PORTC.6
KML12    VAR PORTC.7
KML13    VAR PORTD.4
KML14    VAR PORTD.5
KML15    VAR PORTD.6
KML16    VAR PORTD.7
BUZZER  VAR PORTE.0
SAYI    VAR BYTE
BIRLER  VAR BYTE
ONLAR   VAR BYTE
SAYI=0
'OPTION_REG.7=0
'-----------------------------B A S L A N G I Ç ---------------------------
CLEAR
PAUSE 100

'-------------------------------------------------------------------------------
BASLA:
SerIn2 GIRIS,396,[WAIT ("M"),AL]
IF AL=11 THEN
TOGGLE KML1:SAYI=1
ENDIF
IF AL=22 THEN
TOGGLE KML2:SAYI=2
ENDIF
IF AL=33 THEN
TOGGLE KML3:SAYI=3
ENDIF
IF AL=44 THEN
TOGGLE KML4:SAYI=4
ENDIF
IF AL=55 THEN
toggle KML5:SAYI=5
ENDIF
IF AL=66 THEN
TOGGLE KML6:SAYI=6
ENDIF
IF AL=77 THEN
TOGGLE KML7:SAYI=7
ENDIF
IF AL=88 THEN
TOGGLE KML8:SAYI=8
ENDIF
IF AL=99 THEN
toggle KML9:SAYI=9
ENDIF
IF AL=111 THEN
TOGGLE KML10:SAYI=10
ENDIF
IF AL=121 THEN
TOGGLE KML11:SAYI=11
ENDIF
IF AL=131 THEN
TOGGLE KML12:SAYI=12
ENDIF
IF AL=141 THEN
toggle KML13:SAYI=13
ENDIF
IF AL=151 THEN
TOGGLE KML14:SAYI=14
ENDIF
IF AL=161 THEN
TOGGLE KML15:SAYI=15
ENDIF
IF AL=171 THEN
TOGGLE KML16:SAYI=16
ENDIF
      BIRLER=SAYI DIG 0
      ONLAR= SAYI DIG 1
      
      PORTB=240 | BIRLER
      LOW PORTB.5
      PAUSE 1
      HIGH PORTB.5
      PAUSE 1
    
      PORTB=240 | ONLAR
      LOW PORTB.4
      PAUSE 1
      HIGH PORTB.4
      PAUSE 2
pause 150
goto basla
SES:
SOUND BUZZER,[200,100]
RETURN

END


verici ünite

@ DEVICE pic16F628 'islemci 16F628
@ DEVICE pic16F628, WDT_on 'Watch Dog timer kapalı
@ DEVICE pic16F628, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF 'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off 'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'------------------------------------------------------------------------------
CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
OPTION_REG.7=0 'Dahili pull-up lar AKTF yapıldı ayrıca pull-up direncine gerek yok
TrisA=%00000000
TrisB=%00001000
PortB=%00000000
porta=%00000000
   
INCLUDE "MODEDEFS.BAS"
CIKIS   VAR PORTA.0
BUTON VAR PORTB.3
VER VAR BYTE
VER=99
SEROUT2 CIKIS,396,[REP$AA\5,REP$00\5,REP$FF\5]
BASLA:
IF BUTON=0 THEN
SEROUT2 CIKIS,396,["M",ver]
ENDIF
PAUSE 150
GOTO BASLA
END