Picproje Elektronik Sitesi

DERLEYİCİLER => PICBasic => Konuyu başlatan: alayli - 02 Haziran 2004, 10:36:26

Başlık: PBP&Manchaster Code
Gönderen: alayli - 02 Haziran 2004, 10:36:26
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ı?
Başlık: PBP&Manchaster Code
Gönderen: z - 02 Haziran 2004, 11:04:00
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.
Başlık: PBP&Manchaster Code
Gönderen: alayli - 02 Haziran 2004, 12:07:16
@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?
Başlık: PBP&Manchaster Code
Gönderen: kesmez - 02 Haziran 2004, 22:35:21
Yahı arkadaşlar hep duyarız şu manchester ismini bir bilen varsa yazsa şu manchester formatı hakkında bir şeyler..
Başlık: PBP&Manchaster Code
Gönderen: mmengi - 03 Haziran 2004, 03:05:40
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"
Başlık: PBP&Manchaster Code
Gönderen: mmengi - 03 Haziran 2004, 03:12:39
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
Başlık: PBP&Manchaster Code
Gönderen: kesmez - 03 Haziran 2004, 09:13:32
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..
Başlık: PBP&Manchaster Code
Gönderen: alayli - 03 Haziran 2004, 09:17:56
@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...
Başlık: PBP&Manchaster Code
Gönderen: z - 03 Haziran 2004, 10:12:51
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.
Başlık: PBP&Manchaster Code
Gönderen: OG - 15 Mayıs 2006, 03:45:15
Asm için örnek:  http://www.winpicprog.co.uk/pic_tutorial12.htm
Başlık: PBP&Manchaster Code
Gönderen: Klein - 15 Mayıs 2006, 11:12:30
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.
Başlık: PBP&Manchaster Code
Gönderen: mp3dragon - 15 Mayıs 2006, 11:47:34
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)