PDA

View Full Version : Weird code problem



Navaidstech
- 15th March 2009, 06:39
OK... I'm about to give birth to a cow here. I've been at this for a few hours now and still can't find where the problem lies. Call it a brain fart or a senior moment or....

This is a simple transmit routine that takes an array of letters, converts them to Manchester code and the spits them out a serial port.


COUNTERA var Byte
COUNTERB var byte

TRANSMIT var Byte
MYDATA var byte [9]
MYDATACTR var byte
MANCHESTERWORD var Word
Encoded var word
BYTECTR var byte
DataPort var PortB.0
EncodedData var word [4]


START:

mydata [0]= "T"
mydata [1]= "E"
mydata [2]= "S"
mydata [3]= "T"
mydata [4]= "."


for mydatactr=0 to 4

transmit = mydata [MYdatactr]
gosub encodemanchester ' take the transmit variable and convert it to Manchester (EncodedData word)
serout2 dataport,17197, [encodeddata.highbyte[mydatactr]]
serout2 dataport,17197, [encodeddata.lowbyte[mydatactr]]

So far so good. With the array "TEST." the serial port is spitting out
99 9A 9A 99 99 A5 99 9A A6 56 in HEX, which is a correct Manchester
conversion.

next mydatactr


FOR COUNTERB=0 TO 1
serout2 dataport,17197, [$55,$55,$55,$55,$55,"STA"] ' send preamble
for mydatactr=0 to 4
serout2 dataport,17197, [encodeddata.highbyte[mydatactr]]
serout2 dataport,17197, [encodeddata.lowbyte[mydatactr]]

This is where it gets weird. The EncodedData array has not been tinkered in
any way (I don't see where) yet the serial port is now spitting out
99 9A A5 99 9A A5 56 9A A6 56 .... WTH??????

Notice the first two and last two bytes did not change but the stuff in the middle has.... what am I missing here?

next MYDATACTR
pause 100
NEXT COUNTERB

pause 3000
goto start

EncodeManchester:
manchesterword=0

For BYTECTR=0 TO 7
If transmit.0=1 then
ManchesterWord.14=1
else
ManchesterWord.15=1
endif

If bytectr<7 then ManchesterWord=ManchesterWord>>2
transmit=transmit>>1
Next BYTECTR

encodeddata.lowbyte[mydatactr]=manchesterword.lowbyte
encodeddata.highbyte[mydatactr]=manchesterword.highbyte

Return






The above Manchester conversion routine and the one supplied by Ioannis produce the same result.

Any help would be greatly appreciated.... BTW, I'm using MCS 2.1.0.6 with PBPPro 2.46.
Thanks!!!

Bruce
- 15th March 2009, 16:09
EncodedData var word [4] should be EncodedData var word [5]

2 bytes are needed for each byte conversion to manchester.

What's happening is you're corrupting RAM by going out-of-bounds
in your EncodedData array.

Navaidstech
- 15th March 2009, 16:42
Thank you for the reply Bruce...


EncodedData var word [4] should be EncodedData var word [5]

You mean you can't use a zero for an array pointer?


2 bytes are needed for each byte conversion to manchester.

Right... and I thought the conversion routine did just that. Am I missing anything besides the improper definition of the EncodedData array?

Bruce
- 15th March 2009, 17:05
With EncodedData var word [4] you have 4 words total in the array.

EncodedData[0]
EncodedData[1]
EncodedData[2]
EncodedData[3]

Now with;

mydata [0]= "T"
mydata [1]= "E"
mydata [2]= "S"
mydata [3]= "T"
mydata [4]= "."

If each byte in mydata gets encoded as 2 bytes, you're going to need more
than 4 words or 8 bytes to store your encoded data in.

So, when mydatactr is 4, and you jump to your encode routine;

encodeddata.lowbyte[mydatactr]=manchesterword.lowbyte
encodeddata.highbyte[mydatactr]=manchesterword.highbyte

It's placing the encoded value outside your EncodedData word array. I.E. you
now have two bytes of data in RAM out-of-bounds of your array.


You mean you can't use a zero for an array pointer?
You can, but you need to make sure you don't exceed the array boundary.

A 4 word array only goes from 0 to 3. Not 0 to 4.

Navaidstech
- 15th March 2009, 19:54
You can, but you need to make sure you don't exceed the array boundary.

A 4 word array only goes from 0 to 3. Not 0 to 4.

I see... I had incorrectly assumed it goes from 0 to 4. Duly noted.
I will give it a try and report back...

thank you for the pointers...

Alex

Navaidstech
- 16th March 2009, 11:16
Bruce...

that did it! The transmitter now spits out good data.
In addition to the increase in the array size, I also had to make the following change from:


EncodedData var word [5]


To:

EncodedDataLow var Byte [5]
EncodedDataHigh var byte [5]

For some reason the splitting the manchester word into EcodedData.LowByte and EncodedData.Highbyte didn't quite work, and so I ended up creating sepatate bytes for the high and low ends of the manchester word.
Not sure why it didn't work in the first place but it doesn't matter now. I might revisit this issue at a later date.

Thank you for steering me in the right direction. This would have never crossed my mind - must be a habit from my old QBasic programming days.

:)

Alex