PBP&Manchaster Code

Başlatan alayli, 02 Haziran 2004, 10:36:26

alayli

Arkadaşlar PBP ile iki PIC arasında, manchaster kodlama rutini kullanarak seri haberleşme yapan oldu mu? Yada PBP ile bu yöntemle yapılmış bir çalışma notu örnek kod bilen var mı?
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

z

PIC donanım olarak manchester kodunu desteklemiyor. Bu durumda
düşük hıza katlanıp yazılımla yapabilirsiniz.

Bir başka çözüm de Tx - Rx pinlerine dönüştürücü bağlamak olacaktır.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

alayli

@bunalmis

İlginize teşekkurler. Mancherter i PIC lerin donanımsal olarak desteklemediğini biliyorum. Hız benim için çok da önemli değil. Hatta RF data transferi düşündüğüm için çok fazla hız işime gelmez.

Ama şu ilginç geldi....

"Bir başka çözüm de Tx - Rx pinlerine dönüştürücü bağlamak olacaktır." demişsiniz. RS 232 ile manc. rutini arasında dönüşüm yapan bir entegre var mı bildiğiniz?
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

kesmez

Yahı arkadaşlar hep duyarız şu manchester ismini bir bilen varsa yazsa şu manchester formatı hakkında bir şeyler..
"İnned dine indallahil İslam" (2-19)

mmengi

sevgili arkadaşlar manchester ile ilgili olarak proton+ ile yapılmış bir örnek var hatta bu kodu proteus ta simüle edebilirsiniz. Ben bu yöntemi pek kullanmadım bunun yerine daha basit yöntemlerlede data aktarımı yapmak mümkün.bu sistemde 1 olan bitler "1-0" ve 0 olan bitler "0-1" şeklinde bir tanımlama ile gönderiliyor. bu örnek sadece encode ve decode işlemini artı crc yi hesaplıyor.transmit size kalmış istediğiniz hızda aktarım yapabilirsiniz.


' Manchester ENCODE and DECODE, as well as CRC caulculator

		Include "PROTON_G4.INT"				' Use an INTERNAL FONT
        
        Dim ENCODER_LOOP as Byte
        Dim CRC_LOOP as ENCODER_LOOP
        Dim TempVar as Byte
        Dim EncodedWord as Word
        Dim ERROR_FLAG as Bit       
        Dim CRC_OUT as Word
 		Dim CRC_IN as Byte
        
        Dim Y as Byte
		      
        Symbol CRCPolynomial = $1021 		' CRC-CCIT
        
        TempVar = %10001001
        Cls

        For Y = 0 to 255
            TempVar = Y
        	Print at 1,1,"TEMPVAR ", bin8 Tempvar
            Gosub Encode					' MANCHESTER ENCODE the value held in TEMPVAR. Result in ENCODEDWORD
        	Print at 2,1,"ENC ", bin16 ENCODEDWORD
        	Gosub Decode					' MANCHESTER DECODE the value held in ENCODEDWORD. Result in TEMPVAR
			Print at 5,1,"ERROR ",DEC ERROR_FLAG
        	CRC_IN = TempVar

            Gosub Calc_CRC					' Calculate a CRC of variable X. Result in CRC.HIGHBYTE
        	Print at 3,1,"CRC " , bin8 CRC_OUT
            
            CRC_IN = CRC_OUT.highbyte
        	Gosub Calc_CRC					' Calculate the CRC of variable X. Result in CRC.Lowbyte
        	
            Print at 4,1,"RESULT " , @CRC_OUT.lowbyte
        	Delayms 400
        Next
        Stop
'--------------------------------------------------------------------------------------------------
' Manchester Encode The byte value in TEMPVAR, and place the result in WORD variable ENCODEDWORD
' Note that:
' 1. TEMPVAR is the byte we want to encode
' 2. We will encode it into a 16 bit word, the low byte will contain the lower nibble of the encoded
' variable; ' the high byte will contain the upper nibble of the encoded variable
' 3. A "0" will be equated to a 0-1 transition
' 4. A "1" will be equated to 1-0 transition
' 5. The below subroutine will encode each 8-bit byte to a 16-bit word with an equal number of 1's and 0's.
' Run length is 1. The upside is that this is perfect for DC balancing the receiver's bit slicer. The
' downside is that this results in doubling the bandwidth.

Encode:
        EncodedWord = 0
        Clear ENCODER_LOOP
        Repeat
			EncodedWord = EncodedWord << 2
            EncodedWord.0 = 1				' Default to Bit = 1
			EncodedWord.1 = 0
            If TempVar.0 = 0 Then 			
                EncodedWord.0 = 0			' Bit = 0
				EncodedWord.1 = 1					
			Endif	
            TempVar = TempVar >> 1
        	Inc ENCODER_LOOP
        Until ENCODER_LOOP > 7
        Return
'--------------------------------------------------------------------------------------------------
' Note that:
' 1. We will decode ENCODEDWORD (lower byte) as the lower nibble of TEMPVAR
' 2. ENCODEDWORD ( high byte) as the upper nibble of TEMPVAR
' 3. ERROR_FLAG will return SET is an invalid value was found i.e. 1-1 or 0-0 together

Decode:
        Clear ENCODER_LOOP
        Clear ERROR_FLAG
        Repeat
			TempVar = TempVar << 1
            If EncodedWord.0 = 0 Then If EncodedWord.1 = 1 Then	TempVar.0 = 0	' bit = 0
			If EncodedWord.0 = 1 Then If EncodedWord.1 = 0 Then	TempVar.0 = 1	' bit = 1
        	If EncodedWord.0 = 0 Then If EncodedWord.1 = 0 Then	Set ERROR_FLAG	' error in bit decode
            If EncodedWord.0 = 1 Then If EncodedWord.1 = 1 Then	Set ERROR_FLAG	' error in bit decode
            EncodedWord = EncodedWord >> 2
            Inc ENCODER_LOOP
        Until ENCODER_LOOP > 7
        Return
'--------------------------------------------------------------------------------------------------
' Calculate BYTE CRC; 16 bit crc based on CCIT polynomial
' Note:
' 1. The CRC polynomial was given in the Constant definition. Note that there is a plethora of material
' available on the internet about CRC calculations and the various polynomials used.
' 2. Caveat here: At the end of the CRC calculation on the transmitted data, the sum of the decoded CRC
' must equal to "0". If the resulting CRC calculation is NOT 0 then there was a transmission error. Pay
' attention to the order in which you calculate the CRC when you transmit AND the order in which you
' calculate the CRC when you receive. Also when you transmit the CRC byte, remember to transmit
' High byte first. For further information, look at the below code.

Calc_CRC: 
		CRC_OUT = (CRC_IN * 256) ^ CRC_OUT
		Clear CRC_LOOP
        Repeat			
            ROL CRC_OUT , CLEAR           
            If STATUS.0 = 1 then 
                CRC_OUT = CRC_OUT ^ CRCPolynomial                
            Endif
            Inc CRC_LOOP
        Until CRC_LOOP > 7
		Return

        Include "FONT"

mmengi

PBP ile yapılmış encode ve decode rutini.

PBP ile ilgili olarak bu adreste arama yaptırırsanız çok şey bulabilirsiniz.

http://list.picbasic.com/cgi-bin/board-search.cgi

inbyte VAR BYTE ' Outgoing data byte to encode 
outword VAR WORD ' Encoded version of inbyte ready to send 
inword VAR WORD ' Incoming data to decode 
outbyte VAR BYTE ' Decoded version of inword 
X VAR BYTE ' GP var 

Encode: ' Load inbyte with byte to encode. Then call this routine 
For X = 0 to 7 ' loop once for each bit 
outword.0[(X<<1)+0] = ~inbyte.0[X] ' translate 0 to 01 and 1 to 10 
outword.0[(X<<1)+1] = inbyte.0[X] 
Next X 
Return 

Decode: ' Receive encoded data in inword. Then call this routine to decode. 
For X = 0 to 7 ' loop once for each bit 
outbyte.0[X] = ~inword.0[X<<1] ' translate 01 to 0, and 10 to 1 
Next X 
Return

kesmez

Bu çeşit bir kodlama yani "1" den "0" a geçiş ve "0" dan "1" e geçiş modulasyon kalitesini artırmaya yönelik olabilir...
Bu şekilde örneğin 10 adet "1" göndereceğiniz yere 10 adet "1" ve 10 adet "0" gönderirsiniz..
veya alıcı devrede yanlış bilgi girişini engellemek içinde olabilir.. nasıl lcd ler "1" den sıfıra geçişte girişi data olarak değerlendiriyorlar , öyle bişey..
"İnned dine indallahil İslam" (2-19)

alayli

@mmengi
arkadaşım ilgine teşekkürler. Proton+'ın sample'ları arasında foruma gönderdiğin kodları ben de gördüm ve inceledim. Fikir vermesi açısından çok da yararlı oldu. Ama benim CRC'ye (yanlış hatırlamıyorsam açılımı "cyclic reduntancy check" idi.) ihtiyacım yok. Daha sade bir kodlama yapmayı düşünüyorum. Programladığım her TX ve RX entegreye bir "unique ID" vermek ve bunu EEprom'a yazmak şu an elimdeki proje için daha avantajlı...
@kesmez
İnsan ihtiyaç duyunca her şeyi merak edip, araştırıp, bulup öğreniyor. 2 gün öncesine kadar ben de sadece adını duymuştum. Şu an projem bitmek üzere. Aşağıdaki linkte bulduğum pdf fazlasıyla yararlı  oldu.
http://ww1.microchip.com/downloads/en/AppNotes/91045a.pdf
Yine de konuya ilgi duyan arkadaşlar için söyleyabileceğim mancherter kodlamada bizim alışageldiğimiz -1-, -0- mantığı farklı.
TE olarak tanımlanan bir birim zaman tayin ediyoruz.
1/2 TE -0-; 1/2TE -1- şeklindeki bir sıralama dijital sıfır'a,
1/2 TE -1-; 1/2TE -0- şeklindeki bir sıralama dijital bir'e denk geliyor.
ayrıca paket gönderimiyle ilgili microchip'in KEELOQ entegrelerinde belirlediği bir standart yapı var.
Daha fazla ayrıntı için yukarıdaki pdf çok yararlı olacaktır. (En azından PIC+manchester uygulamaları için)
Herkese tekrar teşekkür...
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

z

Bu kodlamanın asıl amacı data ve clock'un aynı hattan gonderilmesini sağlamasıdır.

Aynı hızdaki klasik data transferine göre iki kat daha fazla band genişliği ister.

Hatırlarsanız RF, IR gibi iletişimlerde sürekli 1 yada sürekli 0 yollayamıyor ve modülasyon yapmamız gerekiyordu.

Bu kodlamada 1 bilgisi 10 olarak, 0 bilgisi de 01 olarak gönderilir. Dolayısı ile sabit 1 yada 0 treni yollasanız bile bu kodlama sonucunda sürekli hareket halinde  bitler yollanmış olur.

TX-RX hattına bağlanan hazır IC varmı bilmiyorum. Ben kendinizin devre kurabileceğinizi demek istemiştim.

Basit bir mantık

Bir osc yaparsın. Osc olabildiğince kararlı ve baudrate hızında çalışır.
TX hattının 1 ve 0 olan kenarlarında osc yı senkron yapacak şekılde düzenlersin böylece frekansın uzun vadede kaymasını engellersin.
(Xtal kontrollu bir osc/bölücü daha yakışıklı olur.)

TX=1 ise Manch= TX
TX=0 ise Manch=!TX

Fazla kafa yormadım ama çalışacak gibi görünüyor.

RX kısmı biraz karışık olabilir. PLL çözümü yanısıra MMV (monostable multivibrator) lerle de çözüm getirilebilir.

Sadece fikir verdim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

OG

FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

Klein

Alıntı yapılan: "bunalmis"

RX kısmı biraz karışık olabilir. PLL çözümü yanısıra MMV (monostable multivibrator) lerle de çözüm getirilebilir.

Sadece fikir verdim.
Eğer donanı olarak yapmaksa kastınız. ve baudrate sabit değilse evet haklısınız. karmaşık olabilir. aama baudrate sabit ise  bir monostable ve d type flip flop ile çözülür. software ile zaten sorun yok. çok basit.

mp3dragon

Philips RC5 uzaktan kumanda sinyali ve S/PDIF digital Audio sinyali Manchester kodlama kullanır. İnternette aratırsanız çok sayıda örnek kod ve uygulama bulunur. Eğer hız önemli değilse Philips SAA3010 entegresini  donanımsal olarak transmit için kullanabilirsiniz. Alıcı için SAA3009 var ama piyasada bulabileceğinizi sanmıyorum. (İstanbul da bulunabilir belki)
İyilik Yap, Denize At, Balık Bilmezse, Halik Bilir.