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ı?
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.
@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?
Yahı arkadaşlar hep duyarız şu manchester ismini bir bilen varsa yazsa şu manchester formatı hakkında bir şeyler..
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"
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
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..
@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...
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.
Asm için örnek: http://www.winpicprog.co.uk/pic_tutorial12.htm
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.
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)