Manchester decoding » History » Version 4

ABDALLAH, Hussein, 03/14/2016 10:33 PM

1 1 ABDALLAH, Hussein
h1. Manchester decoding
2 1 ABDALLAH, Hussein
3 1 ABDALLAH, Hussein
This part seems to be critical for a lot of workers in the Manchester code. To decode the signal we have several approaches with different benefices for each one.
4 1 ABDALLAH, Hussein
Some common steps are needed in all approaches;
5 1 ABDALLAH, Hussein
6 1 ABDALLAH, Hussein
•	We should Know or discover the data rate clock
7 1 ABDALLAH, Hussein
•	We should synchronize to the clock to separate a bit edge from a mid-bit transition
8 1 ABDALLAH, Hussein
•	Process the incoming stream and recover the data using the previous two steps
9 1 ABDALLAH, Hussein
•	Store this data for further processing
10 1 ABDALLAH, Hussein
11 1 ABDALLAH, Hussein
All these steps should be implemented in software taking into account that we have 2 options based on timing and sampling.
12 2 ABDALLAH, Hussein
13 2 ABDALLAH, Hussein
*Timing based Manchester code*
14 2 ABDALLAH, Hussein
15 2 ABDALLAH, Hussein
In this method, we detect the time between each transition coming from the demodulator circuit. To do this, we can use a micro-controller which contains an Input capture function. This function is used to deal with input signals in embedded systems (record time-stamp and set a flag indicating that an input has been captured). Moreover, it generates an interrupt, precise the time measurement and allow decision processing. To implement this method, we need the steps below;
16 2 ABDALLAH, Hussein
17 2 ABDALLAH, Hussein
1. Set up timer to interrupt on every edge
18 2 ABDALLAH, Hussein
2. Interrupt service routine ISR should flag the edge occurred and store count value 
19 2 ABDALLAH, Hussein
3. Start timer, capture first edge and discard this. 
20 2 ABDALLAH, Hussein
4. Capture next edge and check if stored count value equal 2T (T = ½ data rate) 
21 2 ABDALLAH, Hussein
5. Repeat step 4 until count value = 2T (This is now synchronized with the data clock) 
22 2 ABDALLAH, Hussein
6. Read current logic level of the incoming pin and save as current bit value (1 or 0) 
23 2 ABDALLAH, Hussein
7. Capture next edge 
24 2 ABDALLAH, Hussein
	a. Compare stored count value with T 
25 2 ABDALLAH, Hussein
	b. If value = T 
26 2 ABDALLAH, Hussein
		● Capture next edge and make sure this value also = T (else error) 
27 2 ABDALLAH, Hussein
		● Next bit = current bit 	
28 2 ABDALLAH, Hussein
		● Return next bit
29 2 ABDALLAH, Hussein
        c. Else
30 2 ABDALLAH, Hussein
		 if value = 2T 
31 2 ABDALLAH, Hussein
		● Next bit = opposite of current bit 
32 2 ABDALLAH, Hussein
		● Return next bit
33 2 ABDALLAH, Hussein
        d. Else 
34 2 ABDALLAH, Hussein
		● Return error 
35 2 ABDALLAH, Hussein
8. Store next bit in buffer 
36 2 ABDALLAH, Hussein
9. If the desired number of bits is decoded; exit to continue further processing 
37 2 ABDALLAH, Hussein
10. Else set current bit to next bit and loop to step 7
38 2 ABDALLAH, Hussein
It should also be noted that the timer’s value will not be exactly matched to T or 2T times.
39 3 ABDALLAH, Hussein
40 3 ABDALLAH, Hussein
!Timing_Manchester.jpg!
41 4 ABDALLAH, Hussein
42 4 ABDALLAH, Hussein
*Sampling based Manchester code*
43 4 ABDALLAH, Hussein
44 4 ABDALLAH, Hussein
In this method, we will sample and buffer the state at a certain rate (A), much higher than the message data rate. This needs more memory but allows less critical time to the processor to do intensive tasks.
45 4 ABDALLAH, Hussein
Sampling is made by defining  timer to interrupt and storing the state of the pin in a long buffer.
46 4 ABDALLAH, Hussein
47 4 ABDALLAH, Hussein
The software is implemented below
48 4 ABDALLAH, Hussein
49 4 ABDALLAH, Hussein
1. Set up timer to interrupt every 2T / S
50 4 ABDALLAH, Hussein
2. SR routine should check and store the state of the microcontroller pin (1 or 0) 
51 4 ABDALLAH, Hussein
3. Repeat step 2 for desired number of bits * S occurrences 
52 4 ABDALLAH, Hussein
4. Process through the captured buffer counting the number of consecutive ones or zeros 
53 4 ABDALLAH, Hussein
5. When the next logic value changes 
54 4 ABDALLAH, Hussein
	a. Check if count >= (S/2); Then skip to step 6 
55 4 ABDALLAH, Hussein
	b.Else reset count and loop to step 4 
56 4 ABDALLAH, Hussein
6. Set current bit = logic value in buffer currently pointed too 
57 4 ABDALLAH, Hussein
7. Reset count and count to the next logic change 
58 4 ABDALLAH, Hussein
	a. Compare count with (S/2) 
59 4 ABDALLAH, Hussein
	b. If count < (S/2) 
60 4 ABDALLAH, Hussein
		● Reset and count to next logic change 
61 4 ABDALLAH, Hussein
		● Make sure count also < (S/2) 
62 4 ABDALLAH, Hussein
		● Next bit = current bit 
63 4 ABDALLAH, Hussein
		● Store next bit in data buffer
64 4 ABDALLAH, Hussein
	 a. Else if count >= (S/2) 
65 4 ABDALLAH, Hussein
		● Next bit = opposite of current bit 
66 4 ABDALLAH, Hussein
		● Store next bit in data buffer 
67 4 ABDALLAH, Hussein
	a. Else 
68 4 ABDALLAH, Hussein
		● Return error 
69 4 ABDALLAH, Hussein
8. Loop to step 7 until completely through captured data 
70 4 ABDALLAH, Hussein
9. Exit for further data processing